To jest ziemniak:
@@
@@@@
@@@@@@
@@@@@@
@@@@
@@
Bardziej ogólnie, ziemniak w rozmiarze N jest zdefiniowany jako następujący kształt:
Jeśli N jest parzyste, oznacza to 2 wyśrodkowane @
symbole, następnie 4 wyśrodkowane @
symbole, a następnie 6 wyśrodkowane @
symbole, aż do N wyśrodkowanych @
symboli; następnie @
symbole N na środku , a następnie symbole na środku N-2 @
aż do 2.
Jeśli N jest nieparzysty, ziemniak o wielkości N jest generowany w taki sam sposób, jak opisano powyżej, ale zaczynamy od 1 @
symbolu, a nie 2 .
Ziemniak obiera się, zaczynając od prawego górnego rogu i usuwając jeden @
znak na każdym kroku, idąc w kierunku przeciwnym do ruchu wskazówek zegara. Na przykład obieranie ziemniaka wielkości 3 wygląda następująco:
@
@@@
@@@
@
@@@
@@@
@
@@
@@@
@
@@
@@
@
@@
@@
@@
@
@
@
@
Wyzwanie
Napisz program, który po wprowadzeniu liczby całkowitej wyświetli wszystkie etapy obierania ziemniaka o tym rozmiarze.
Końcowe spacje / znaki nowej linii są dozwolone.
Punktacja
To jest golf golfowy ; najkrótszy kod w bajtach wygrywa.
Przykładowe przypadki testowe
N = 2
@@
@@
@
@@
@@
@
N = 7
@
@@@
@@@@@
@@@@@@@
@@@@@@@
@@@@@
@@@
@
@@@
@@@@@
@@@@@@@
@@@@@@@
@@@@@
@@@
@
@@
@@@@@
@@@@@@@
@@@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@@@
@@@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@@
@@@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@@
@@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@@
@@@@@@
@@@@
@@@
@
@@
@@@@
@@@@@@
@@@@@@
@@@@
@@
@
@@
@@@@
@@@@@@
@@@@@@
@@@@
@@
@@
@@@@
@@@@@@
@@@@@@
@@@@
@
@@
@@@@
@@@@@@
@@@@@@
@@@
@
@@
@@@@
@@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@
@@@@@
@@@
@
@@
@@@
@@@@@
@@@@@
@@@
@
@
@@@
@@@@@
@@@@@
@@@
@
@@@
@@@@@
@@@@@
@@@
@
@@
@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@
@@@
@
@@
@@@@
@@@@
@@@
@
@@
@@@@
@@@@
@@
@
@@
@@@@
@@@@
@@
@@
@@@@
@@@@
@
@@
@@@@
@@@
@
@@
@@@
@@@
@
@
@@@
@@@
@
@@@
@@@
@
@@
@@@
@
@@
@@
@
@@
@@
@@
@
@
@
@
Katalog
Na podstawie Czy ta liczba jest liczbą pierwszą?
Odpowiedzi:
Perl, 129 bajtów
128 bajtów kodu +
-n
flaga.Potrzebujesz
-nE
flagi, aby go uruchomić:Objaśnienia: (opiszę je bardziej szczegółowo, gdy będę miał chwilę)
. Pierwsza część
$p=($r=$"x$n++."@"x$_.$/).$p.$r,$_-=2while$_>0;
generuje początkowego ziemniaka: zaczyna się od środkowej linii ziemniaka i dodaje dwie linie przy każdej iteracji: jeden przed poprzednim ciągiem, jeden po. Zauważ, że$"
jest to spacja i ponieważ$n
nie jest zainicjowana, zaczyna się od 0 i$/
jest nową linią.Zauważ wiele do powiedzenia na temat tego,
say$_=$p;
który drukuje początkowego ziemniaka podczas przechowywania go$_
(który później będzie łatwiejszy do manipulowania).Na koniec
say y/A/ /r while s/(^| )A(.*\n? *)@/$1 $2A/m||s/@( *\n?.*)A/A$1 /||s/@/A/
obiera ziemniaka. Ostatnia pozycja, w której@
usunięto a, zawieraA
(jest to dowolne, może to być dowolny symbol). Więc każda iteracja polega na znalezieniuA
, zastępując go z miejsca, a w międzyczasie zastępując następny@
zA
. Dzieje się tak dzięki dwóm wyrażeniom regularnym:s/(^| )A(.*\n? *)@/$1 $2A/m
kiedyA
znajduje się po lewej stronie ziemniaka (A(.*\n? *)@
pozwala iść w prawo lub w dół), as/@( *\n?.*)A/A$1 /
gdyA
znajduje się po prawej stronie (@( *\n?.*)A
pozwala iść w górę lub po lewej).s/@/A/
zastępuje pierwszy@
naA
(to jest inicjalizacja). Ponieważ zawsze mamyA
ciąg znaków, musimy go zastąpić spacją podczas drukowania, więc toy/A/ /r
działa.Tylko dla oczu , animowana wersja wygląda całkiem ładnie: (do uruchomienia w terminalu, jest to mniej więcej ten sam kod, ale z
clear
isleep
)źródło
Befunge,
319254 bajtówMotywacją tego algorytmu była próba uniknięcia rozgałęzień w jak największym stopniu, ponieważ jedna ścieżka wykonania jest ogólnie łatwiejsza do gry w golfa. Kod składa się zatem tylko z dwóch pętli: zewnętrznej pętli iterującej się po ramkach procesu obierania oraz wewnętrznej pętli renderującej ziemniaka dla każdej ramki.
Pętla renderująca generuje po prostu sekwencję znaków, przy czym znak dla każdej iteracji jest określany przez dość skomplikowaną formułę, która bierze numer klatki procesu obierania i indeks sekwencji wyjściowej i zwraca albo
@
, spację lub nowa linia, zgodnie z wymaganiami.Wypróbuj online!
źródło
Python 3.5.1, 520 bajtów
Wyjaśnienie
Podstawowy pomysł: na przemian iteracja w dół każdej linii i usuwanie znaku znajdującego się najdalej z lewej strony oraz iteracja w górę każdej linii, usuwanie znaku znajdującego się najbardziej z prawej strony, gdy są jeszcze
@
s.Ogólnie smutna próba prostej procedury.
źródło