zagmatwane zadanie na początek kariery

0

Napisz program, który pobierze od użytkownika liczbę dodatnią (typu int) i narysuje falę o zadanej długości i wysokości 4 linijek, zgodnie z poniższym schematem (puste pola uzupełniaj spacjami):

   *      **         **        *
    *    *   *      *   *     *
     *  *      *   *     *   *
      **         **        **

CZY Ktoś wie jak się do tego rozsądnie zabrać bo czarami to raczej zbyt długo by było a jak użytkownik poda długość 20 albo 30 to z godzinę by szło to czarami tworzyć na pewno da nie szybciej ale nie mam pojęcia niestety ( dopiero początki )

2
Wojtek184r napisał(a):

bo czarami to raczej zbyt długo by było

Czarami to bardzo szybko. Tutaj trzeba pomyśleć

1

A czemu uważasz że czarami będzie za wolno? Zmierzyłeś już czas? Zrób jak umiesz a jak będzie za wolno to wtedy przyjdź tu z kodem

3

Nic nie będzie szło godzinę :) widzę 2 sposoby. Narysuj sobie na kartce w kratkę powiedzmy szlaczek długości te twoje 30.

  1. Popatrz na poszczególne linijki. Widzisz powtarzający się wzorzec? Na przykład w pierwszej masz znak, potem parę spacji, potem 2 znaki, potem parę spacji, potem znowu 1 i tak dalej. Jesteś w stanie napisać kod, który coś takiego wypisze na konsolę?
  2. Zrób w pamięci tablicę dwuwymiarową (prostokąt) o wymiarach takich jak szlaczek. Postaw "pionek" w lewym górnym polu (czyli w pamięci komputera - na przykład zmienne x=0 i y=0). Idziemy pionkiem 3x w dół po przekątnej, potem w prawo, potem w górę w prawo itd. Za każdym krokiem zaznaczamy w tablicy że tam byliśmy. Na koniec wypisujemy całą tablicę.
3

Nigdy tak nie robię ale masz gotowca bo i tak chciałem zobaczyć jak bym to zrobił...
W JavaScript mogłoby wyglądać to tak. https://jsfiddle.net/tnpm54du/

Da się to zrobić dużo optymalniej i chyba by nawet wypadało tak by było w jednej pętli - ale w sumie to nie dla mnie zadanie więc już powinieneś to zrobić samemu:-)

<html>

<body>
  <textarea id=poleTekstowe style='width:100%;height:200px;'></textarea>
  
  <script>
    function wave( width ){    
      //
      // Przygotowuję tablicę dwuwymiarową na obraz
      screen = new Array( width ) ;
      for ( var i=0; i < width; i++ ) {
        screen[i] = new Array(4)
        for ( var j=0; j < 4; j++) {
          screen[i][j] = ' ' ;
        }
      }
    
      //
      // Generuję falę
      var h = 0 ;
      var direction = 1 ;
      for ( i = 0 ; i < width ; i++ ) {
        screen[i][h] = 'x' ;
        h = h + direction ;
        if ( h == -1 ) { direction = 1 ; h = 0 }
        if ( h == 4 ) { direction = -1 ; h = 3 }
      }
      
      //
      // Składam wiersze tekstu    
      for ( var j=0; j < 4; j++) {
        var wiersz = '' ;
        for ( i = 0 ; i < width ; i++ ) {
          wiersz += screen[i][j] ;
        }      
        //
        // dodaję wiersz do pola tekstowego
        document.getElementById ( 'poleTekstowe' ).innerHTML += wiersz + "\r\n" ;        
      }
    
    }
  
  	//
    // tutaj uruchamiam jako parametr podając szerokość
    wave ( 40 );
  </script>

</body>

</html>
10
katakrowa napisał(a):

Nigdy tak nie robię ale masz gotowca bo i tak chciałem zobaczyć jak bym to zrobił...
W JavaScript mogłoby wyglądać to tak. https://jsfiddle.net/tnpm54du/

JS jest dla słabych :P
Rozwiązanie w Scheme:

(define (string-repeat n str) (apply string-append (vector->list (make-vector n str))))
(define (display-line n str) (display (string-repeat n str)) (newline))
(define (display-banner n) (begin 
  (display-line n "*      *")
  (display-line n " *    * ")
  (display-line n "  *  *  ")
  (display-line n "   **   ")
))
(display-banner (read))
1

W sumie zajęło mi to 36 minut w języku którego bardzo mało używam:

import sys

if len(sys.argv) < 2:
    print('Syntax <script> {wave-len}')
    exit()

wavelen = int(sys.argv[1])
wavehigh = 4
wavechar = '#'

y = 0
while y < wavehigh:
    print(' ' * y, end = '')
    x = y
    dirsgn = -1
    while x < wavelen:
        print(wavechar, end = '')
        if dirsgn < 0:
          spacelen = (wavehigh - y - 1) * 2
        else:
          spacelen = y * 2    
        print(' ' * spacelen, end = '')
        x += spacelen
        dirsgn = -dirsgn
    y += 1    
    print()

(W tym czasie zainstalowałem VS Code, Pythona i poczytałem tutoriale...)

7

Proste rozwiązanie w Javie, bez matematyki:

final String[] strings = new String[] {
	"X      X",
	" X    X ",
	"  X  X  ",
	"   XX   "
};
final int n = 3;		
for (final String str : strings) {
	for (int i = 0; i < n; i++) {
		System.out.print(str);
	}
	System.out.println();
}
4

"zagmatwane zadanie na początek kariery"

Jeśli to zadanie jest zagmatwane 1), to jaka będzie kariera?
Wyłudzanie "zróbcie to za mnie", jazda na plecach innych? Rączki w kieszeniach 29 dni w miesiącu, za wyjątkiem ostatniego przy kasie?

  1. a ja jestem chińskim biskupem
3

Jak nie umiesz szlaczka narysować to tak jakbyś w pierwszej klasie podstwówki sie zatrzymał, nie wróżę Ci kariery.

6

Pewnie w haskellu jest jakiś jednolinijkowiec

specjalnie dla @Shalom

main =  (\line -> (\n -> putStr $ unlines $ ((\string -> concat $ replicate n string) <$> ["*      *", " *    * ", "  *  *  ", "   **   "])) (read line :: Int)) =<< getLine

Wersja rozwlekła:

main :: IO ()
main =  do 
  line <- getLine 
  putBanner (read line :: Int)

putBanner :: Int -> IO ()
putBanner n = putStr $ unlines $ (replicated <$> v) 
  where 
    replicated :: String -> String
    replicated string = concat $ replicate n string

v :: [String]
v =
  [ "*      *"
  , " *    * "
  , "  *  *  "
  , "   **   "
  ]
0

W sumie fajnie jakby OP okreslil dla jakiej liczby podal output: 3, 24 a moze 30?

1

Super rozwiązania, szczególnie kod jednoliniowy Haskell :)

Ale fala

    "*      *"
  , " *    * "
  , "  *  *  "
    "   **   "

to ma długość
a) 1
b) 2
c) 6
d) 7
e) 8
f) inną?

Zainwestowałem 8 gwiazdek, a otrzymałem falę długości zaledwie 1 czy już długą na 8 jednostek (8 to zdecydowanie lepsza stopa zwrotu z gwiazdki)?

Zwracam uwagę na grzbiet ** (u mnie jest tylko dolinka **), to też ma znaczenie w liczeniu długości fali
Standardowe 'długość fali od grzbietu do grzbietu może nie być tym, o co chodzi, bo OP/klient podał przykładową długość 30 albo 40 to rozwiązania z nazwijmy to Sprite o stałych wymiarach nie są rozwiązaniem.
Czy chodzi może o niefortunnie nazwaną długość cyklu zdarzeń - falowania?
A może o wypełnienie terminala/ekranu gwiazdkami przez całą szerokość np. 80 znaków i ucięcie grafiki w tym miejscu fali gdzie wypada limit 80 znaków?

narysuje falę o zadanej długości i wysokości 4 linijek
użytkownik poda długość 20 albo 30

IMO fala o długości 80 i wysokości 4 powinna być sinusoidą od 0 do 12Pi
IMO fala o długości 40 i wysokości 4 powinna być sinusoidą od 0 do 2
2Pi
IMO fala o długości 20 i wysokości 4 powinna być sinusoidą od 0 do 4*2Pi
na ekranie o szerokości 80 gwiazdek

narysuje falę

Może jedna kompletna fala?

1
def print_pattern(pattern, width):
	for s in pattern:
		print(s * (width // len(s)) + s[0:(width % len(s))])
		
pattern = [
	"*      *",
	" *    * ",
	"  *  *  ",
	"   **   "
]

print_pattern(pattern, 20)

https://ideone.com/mY6IDP

0
MarekR22 napisał(a):
pattern = [
	"*      *",
	" *    * ",
	"  *  *  ",
	"   **   "
]

A jeżeli w zadaniu oczekuje się, że długość fali będzie podana a nie liczba fal, wtedy pattern na fix nie jest rozwiązaniem

program, który pobierze od użytkownika liczbę dodatnią (typu int) i narysuje falę o zadanej długości i wysokości 4 linijek

Falę o zadanej długości (długość pobrana od użytkownika)
Może jedna kompletna fala o zmiennej długości a nie kilka fal o stałej długości?

5

Fajne rozwiązania, podsyłam swoje w Kotlinie:

fun drukujFale() {
    print("""
*      **         **        *
 *    *   *      *   *     *
  *  *      *   *     *   *
   **         **        **
""")
}
4

Bookmarkuje sobie ten wątek.

Na wypadek, jakby ktoś kiedyś napisał, że w wojsku programowaniu nie ma fali.

Dręczenie kotów jest, jak widać, uniwersalne.

2
Charles_Ray napisał(a):

Fajne rozwiązania, podsyłam swoje w Kotlinie:

fun drukujFale() {
    print("""
*      **         **        *
 *    *   *      *   *     *
  *  *      *   *     *   *
   **         **        **
""")
}

ja prześle rozwiązane w moim ulubionym języku - Groovy.

 def drukujFale() {
     print("""
 *      **         **        *
  *    *   *      *   *     *
   *  *      *   *     *   *
    **         **        **
 """)
 }
3

W wielu agencjach programista używa Photoshopa do 'programowania stron', więc pora na zaprezentowanie też takiego rozwiązania. Photoshop narzędziem nie gorszym od innych i używają go też bardzo kreatywni ludzie, projektujący na poziomie jaki się programistom-front-end nie śnił.

2
BraVolt napisał(a):
MarekR22 napisał(a):
pattern = [
	"*      *",
	" *    * ",
	"  *  *  ",
	"   **   "
]

A jeżeli w zadaniu oczekuje się, że długość fali będzie podana a nie liczba fal, wtedy pattern na fix nie jest rozwiązaniem

program, który pobierze od użytkownika liczbę dodatnią (typu int) i narysuje falę o zadanej długości i wysokości 4 linijek

main :: IO ()
main =  do 
  line <- getLine 
  putBanner (read line :: Int)

putBanner :: Int -> IO ()
putBanner n = putStr $ unlines $ (lineBy <$> [0..3])
  where 
    lineBy i = (!! i) <$> take n inf

inf :: [String]
inf = cycle
  [ "*   "
  , " *  "
  , "  * "
  , "   *"
  , "   *"
  , "  * "
  , " *  "
  , "*   "
  ]

i wersja jednolinijkowa

main =  (\line -> (\n -> putStr $ unlines $ ((\i -> (\l -> l!!i) <$> take n (cycle [ "*   ", " *  ", "  * ", "   *", "   *", "  * ", " *  ", "*   "])) <$> [0..3])) (read line :: Int)) =<< getLine

i dla 80 dostaniemy:

*      **      **      **      **      **      **      **      **      **      *
 *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    * 
  *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *  
   **      **      **      **      **      **      **      **      **      **   

Falę o zadanej długości (długość pobrana od użytkownika)
Może jedna kompletna fala o zmiennej długości a nie kilka fal o stałej długości?

Jeśli przez OP ma na myśli prawdziwą długość fali to nie chce mi się myśleć już dziś.

0

drukujFale - lepszych nazw chyba nie było :D

2

[print(''.rjust(i) + ''.rjust(2 * i).join([''.rjust(6 - 2 * i).join(['*'] * 2)] * n)) for i in range(4)]
#PythonForLife

3

Ale ze w tym watku jeszcze C sie nie pojawilo?

int main(int _, char *__[]) {
    for(*(*__)=0;*(*__)<4;*(*__)+=1) {
        for(*(*(__)+1)=0;*(*(__)+1)<atoi(*(__+1))*8;*(*(__)+1)+=1) {
            putchar((*(*(__)+1)%8)==*(*__)||((*(*(__)+1))%8)==(7-(*(*__)))?42:20);
        }
        putchar('\n');
    }
}
1

Jak rysować gwiazdki to przecież bash

function waves(){
> echo -e '*      *\n *    * \n  *  *  \n   **   '
> }
root@a9dd4d1d0fa8:/# waves
*      *
 *    * 
  *  *  
   **   
root@a9dd4d1d0fa8:/# 

1 użytkowników online, w tym zalogowanych: 0, gości: 1