Napisz kwadratowy program, który wyświetli liczbę „rozwinięć”

22

Rozważ kwadratowy blok tekstu, N znaków o szerokości N i wysokości, dla nieparzystej liczby całkowitej N większej niż 1.

Jako przykład niech N = 5, a tekst będzie:

MLKJI
NWVUH
OXYTG
PQRSF
ABCDE

Zauważ, że jest to alfabet (oprócz Z) spiralny wokół lewego dolnego rogu przeciwnie do ruchu wskazówek zegara. To trochę jak zwinięty dywan.

Alfabet spiralny

„Rozwijanie” tekstu o jedną czwartą obrotu w prawo, więc FGHIsą na tym samym poziomie, co ABCDEpowoduje:

     PONM
     QXWL
     RYVK
     STUJ
ABCDEFGHI

To rozwijanie można wykonać jeszcze 7 razy, aż tekst będzie w jednym wierszu:

         SRQP
         TYXO
         UVWN
ABCDEFGHIJKLM

             UTS
             VYR
             WXQ
ABCDEFGHIJKLMNOP

                WVU
                XYT
ABCDEFGHIJKLMNOPQRS

                   XW
                   YV
ABCDEFGHIJKLMNOPQRSTU

                     YX
ABCDEFGHIJKLMNOPQRSTUVW

                       Y
ABCDEFGHIJKLMNOPQRSTUVWX

ABCDEFGHIJKLMNOPQRSTUVWXY

Wyzwanie

Wyzwanie polega na napisaniu programu, który jest blokiem tekstu N × N, który generuje liczbę razy „rozwinął się” o ćwierć obrotu, gdy jest przestawiony na wzorce rozwijania i działa.

Są tu naprawdę dwa konkursy: (mam nadzieję, że nie będzie zbyt bałagan)

  1. Zrób to z najmniejszą N. (do granicy N = 3)
  2. Zrób to z największym N. (bez limitu)

Odpowiedź nie będzie zaakceptowana, ale zwycięzca w każdej z tych kategorii otrzyma ode mnie co najmniej 50 powtórzeń nagrody. W przypadku remisów wygrywają najstarsze odpowiedzi.

Przykład

Jeśli twój blok kodu to

MyP
rog
ram

uruchomienie go tak, jak jest powinno, powinno dać wynik 0.

Bieganie

   rM
   oy
ramgP

powinien wypisać 1.

Bieganie

     or
ramgPyM

powinien wypisać 2.

Bieganie

       o
ramgPyMr

powinien wypisać 3.

Wreszcie uruchomienie ramgPyMropowinno dać 4.

Detale

  • Wyjście powinno być drukowane samo na standardowe wyjście (lub najbliższą alternatywę). Brak danych wejściowych.
  • W kodzie możesz używać tylko ASCII do wydruku (kody szesnastkowe od 20 do 7E, które zawierają spację).
  • Przestrzenie wypełniają puste miejsce w rozwijających się układach. (Chyba że rozwijasz się w lewo.)
  • Tylko układy od całkowicie kwadratowego do całkowicie płaskiego muszą mieć prawidłową moc wyjściową. Żadne inne ustalenia nie będą realizowane.
  • Nie możesz czytać własnego źródła.
  • Możesz użyć komentarzy.
  • N = 1 jest wykluczone, ponieważ w wielu językach program 0będzie działał.
  • W razie potrzeby możesz rozwinąć w lewo zamiast w prawo. Więc np

    MyP
    rog
    ram
    

    staje się

    Pg
    yo
    Mrram
    

    i tak dalej. Podczas toczenia w ten sposób nie są dodawane żadne dodatkowe spacje. Linie właśnie się kończą

(Powiązane: Napisz prostokątny program, który wyświetli liczbę razy, kiedy został obrócony )

Hobby Calvina
źródło
Zanim przeczytałem akapit „wyzwanie”, spodziewałem się napisać program, który sam się rozwija
John Dvorak
1
dlaczego N musi być dziwne?
John Dvorak
1
@ JanDvorak Przypuszczam, że N nie musiał być dziwny, ale dzięki temu spirale są bardziej znormalizowane. Tak jest, ale możesz opublikować N = 2 jako komentarz, jeśli go znajdziesz.
Calvin's Hobbies
8
Pomysł: rozwinięcie „dywanu” w prawo tworzy wiele wierszy zaczynających się od białych znaków, eliminując języki takie jak Python. Jeśli pozwolisz na rozwijanie w lewo, nie będzie potrzeby stosowania dodatkowych białych znaków, a Python jest (teoretycznie) możliwy.
Falko
5
Czy masz magiczną książkę z nieskończonymi świetnymi pomysłami na wyzwania? Jak inaczej wymyślasz tak ciekawe wyzwania?
Justin

Odpowiedzi:

27

Golfscript, N <- [5,7 ..]

.   .
 . . 
 ..  
.  .#
],9\-

W pełni rozwinięty:

],9\-#  .   .  .  . . ...

Wyjaśnienie:

  • . (wiele razy) - zduplikuj dane wejściowe
  • ] - zbierz stos w jedną tablicę
  • , - weź jego długość
  • 9\- - odejmij to od 9
  • # - komentarz liniowy

Białe znaki to NOP, ale każdy inny NOP działałby równie dobrze.

W pełni zwinięty używa stosu dziewięciu kopii danych wejściowych (zawartość ignorowana); 9 - 9 = 0; nie został rozwinięty.

Każde rozwinięcie ukrywa jeszcze jedną kropkę (duplikat) za komentarzem, zmniejszając stos raz, zwiększając wynik.

W pełni rozwinięty używa stosu (zawartość ignorowana) jako stosu; 9 - 1 = 8; został rozwinięty 8 razy.

To samo podejście działa dla dowolnego N> 4: Zmień 9na odpowiednią wartość 2 * N + 1, a następnie rozszerz wzór kropek (duplikat), używając tego samego wzoru spirali, który zapewnia, że ​​dokładnie jedna kropka zostanie rozwinięta podczas każdego rozwinięcia.

John Dvorak
źródło
Cóż, chyba że ktoś znajdzie N = 3, będzie to zwycięska odpowiedź w obu kategoriach.
Calvin's Hobbies
3
@ Calvin'sHobbies, czy powinienem być totalnym kutasem i opublikować rozwiązanie rozwijające się po lewej? :-)
John Dvorak
Dlaczego nie. Inna odpowiedź wydaje się mało prawdopodobna: P
Calvin's Hobbies
1
Dlaczego nie wybrać takiego, który może rozwinąć się w obu kierunkach? :)
Beta Decay
@BetaDecay hmm ... :-)
John Dvorak
13

GolfScript, N = 4

Ten jeden w prawo toczy się jak w oryginalnej specyfikacji.

.. . 
...# 
.#.~
],8-

Oto rozwinięcia:

    ...
    #..
    ..
],8-~#.

       .#.
       ...
],8-~#. ..

          ..
          .#
],8-~#. ....

            ..
],8-~#. ....#.

              .
],8-~#. ....#..

],8-~#. ....#...

Wypróbuj tutaj

Optymalizator
źródło
Jak myślisz o tym układzie?
dumny haskeller
3
@proudhaskeller Lepiej, jeśli nie wiesz ...
Optymalizator
8
Czy brutalnie szukałeś rozwiązania?
dumny haskeller
Szczególnym wyzwaniem: można zrobić jeden z .s do #s?
John Dvorak
Lubię spływ ~. Może uda mi się go ukraść za N = 3?
John Dvorak,
9

APL, N = 3

201
340
5|0

Rozwinięty:

   32
   40
5|001

     43
5|00102

       4
5|001023

5|0010234

Wypróbuj online.

Oblicza pozostałą część tej liczby podzieloną przez 5. Drukowany jest tylko wynik ostatniej linii.

APL, N = 2

⍬∞
≡0

Rozwinięty:

  ⍬
≡0∞

≡0∞⍬

Wypróbuj online.

zwraca głębokość (nie mylić z wymiarem lub długością) tablicy:

  • 0nie jest tablicą. Więc głębokość wynosi 0.
  • 0∞jest tablicą z dwoma elementami 0i (nieskończoność). Ma głębokość 1.
  • 0∞⍬ma inny element , którym jest pusta tablica o głębokości 1. Tak0∞⍬ ma głębokość 2.

Te dwa programy działają również w tłumaczu online. Nie jestem pewien, czy późniejszy jest poprawny pod względem składniowym.

⍬0
≡∞


⍬¯
≡0

APL dla dowolnego N> = 4

Dla N = 4:

∞  ∞
 ∞∞
∞ ∞
⍴1↓∞

W pełni rozwinięty:

⍴1↓∞  ∞  ∞ ∞ ∞∞∞

Dla N = 5:

∞   ∞
 ∞ ∞
 ∞∞
∞  ∞
⍴1↓ ∞

W pełni rozwinięty:

⍴1↓ ∞   ∞   ∞  ∞  ∞ ∞ ∞∞∞

1↓usuwa element z tablicy. Zwraca również pustą tablicę, jeśli argument jest skalarny. pobiera długość tablicy.

jimmy23013
źródło
Jakieś wyjaśnienia?
dumny haskeller
@proudhaskeller Edytowane.
jimmy23013,
Idealnie możesz użyć tej samej logiki głębokości dla dowolnego N. Dzięki APL
Optimizer
@Optimizer To nie jest takie proste. Rzeczy przed ostatnim wierszem wciąż muszą być poprawne pod względem składniowym. Nie mogę więc używać większości funkcji ani innych znaków interpunkcyjnych, takich ()[]jak pojawiające się w niechcianym miejscu.
jimmy23013,
Miałem na myśli: `` ⍬⍬ \ n⍬⍬0 \ n≡ ∞` (Nie do końca tak, ale masz pomysł)
Optimizer