Wprowadzenie
Mapa Piekarza jest ważnym systemem dynamicznym, który wykazuje chaotyczne zachowanie. Jest to funkcja od kwadratu jednostkowego do siebie definiowana intuicyjnie w następujący sposób.
- Wytnij kwadrat pionowo na pół, uzyskując dwa prostokąty wielkości
0.5×1
. - Ułóż prawą połowę u góry po lewej, uzyskując jeden prostokąt wielkości
0.5×2
- Ściśnij prostokąt z powrotem w
1×1
kwadrat.
W tym wyzwaniu zaimplementujesz dyskretną wersję tej transformacji.
Wejście i wyjście
Twoje dane wejściowe to tablica 2D drukowalnych znaków ASCII i 2m×2n
niektórych białych znaków m, n > 0
. Dane wyjściowe są podobną tablicą uzyskaną w następujący sposób przy użyciu 6×4
tablicy
ABCDEF
GHIJKL
MNOPQR
STUVWX
jako przykład. Najpierw ułóż prawą połowę tablicy u góry lewej połowy:
DEF
JKL
PQR
VWX
ABC
GHI
MNO
STU
Następnie podziel kolumny na pary znaków i niezależnie obróć każdą parę o 90 stopni zgodnie z ruchem wskazówek zegara, „kompresując” wysoki prostokąt z powrotem do pierwotnego kształtu:
JDKELF
VPWQXR
GAHBIC
SMTNUO
To jest poprawne wyjście dla powyższej tablicy.
Zasady
Formaty wejściowe i wyjściowe są elastyczne. Możesz używać ciągów rozdzielanych znakiem nowej linii, list ciągów lub tablic znaków 2D. Jednak dane wejściowe i wyjściowe muszą mieć dokładnie ten sam format: musisz być w stanie iterować swoje zgłoszenie dowolną liczbę razy na dowolnym prawidłowym wejściu.
Możesz napisać pełny program lub funkcję. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.
Przypadki testowe
Input:
12
34
Output:
42
31
Input:
Hell
! o
d -
lroW
Output:
lol
o W-
!H e
ldr
Input:
ABCDEF
GHIJKL
MNOPQR
STUVWX
Output:
JDKELF
VPWQXR
GAHBIC
SMTNUO
Input:
*___ ___ o
o|__) |__) *
*| | o
o __ __ *
*| | _ o
o|__ |__| *
Output:
|_____) *o
|_ _ *o
||_ __| *o
o*|_____)
o* |_ _
o*||_ _
c2k
zamiastck/lk2
.c2k
dzieli ciąg na dwie równe części.Julia, 136 bajtów
Bardzo prosta implementacja. Nie było to szczególnie konkurencyjne wejście, ale było fajnie!
Tworzy to funkcję lambda, która przyjmuje jako dane wejściową tablicę 2-wymiarową i zwraca przekształconą tablicę 2-wymiarową.
Niegolfowane + wyjaśnienie:
Aby go wywołać, nadaj funkcji nazwę, np
f=A->(...)
.Przykładowe dane wyjściowe:
I dowód, że można go dowolnie powiązać:
Sugestie są jak zawsze mile widziane i chętnie udzielę dalszych wyjaśnień.
źródło
CJam,
2524 bajtówProsta implementacja specyfikacji. Wyjaśnienie:
Wypróbuj online tutaj
źródło
JavaScript (ES6), 104
141Edytuj Przeglądając specyfikację, stwierdziłem, że liczba wierszy musi być parzysta (wcześniej tęskniłem). Więc nie jest zbyt skomplikowane znalezienie prawidłowej pozycji źródła dla każdego znaku wyjściowego w jednym kroku.
Przetestuj w konsoli Firefox / FireBug
Wynik
źródło
J,
4539 bajtówJ ma funkcję teselacji (cut
;.
), która bardzo pomaga.źródło
Haskell,
128127 bajtówZastosowanie:
f ["12", "34"]
->["42","31"]
Jak to działa:
Edycja: @Zgarb znalazł bajt do zapisania.
źródło
g x=x
dla pustej wielkości listy.GNU sed -r, 179 bajtów
Wynik obejmuje +1 dla
-r
arg do sed.Zajęło mi trochę czasu, aby dowiedzieć się, jak to zrobić
sed
, ale myślę, że mam teraz:Uwaga: wszystkie powyższe białe znaki powinny składać się z pojedynczych tabznaków. Komentarze nie są uwzględniane w wyniku golfa.
Zauważ też, że w ten sposób szeroko wykorzystuje się
:
znaczniki. Jeśli strumień wejściowy zawiera:
, nastąpi nieokreślone zachowanie. Można to złagodzić, zastępując wszystkie:
znakami niedrukowalnymi (np. BEL) bez żadnych opłat za wynik golfa.Dane wejściowe i wyjściowe to lista ciągów oddzielona tabulatorami:
źródło
J,
3332 znakiCzasownik monadyczny.
Wyjaśnienie
Zacznijmy od zdefiniowania,
Y
że będzie to nasz przykładowy wkład.Pierwsza część (
-:@#@{. (}. ,. {.) |:
) dzieli sięY
na pół i dołącza, a następnie kończy:W drugiej części (
_2 |.\"1
) podzieliliśmy to na dwie pary i odwróciliśmy je:Wreszcie (
0 2 ,.@|:
) transponujemy macierz w razie potrzeby i odrzucamy oś wleczoną:Całe wyrażenie z wstawionymi spacjami:
I jako czasownik jawny:
źródło