Napisz program lub funkcję, która nie przyjmuje danych wejściowych, ale drukuje lub zwraca ciągły tekst prostokąta utworzonego z 12 różnych pentominoów :
Prostokąt może mieć dowolne wymiary i być w dowolnej orientacji, ale wszystkie 12 pentomino musi być użyte dokładnie raz, więc będzie miało obszar 60. Każdy inny pentomino musi składać się z innego drukowalnego znaku ASCII (nie musisz używać litery z góry).
Na przykład, jeśli zdecydujesz się na wyjście z tego prostokąta pentomino 20 × 3:
Dane wyjściowe Twojego programu mogą wyglądać mniej więcej tak:
00.@@@ccccF111//=---
0...@@c))FFF1//8===-
00.ttttt)))F1/8888=-
Alternatywnie, może być łatwiej grać w golfa w tym rozwiązaniu 6 × 10:
000111
203331
203431
22 444
2 46
57 666
57769!
58779!
58899!
5889!!
Każde rozwiązanie prostokąta wystarczy, twój program musi tylko wydrukować jedno. (Końcowy znak nowej linii w wyjściu jest w porządku).
Ta wspaniała witryna zawiera mnóstwo rozwiązań dla różnych wymiarów prostokąta i prawdopodobnie warto je przejrzeć, aby upewnić się, że Twoje rozwiązanie jest jak najkrótsze. To jest golf golfowy, wygrywa najkrótsza odpowiedź w bajtach.
źródło
Odpowiedzi:
Pyth, 37 bajtów
Demonstracja
Stosuje bardzo proste podejście: użyj bajtów szesnastkowych jako liczb. Konwertuj na liczbę szesnastkową, podstawowa 256 to koduje. To daje magiczny ciąg powyżej. Aby zdekodować, użyj podstawowej funkcji dekodera 256 języka Pyth, przekonwertuj na szesnastkowy, podziel na 4 części i dołącz do znaku nowej linii.
źródło
CJam (44 bajty)
Podany w formacie xxd, ponieważ zawiera znaki kontrolne (w tym surową kartę, która gra naprawdę źle z MarkDown):
który dekoduje do czegoś na wzór
Nieznacznie pozbawione golfa demo online, które nie zawiera znaków kontrolnych, a zatem dobrze gra z funkcjami biblioteki dekodowania URI przeglądarki.
Podstawową zasadą jest to, że ponieważ żaden kawałek nie obejmuje więcej niż 5 rzędów, możemy kodować przesunięcie względem funkcji liniowej numeru wiersza w sposób zwarty (w zasadzie w podstawie 5, chociaż nie próbowałem ustalić, czy zawsze tak będzie) ).
źródło
Bash + typowe narzędzia Linux, 50
Aby odtworzyć to z zakodowanego base64:
Ponieważ istnieje 12 pentomino, ich kolory można łatwo zakodować w hex hexb.
Wynik:
źródło
J, 49 bajtów
Możesz wybierać litery w taki sposób, aby maksymalne przyrosty między literami sąsiadującymi pionowo to 2. Używamy tego faktu do kodowania przyrostów pionowych w bazie3. Następnie tworzymy sumy bieżące i dodajemy przesunięcie, aby uzyskać kody ASCII liter.
Zdecydowanie do gry w golfa. (Jeszcze nie znalazłem sposobu na wprowadzenie liczb o rozszerzonej dokładności base36, ale prosty base36 powinien zaoszczędzić 3 bajty sam.)
Wynik:
Wypróbuj online tutaj.
źródło
3#i.5
Który jest0 0 0 1 1 1 ... 4 4 4
) może on działać, ale prawdopodobnie nie będzie krótszy (przynajmniej tak, jak próbowałem).Microscript II , 66 bajtów
Zacznijmy od prostej odpowiedzi.
Brawo niejawny druk.
źródło
Rubin
Rev 3, 55 bajtów
Jako dalszy rozwój pomysłu Randomry, rozważ poniższą tabelę wyników i różnic. Tabela różnic może być skompresowana jak poprzednio i rozszerzona przez pomnożenie przez 65 = binarne 1000001 i zastosowanie maski 11001100110011. Jednak Ruby nie działa przewidywalnie z 8-bitowymi znakami (zwykle interpretuje je jako Unicode).
Co zaskakujące, ostatnia kolumna jest całkowicie parzysta. Z tego powodu w kompresji możemy wykonać przesunięcie praw do danych. Dzięki temu wszystkie kody mają 7 bitów ASCII. W rozszerzeniu po prostu mnożymy przez 65 * 2 = 130 zamiast 65.
Pierwsza kolumna jest również całkowicie równa. Dlatego w razie potrzeby możemy dodać 1 do każdego elementu (32 do każdego bajtu), aby uniknąć znaków kontrolnych. Niechciane 1 jest usuwane za pomocą maski 10001100110011 = 9011 zamiast 11001100110011.
Chociaż używam 15 bajtów do tabeli, tak naprawdę używam tylko 6 bitów każdego bajtu, co w sumie daje 90 bitów. W rzeczywistości istnieje tylko 36 możliwych wartości dla każdego bajtu, co w sumie daje 2,21E23 możliwości. To zmieściłoby się w 77 bitach entropii.
Rev 2, 58 bajtów, stosując podejście przyrostowe Randomry
Wreszcie coś krótszego niż naiwne rozwiązanie. Przyrostowe podejście Randomry, z metodą obejścia z Rev 1.
Rev 1, 72 bajty, wersja 0 gry w golfa
Wprowadzono pewne zmiany w linii bazowej, aby uwzględnić zmianę kolejności kodu ze względu na grę w golfa, ale nadal wprowadzono to dłużej niż naiwne rozwiązanie.
Przesunięcia są kodowane w każdym znaku ciągu magicznego w bazie 4 w formacie
BAC
, tj. Z 1-mi reprezentującymi prawy symbol, 16-mi reprezentującymi środkowy symbol, a lewy symbol ustawia się w pozycji 4. Aby je wyodrębnić, kod ascii jest mnożony przez 65 (binarny 1000001), aby daćBACBAC
, a następnie jest dodawany do 819 (binarny 1100110011), aby dać.A.B.C
.Niektóre kody ascii mają ustawiony siódmy bit, tzn. Są o 64 wyższe od wymaganej wartości, aby uniknąć znaków kontrolnych. Ponieważ ten bit jest usuwany przez maskę 819, jest to nieistotne, z wyjątkiem sytuacji, gdy wartość
C
wynosi 3, co powoduje przeniesienie.g
Trzeba to poprawić tylko w jednym miejscu (zamiast tego musimy użyćc
.)Rev 0, wersja bez golfa
Wynik
Wyjaśnienie
Od następującego rozwiązania odejmuję linię bazową, podając przesunięcie, które przechowuję jako dane. Linia bazowa jest regenerowana jako liczba szesnastkowa w kodzie o
i/2*273
(273 po przecinku = 111 szesnastkowo).źródło
3
w całej tabeli (tuż u dołu), więc myślę, że zwiększając linię bazową o nieco więcej niż 0,5 w każdej linii, można faktycznie użyć bazy 3. Możesz spróbować tego. (Z powodów golfowych wydaje się, że będę musiał nieco zmienić linię bazową, co daje mi raczej więcej 3, i niestety wygląda na to, że będzie o 1 bajt dłuższy niż naiwne rozwiązanie w Ruby.)Foo, 66 bajtów
źródło