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.
„Rozwijanie” tekstu o jedną czwartą obrotu w prawo, więc FGHI
są na tym samym poziomie, co ABCDE
powoduje:
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)
- Zrób to z najmniejszą N. (do granicy N = 3)
- 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 ramgPyMro
powinno 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
0
bę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 )
źródło
Odpowiedzi:
Golfscript, N <- [5,7 ..]
W pełni rozwinięty:
Wyjaśnienie:
.
(wiele razy) - zduplikuj dane wejściowe]
- zbierz stos w jedną tablicę,
- weź jego długość9\-
- odejmij to od 9#
- komentarz liniowyBiał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ń
9
na 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.źródło
GolfScript, N = 4
Ten jeden w prawo toczy się jak w oryginalnej specyfikacji.
Oto rozwinięcia:
Wypróbuj tutaj
źródło
.
s do#
s?~
. Może uda mi się go ukraść za N = 3?APL, N = 3
Rozwinięty:
Wypróbuj online.
Oblicza pozostałą część tej liczby podzieloną przez 5. Drukowany jest tylko wynik ostatniej linii.
APL, N = 2
Rozwinięty:
Wypróbuj online.
≡
zwraca głębokość (nie mylić z wymiarem lub długością) tablicy:0
nie jest tablicą. Więc głębokość wynosi 0.0∞
jest tablicą z dwoma elementami0
i∞
(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.
APL dla dowolnego N> = 4
Dla N = 4:
W pełni rozwinięty:
Dla N = 5:
W pełni rozwinięty:
1↓
usuwa element z tablicy. Zwraca również pustą tablicę, jeśli argument jest skalarny.⍴
pobiera długość tablicy.źródło
()[]
jak pojawiające się w niechcianym miejscu.