To pytanie jest inspirowane pytaniem Kevina Cruijssena .
Teraz, gdy dywan jest ułożony, chcemy go zwinąć. Twoim zadaniem jest napisanie programu, który pobiera ciąg znaków i zwraca spiralę wykonaną z tego ciągu (reprezentującą zwinięty dywan widziany z boku).
Procedura dla jednego kroku zwijania dywanu jest następująca. Jest przykład ilustrujący to, co mam na myśli. Zauważ, że przykład zaczyna się od częściowo zwiniętego dywanu dla lepszego zrozumienia:
ac
rpet
- oddzielić „głowę” od „ogona” dywanu: głowa jest tym, co do tej pory zostało zwinięte, ogon jest tym, co pozostało do zrolowania.
Head: ac Tail:
rp et
- Obróć głowicę o 90 °, zgodnie z ruchem wskazówek zegara.
Rotated head: ra Tail (unchanged):
pc et
- jeśli szerokość nowej głowy (tutaj
2
) jest mniejsza lub równa długości ogona (tutaj2
)- następnie połóż go na ogonie
- w przeciwnym razie dywan (jak na początku kroku) został zwinięty
New carpet: ra
pc
et
Powtórz procedurę tyle razy, ile potrzeba.
Dwa przykłady pokazujące wszystkie etapy zwijania dywanu:
carpet
c
arpet
ac
rpet
ra
pc
et
0123456789
0
123456789
10
23456789
21
30
456789
432
501
6789
Niektóre szczegóły:
- Nie musisz pokazywać wszystkich pośrednich kroków, tylko zwinięty dywan (np. Jeśli znajdziesz nie iteracyjny sposób obliczenia wyniku, jest on idealny). Ponadto nie musisz drukować żadnych wiodących białych znaków, w powyższych przykładach pokazuję je tylko w celu wyrównania elementów.
- Dane wejściowe to ciąg znaków, lista / tablica znaków
- Dane wyjściowe są drukowane na standardowe wyjście lub do pliku.
- Dane wejściowe są ładne: długość wynosi co najmniej 1 znak, a co najwyżej stała wystarczająco mała, aby nie powodowała problemów, ale nie możesz użyć tej stałej w swoim programie; treść ciągu to tylko ładne znaki ([a-zA-Z0-9]), kodowanie według twoich preferencji.
- To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach. Nie pozwól, aby języki kod-golfowe zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
- Domyślne luki są zabronione.
- Jeśli to możliwe, dodaj link z testem swojego kodu.
- Dodaj również wyjaśnienie swojej odpowiedzi, jeśli uważasz, że jest potrzebna.
ProgrammingPuzzlesAndCodeGolf
- potknęła mnie ostateczna długość ogona większa niż 1.print
wlambda
.Odpowiedzi:
Węgiel drzewny , 15 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Pętla nad dywanem.
Sprawdź, czy jest coś powyżej kursora.
Jeśli nie, zwinąć dywan.
Przejdź w prawo i wypisz bieżący znak.
Przykład: Dla danych wejściowych
0123456789
występują następujące działania:0
jest drukowane.Kursor przesuwa się w prawo i
1
jest drukowany.Ponieważ nic nie znajduje się powyżej
1
, płótno jest obracane.Kursor przesunie się w prawo i
2
zostanie wydrukowany.Ponieważ nic nie znajduje się powyżej
2
, płótno jest obracane.Kursor przesunie się w prawo i
3
zostanie wydrukowany.Kursor przesunie się w prawo i
4
zostanie wydrukowany.Ponieważ nic nie znajduje się powyżej
4
, płótno jest obracane.Kursor przesunie się w prawo i
5
zostanie wydrukowany.Kursor przesunie się w prawo i
6
zostanie wydrukowany.Ponieważ nic nie znajduje się powyżej
6
, płótno jest obracane.Kursor przesunie się w prawo i
7
zostanie wydrukowany.Kursor przesunie się w prawo i
8
zostanie wydrukowany.Kursor przesunie się w prawo i
9
zostanie wydrukowany.źródło
⟲
?Pyth, 37 bajtów
Spróbuj go online tutaj , lub sprawdzić wszystkie przypadki testowe od razu tutaj .
źródło
Łuska , 24 bajty
Wypróbuj online!
Wyjaśnienie
źródło
J , 69 bajtów
-3 bajty dzięki FrownyFrog
Wypróbuj online!
wyjaśnienie
Algorytm jest prosty, mimo że jest nieco gadatliwy dla J.
Ogólna strategia: Zmniejsz wkład do kwadratowego stołu, z resztą (być może pustą).
Kiedy zmniejszamy, będziemy używać 2-elementowej listy pudeł. Nasz „dotychczasowy wynik” będzie pierwszym polem, a „produkty do przetworzenia” drugim polem. Pierwsze okno zostanie zainicjowane na początku wejścia (ale przekonwertowane na tabelę):
a „elementy pozostałe do przetworzenia” będą ogonem wejściowym:
Teraz mamy:
gdzie „c” jest w rzeczywistości tabelą 1x1.
Zmniejszamy to przy użyciu pętli J Do ... While:
Gdzie część w nawiasie to warunek „kontynuuj”:
który mówi „kontynuuj, dopóki długość prawego pudełka jest większa lub równa długości lewego pudełka (tj. długość boku kwadratowej matrycy)
Co oznacza „kontynuuj”? Jest to zdefiniowane w czasowniku po lewej stronie pierwszego
^:
, który mówi nam, jak wziąć bieżący wynik i wykonać następną iterację. Ten czasownik to:Rozbijmy to:
Oznacza to, że jest to tylko algorytm opisany w OP przetłumaczony dosłownie na J.
Na koniec zajmujemy się (ewentualnie 0) resztkami, ogonem naszej rolki dywanowej:
To mówi „weź wszystko oprócz ostatniego wiązu wyniku”:
i dołącz go do
,
ostatnich elementów wyniku,{:@[
a pozostałe elementy dołączone do tego ostatniego elementu, ]
źródło
,.
może robić to, co1 1$]
robi i$
może być używane jako{.
.$ can be used as {.
- czy możesz to wyjaśnić?R ,
146132 bajtówWypróbuj online!
Realizuje procedurę zwijania dywanu. Pobiera dane wejściowe jako listę znaków i drukuje na standardowe wyjście.
Zaoszczędzono 14 bajtów, znajdując sposób użycia
do-while
pętli i inicjując za pomocąF
.źródło
Galaretka , 30 bajtów
Wydaje się zbyt długo ...
Wypróbuj online!
W jaki sposób?
źródło
05AB1E , 41 bajtów
O wiele za długo, ale chciałem użyć Canvas. Co było prawdopodobnie złym wyborem, kiedy go skończyłem i okazało się, że było tak długo ..
Wypróbuj online . (Brak zestawu testów, ponieważ wydaje się, że jest dziwny problem z
.Λ
wbudowanym ..)Wyjaśnienie:
Zacznę od ogólnego wyjaśnienia obszaru roboczego i tego, co chciałem, aby mój kod miał osiągnąć. Bardziej szczegółowe informacje można znaleźć w tym moim odpowiednim poradniku 05AB1E , ale do tego wyzwania chciałem wykonać następujące czynności:
Wbudowane płótno ma trzy parametry:
[2,2,3,3,4,4,5,5,...]
carpet
0123456789ABCDEFGHI
Co do kodu:
Zobacz moją wskazówkę 05AB1E (rozdział Jak skompresować duże liczby całkowite? ), Aby zrozumieć, dlaczego tak
Ž8O
jest2064
.źródło
Python 3 , 112 bajtów
W tym przypadku wynikiem jest wartość funkcji.
Wypróbuj online!
Jeśli wolisz, oto inne (dłuższe, 129 bajtów ) rozwiązanie, które drukuje bezpośrednio zrolowane dane wejściowe:
Wypróbuj online!
źródło
MATLAB / oktawa , 154 bajtów
Nie najkrótsza, ale gra w golfa w MATLAB / Octave jest zawsze fajna :)
Wypróbuj online!
źródło
disp
to, powiedziałbym, należy usunąćdisp
, aby pozwolić ludziom, że nie wiedzą, że R nie pisać do STDOUT domyślnie