Gorliwy „Szybki Brązowy Lis” „Skoczył” wzdłuż Groovy Spiral

12

Wprowadzenie

Napisz program, który wyświetli wychodzącą spiralę słynnego pangram zgodnie z podanymi zasadami.

Wyzwanie

Pangram to zdanie stosując każdą literę alfabetu danego przynajmniej raz. Jednym z najbardziej znanych pangramów jest ten, który jest szeroko stosowany w przeglądarce czcionek Windows, a mianowicie: „ Szybki brązowy lis przeskakuje nad leniwym psem ”. Wyzwanie polega na utworzeniu spirali na podstawie tego tekstu.

Twoim zadaniem jest wydrukowanie dokładnie tego tekstu:

heeeeellllllllllllazzzzzzzzzzz
hummmmmmmmmmmmmppppppppppppppy
hubrrrrrrrrrrrrrrrrrrooooooosy
hukyddddoooooooooooooooggggwsy
hukyveeeeerrrrrrrrrrrrrrrrtwsy
hukyvxjjjjjjjjjjuuuuuuuuuttwsy
hukyvxkbbrrrrrrrrrrrrrrrmttwsy
hukyvxkogggggggttttttttomttwsy
tukyvokoellllllllllllahomttwsy
tukyvokoeovvvvvvvvvvvzhomttwsy
tukyvocoeoummmmmmmmmezhomttwsy
tukyvocoeoufooooooopezhomttwsy
tukyvocohoufroooooxpezhomttwsy
tukyvoiohoufrquuuwxpezhomttwsy
tucyvoiohoufbqttiwxpezhomttwsy
tucyvoiohoufbeehiwxprzhomttwsy
tucyvoiohoufkccciwxprzeomttwsy
tjiyvoidhounnnnnnwxprzeomttwsy
tjiyvoidhojjjjjjjjxprzeomttwsy
tjiyvoidhssssssssssprzeopttwsy
tjiyvoidttttttttttttrzeopttwsy
tjiyvoiyyyyyyyyyyyyyyzqopttwoy
tjiyvouuuuuuuuuuuuuuuuqwpttwoy
tjiyvffffnnnnnnnnnnnnnnwpttwoy
tjiyossssssssssssssssssspthwoy
tjizzzzalllllllllllleeeeehhwoy
tjuuqqqqqqqqqqqqqqqqqeeeeehnod
txxxxxoooooooooooooooffffffnod
reeeeevvvvvvvvvvvvvvvvvvvvvvod
       gggggggoooooooooooooood

Oto jak jest generowany,

  • Był gorliwy lis, który lubił pangram „Szybki brązowy lis skacze nad leniwym psem”. Pewnego dnia znalazł się w centrum zewnętrznej spirali i postanowił wskoczyć w nią i malować dalej.
  • Chciałby przejść przez pangram od początku do końca, a jeśli litera jest n-tą literą w alfabecie, chciałby ją pomalować n razy.
  • Jednak lis nie był zbyt dobry w pokonywaniu zakrętów, więc po dotarciu do każdego rogu musiał się zatrzymać i przejść do następnej litery.
  • On również postanowił powtórzyć trzykrotnie pangram podkreślić, że jest Szybki brązowy lis.
  • Twoim zadaniem jest pokazanie, jak wyglądałaby spirala po tym, jak lis pomalował wszystkie te litery.

(Zwykła wersja bez opowiadania historii)

  • Słynny pangram „Szybki brązowy lis przeskakuje nad leniwym psem” powtarza się trzy razy, z usuniętymi spacjami i wszystkimi literami, aby wygenerować

    thequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydog
    
  • Spirala zaczyna się od środka i zaczyna się na literę „t”, zaczyna się od prawej strony i wychodzi na zewnątrz zgodnie z ruchem wskazówek zegara. Jeśli bieżącym znakiem jest n-ta litera alfabetu, to za każdym razem przechodzi do następnego znaku

    • spirala osiąga róg, lub
    • bieżące litery są drukowane dokładnie n razy.

Aby lepiej to zilustrować, wyjaśnię, w jaki sposób generowana jest spirala związana z pierwszymi trzema słowami „szybki przegląd”.

 rooooo
 rquuuw
 bqttiw
 beehiw
 kccciw
nnnnnnw

Lis zaczyna się od „t”, idzie w prawo, dociera do pierwszego rogu, maluje go za pomocą „t”, a następnie przechodzi do „h” i schodzi w dół, dociera do drugiego rogu, przełącza się na „e” i idzie w lewo, dociera do Trzeci róg, przełącza się na „q” i idzie w górę, osiąga 4. róg, przełącza się na „u” i idzie w prawo, osiąga róg i przełącza się na „i”, schodzi w dół, osiąga róg i przełącza na „c”, idzie w lewo, z powodzeniem maluje 3 „c” przed osiągnięciem następnego rogu , przełącza się na „k” i przechodzi w lewo , dociera do rogu od razu, przełącza się na „b” i idzie w górę, maluje 2 „b” s przed osiągnięciem następny róg przełącza na „r”i idzie w górę , dochodzi do rogu i przełącza się na „o”, idzie w prawo, a następnie „w”, w dół, „n”, w lewo.

Okular

  • Możesz wziąć opcjonalne dane wejściowe, które zawierają dowolną standardową postać ciągu

    thequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydog
    
  • Dane wyjściowe muszą być sformatowane jako ciąg i muszą przejść do STDOUT zamiast plików lub STDERR, z nowymi wierszami umieszczonymi poprawnie. Nagłówek i końcowe puste linie nie mają znaczenia. Dozwolone są nagłówki i spacje w każdej linii, ale muszą być spójne. Więc jeśli dodasz 5 spacji przed jednym wierszem danego tekstu, musisz dodać dokładnie 5 spacji przed każdym wierszem, aby spirala wyglądała tak samo.

  • To jest , najniższa liczba bajtów wygrywa.

  • Jak zwykle obowiązują tutaj domyślne luki .


Wyjaśnienia są mile widziane, choć nie są konieczne.

Tytuł został zredagowany, by uczynić go pangramem dla komentarza Caira coinheringaahing.

Leniwy pies jest zbyt leniwy, aby pojawić się w historii.

Dążę do stworzenia wyzwania łańcuchowego, w którym litery do wyjścia nie można obliczyć za pomocą prostych funkcji współrzędnych.

Weijun Zhou
źródło
2
Szkoda, że ​​tytuł nie jest pangramem
caird coinheringaahing
@cairdcoinheringaahing Dobra uwaga, postaram się wymyślić jeden. Jakieś sugestie?
Weijun Zhou,
4
@cairdcoinheringaahing Zaktualizowano
Weijun Zhou
Drobny punkt: czy „h” w pierwszym „the” nie powinno się powtarzać dwa razy, a nie „t”?
mudkip201
@ mudkip201 Róg jest pomalowany oryginalną literą przed przejściem do następnego znaku. Może powinienem to wyjaśnić.
Weijun Zhou

Odpowiedzi:

5

Stax , 35 34 33 32 bajty

é╛îá%ⁿ┌○iê}→Ug=╩◙╘Ç⌐)QX↑L╓₧╗▌╧▬q

Uruchom i debuguj online

Stax to język, nad którym pracuję od około 6 miesięcy. To pierwszy publiczny golf z nim. Przejdźmy do interesów.

Stax jest zwykle zapisywany w drukowanym zestawie znaków ASCII. To 34-bajtowe przesyłanie jest pakowane w wariant zestawu znaków CP437. Odpowiednia reprezentacja ascii to

't],{]_96-*~cHT,+nh%^(XUs&xH{rM}MF|<mr

Stax jest językiem stosowym, ale ma dwa stosy danych: „główny” i „wejściowy”. Większość operacji używa głównego stosu, ale dane wejściowe zaczynają się na stosie wejściowym. Instrukcje stax to przeważnie jedna lub dwie znaki sekwencji ascii. Większość z nich jest przeciążona, co oznacza, że ​​ich zachowanie zależy od kilku najwyższych wartości na stosie.

Na wysokim poziomie program ten tworzy siatkę, wielokrotnie dodając ciągi znaków do ostatniego wiersza. Gdy ostatni rząd zapełni się, obraca siatkę zgodnie z ruchem wskazówek zegara. Na koniec odzwierciedla siatkę poziomo. Bardziej szczegółowo, program działa w ten sposób.

't],{]_96-*~cHT,+nh%^(XUs&xH{rM}MF|<mr
't]                                         ["t"]
   ,                                        Pop from input, push to main ("thequick...")
    {                            F          For each character in input, execute block...
     ]_96-*                                 Produce string using character appropriate
                                                number of times (a=1, b=2, etc)
           ~                                Pop from main, push to input for use later
            cH                              Copy last row from grid.
              T                             Right-trim whitespace
               ,+                           Pop from input stack and append
                 nh%                        Get the width of the first row of the grid
                    ^                       Add 1
                     (                      Right-pad/truncate string to this length
                      X                     Store in the x register
                       Us&                  Overwrite last row of the grid with new value.
                          xH                Get the last element from x.
                                                Basically, the lower right corner.
                             {  }M         Conditionally execute block.  This will happen 
                                                when the bottom right corner isn't a space.
                              rM            Reverse and transpose (aka rotate clockwise)
                                  |<        Left-justify grid; give all rows equal size.
                                     m      For each row, execute the rest of the program
                                               and then print the result to output
                                      r     Reverse the row
rekurencyjny
źródło
Wow, jestem naprawdę zaskoczony, że wyzwanie to po raz pierwszy pojawi się w grze w golfa dla języka golfowego. Bardzo dziękuję za wsparcie! Interesujesz się językiem miesiąca? Mam nadzieję, że zobaczę więcej użytkowników korzystających z niego i że wkrótce pojawi się na liście kandydatów!
Weijun Zhou
@WeijunZhou: Masz na myśli to ? Do tej pory nie wiedziałem, że to jest coś. Nie miałbym nic przeciwko nominacji. Wygląda na to, że może lepiej pasować do bardziej znanych języków, ale nie mam nic przeciwko.
rekurencyjny
Tak. Mogę nominować go, kiedy będzie lepiej ustalony, jak pan mówi. Mam nadzieję, że to nie potrwa długo.
Weijun Zhou
Ponieważ „odstępy między wierszami nie mają znaczenia, dopóki są spójne”, możesz zapisać kolejny bajt, jeśli chcesz.
Weijun Zhou
1
Właśnie przesłałem zgłoszenie przy użyciu Stax. Możesz udzielić porady na ten temat, jeśli chcesz. Edycja: Co za zbieg okoliczności. Postaram się uczyć od twojego poddania się.
Weijun Zhou,
11

Węgiel drzewny , 66 40 36 bajtów

≔²ηFS«F¬η«¶↷⊞υη≔⊕÷Lυ²η¶»F⊕⌕βι¿η«≦⊖ηι

Wypróbuj online! Link jest do pełnej wersji kodu. Edycja: Zapisano 16 bajtów, przyjmując tekst jako dane wejściowe. Wyjaśnienie:

≔²η

Zacznij z 2 ts z jakiegoś powodu.

FS«

Pętla nad wszystkimi literami w pangramie.

F¬η«

Dotarliśmy już do rogu?

Przejdź w dół (lub jakikolwiek następny kierunek) o jedną linię.

Obróć kierunek drukowania o 90 ° zgodnie z ruchem wskazówek zegara.

⊞υη≔⊕÷Lυ²η

Oblicz długość następnej strony.

¶»

Zakończ ustalanie pozycji kursora. (Węgiel wolałby, aby strona kończyła się tuż przed rogiem, abyś obrócił się na samym rogu).

F⊕⌕βι

Zapętlaj tyle razy, ile zajmuje bieżąca litera w alfabecie.

¿η«

Jeśli nie dotarliśmy do rogu,

≦⊖ηι

Zmniejsz liczbę i wydrukuj bieżący list.

Neil
źródło
Dziękuję Ci. Świetna robota i dobrze wyjaśniona. Mała literówka: tam razy -> trzy razy.
Weijun Zhou
Ta 43 bajtowa wersja jest również dopuszczalna zgodnie ze specyfikacją. tio.run
##
1
@WeijunZhou Dzięki, nie zauważyłem wcześniej tej klauzuli w pytaniu.
Neil
2

Rubinowy , 217 212 209 208 bajtów

->s{s+=' '*8
x=0
a=[""]*30
i=14
a[i]=?t
l=->{a[i]=s[x]+a[i]}
r=->{a[i]+=s[x]}
(0..58).map{|g|c=0
(0..g/2).map{c>s[x].ord-97&&(x+=1;c=0)
c+=1
eval %w{r i+=1;r l i-=1;l}[g%4]+"[]"}
x+=1}
a[-1].slice!0
$><<a*$/}

Wypróbuj online!

Spędza sporo czasu na zarządzaniu wskaźnikami, więc może być miejsce na grę w golfa.

-5 bajtów: trzykrotnie pangram przed wprowadzeniem. Dzięki Weijun Zhou .

-3 bajty: Wypełnij łańcuch wejściowy i przytnij ostatni odcinek, zamiast generować ostatni odcinek od zera.

-1 bajtów: użyj &&zamiast operatora trójskładnikowego o wartości jednorazowej.

Wyjaśnienie:

->s{
  s += " " * 8                             # These spaces will show on the bottom row
  x = 0                                    # x is a pointer into s
  a = [""] * 30                            # a is an array of row strings
  i = 14                                   # i is a pointer into a
  a[i] = ?t                                # "Starts with two t's for some reason"
  l = ->{ a[i] = s[x]+a[i] }               # lambda to prepend char x to row i
  r = ->{ a[i] += s[x] }                   # lambda to append char x to row i
  (0..57).map{|g|                          # There are 58 "legs" to the spiral
    c = 0                                  # c is the print count of s[x]
    (0..g/2).map{                          # Leg g has g/2+1 characters
      c > s[x].ord-97 && (x+=1;c=0)        # Possibly switch to next letter
      c += 1
      eval %w{r i+=1;r l i-=1;l}[g%4]+"[]" # Call the appropriate lambda
    }
    x += 1                                 # Definitely switch to next letter
  }
  a[-1].slice!0                            # Remove the first char from the bottom row
  $> << a*$/                               # Join with newlines and print
}
benj2240
źródło
1
Ładne zgłoszenie i jasno wyjaśnione. Doceniam użycie ri llambdas. Na podstawie aktualnych odpowiedzi ostatnia noga wydaje się być kłopotliwa, chociaż nie wtedy, gdy napisałem mój fragment
kodu
1
Wydaje się, można zapisać s*=3w ogóle, a także pominięcie 0w ?:operatora. tio.run/…
Weijun Zhou
1
@WeijunZhou Ahh, dzięki za wskazówkę. Potrzebuję tego 0jednak, bo w przeciwnym razie Ruby wyciągnie c+=1kolejną linię i wykona ją tylko przez większość czasu. I miłe wyzwanie!
benj2240
Masz rację. Nie wyglądałem wystarczająco ostrożnie. Dziękuję za uznanie. Cieszę się, że ci się podobało.
Weijun Zhou