Istnieje klasyczny wynik kombinatoryczny , w którym liczba sposobów na układanie 2*n
paska według 1*2
kostek domina to n- ta liczba Fibonacciego. Twoim celem jest wydrukowanie wszystkich pochyleń dla danego n
, narysowanych za pomocą myślników i linii pionowych, takich jak 8 pochyleń dla n=5
:
|————
|————
——|——
——|——
|||——
|||——
————|
————|
||——|
||——|
|——||
|——||
——|||
——|||
|||||
|||||
Masz dostarczyć program lub nazwaną funkcję, która przyjmuje n
dane wejściowe i drukuje wymagane dane wyjściowe. Wygrywa najmniej bajtów.
Wejście
Liczba n
pomiędzy 1
i 10
włącznie poprzez STDIN lub wejście funkcji.
Wynik
Wydrukuj wszystkie możliwe nachylenia 2*n
paska domina , rysowane w poziomie. Pochylenia mogą być w dowolnej kolejności, ale każda powinna pojawić się dokładnie raz. Muszą być oddzielone pustą linią.
Domino pionowe składa się z dwóch pionowych pasków ( |
), a domino poziome składa się z dwóch kresek ( —
). Możesz użyć łączników ( -
) zamiast myślników em, aby pozostać w ASCII.
Z białymi znakami możesz zrobić wszystko, o ile wydruk będzie wyglądał tak samo.
——
i|
długości jak Dennisa, a nien
ciągów długości—
i|
filtrowania poprzez—
pojawienie się w parach. A dla tych ostatnich oczekiwałbym, że będzie to przez wyrażenia regularne lub operacje na łańcuchach na wytworzonym łańcuchu, jaks.split('——
), a nie na podejściu arytmetycznym takim jak twoje.Odpowiedzi:
C, 106
Wersja golfowa
Orginalna wersja
Jak to działa
Zmienna
i
działa od1<<n-1
zera do 0, tworząc wszystkie możliwe liczby binarne zn
cyframi. 0 koduje|
i 1 koduje dla-
. Interesują nas liczby zawierające 1 w parach. Oczywiście liczby te można podzielić przez 3.Gdy liczba jest dzielona przez 3, pierwotną liczbę można odzyskać, mnożąc wynik przez 2 i dodając go do siebie (skutecznie mutliplując przez 3). Większość liczb wymaga przeniesienia, ale gdy proces jest przeprowadzany na liczbach odsetki, nie jest wymagane przenoszenie, więc tylko w tych przypadkach można użyć LUB zamiast dodawania. Służy to do testowania interesujących liczb, ponieważ są one jedynymi, w których wyrażenie
i/3|i/3*2
zwraca pierwotną wartośći
. Zobacz przykład poniżej.1111
= 15 --->0101
= 5 --->1111
= 15 (ważne,0101|1010
==0101+1010
)1001
= 9 --->0011
= 3 --->0111
= 7 (nieprawidłowy,!0011|0110
=0011+0110
)Wartość testowa jest zawsze równa lub mniejsza niż wartość pierwotna. Ponieważ liczby, które nie są wielokrotnościami 3, zwracają również liczbę mniejszą od oryginału, gdy są dzielone przez 3, a następnie mnożone przez 3, test daje również pożądaną FAŁSZ na tych liczbach.
W oryginalnej wersji kilka pętli
j
służy do skanowania bitówi
i generowania danych wyjściowych. W wersji golfowej stosowana jest pojedynczafor
pętla, w którejh
przebiega wszystkie liczby od(n*2)*(1<<n)-1
zera do 0. Wartościi
są generowane przezh/2/n
. Zmiennaj
nie jest już używana, ponieważ równoważna ilość jest uzyskiwana zh%n
. Użycie opcjin*2
umożliwia drukowanie obu linii z tej samej pętli, z pewnym sprytnym multipleksowaniem wputs
instrukcji, aby wydrukować jedną lub dwie nowe linie na końcu wiersza.Zauważ, że mięso to jest w położeniu przyrost
for()
wspornika i dlatego zostanie wykonany poi=h/2/h
.Próbka wyjściowa n = 6:
źródło
i/3|i/3*2
Sztuką jest genialny! Nie spodziewałem się wyrażenia arytmetycznego dla gramatyki.CJam,
3327 bajtówDzięki @ jimmy23013 za grę w golfa z 6 bajtów!
Wypróbuj online!
tło
To jest iteracyjna implementacja algorytmu rekurencyjnego:
Możliwe nachylenia dla n można uzyskać przez dodanie pionowego domina do możliwych pochyleń dla n - 1 i dwóch poziomych domino do możliwych pochyleń dla n - 2 .
W ten sposób liczba przechyleń dla n jest sumą liczb przechyleń dla n - 1 i n - 2 , tj. N- ta liczba Fibonacciego.
Jak to działa
Przykładowy przebieg
źródło
LNli{_'|f\@"——"f\+2/}*\;{_N}/
.f\
nie został jeszcze zaimplementowany w wersji 0.6.2, ale udało mi się połączyć nasze podejścia. Dzięki!Haskell, 89 bajtów
f
jest funkcją, która po podaniu liczby zwraca listę wszystkich wierszy wszystkich możliwych nachyleń Fibonacciego o możliwej długości n. nie ma znaczenia, że zwraca jedną linię, ponieważ obie linie wszystkich nachyleń są takie same.f
Działa poprzez wywołanie rekurencyjne nan-1
in-2
oraz dodanie"|"
i"--"
(odpowiednio) do strun.g
to funkcja, która odpowiada na pytania. w zasadzie wywołujef
dane wejściowe, podwaja każdy ciąg, aby wyświetlał dwie linie i łączył je wszystkimi znakami nowej linii.przykładowe dane wyjściowe:
źródło
CJam,
4237 bajtówLiczę myślniki jako jeden bajt, ponieważ pytanie pozwala zastąpić je myślnikami ASCII.
Wypróbuj online.
Jak to działa
Aby uzyskać wszystkie możliwe nachylenia 2 × L , iterujemy wszystkie nieujemne liczby całkowite I <3 L , dzięki czemu parzyste cyfry w podstawie 3 odpowiadają poziomym domino, a cyfry nieparzyste pionowym.
Ponieważ każde I ma L lub mniej cyfr w podstawie 3, generuje to wszystkie możliwe sposoby pokrycia paska 2 × L. Pozostało tylko odfiltrować pokrycia większe lub mniejsze niż 2 × L i wydrukować pozostałe pokrycia.
Przykładowy przebieg
źródło
3b
. Czy to prawda?JavaScript (E6) 102
Generuj konfiguracje z sekwencji bitów, 0 -> '-' i 1 -> '|'.
Testuj w firefox / firebug console
Wynik
źródło
Haskell: 109 bajtów
To jest tłumaczenie znanego jedno-liniowego Haskella do leniwego obliczania sekwencji liczb Fibonacciego:
Główna sekwencja ciągów kafelków, bez golfa:
I dla porównania jednowarstwowa Fibonacciego:
Przykład użycia:
źródło
Kobra - 176
Nie mogę się doczekać, aż skończę pakiet golfowy Cobra.
źródło
J - 54 znak
Funkcja
n
jako argument po prawej stronie.Głównym źródłem tego golfa jest
(];'--'&,"1@[,'|',"1])&>/
. Pobiera to listę pochyleń długości (N-2) i (N-1) i zwraca listę przechyleń długości (N-1) i N. Jest to standardowa rekurencja Fibonacciego, algebra liniowa.];
zwraca prawą listę jako nową lewą (ponieważ nie ma zmian).'--'&,"1@[
dodaje--
kafelki do lewej listy, a'|',"1]
dodaje|
kafelki do prawej listy, a te razem są nową prawą listą.Powtarzamy to w kółko
n
(to jest to@[&0
) i zaczynamy od pustego kafelka i pojedynczego kafelka o długości 1. Następnie zwracamy pierwszą z pary z0{::
. Oznacza to, że jeśli uruchomimy to zero razy, zwracamy tylko pierwszą, tj. Pustą płytkę. Jeśli wykonamy ton
razy, obliczamy do paryn
i (n
+1), ale odrzucamy tę drugą. To dodatkowa praca, ale mniej znaków.Jest
(1 2$,:)
to coś, co J musi zrobić, aby przechyłki na listach były łatwo rozszerzalne. Sprawiamy, że lewa lista początkowa jest 1-elementową listą 2-wierszowej matrycy znaków, każdy wiersz ma długość 0. Prawa lista początkowa jest taka sama, ale wiersze mają długość 1 i są wypełnione|
. Następnie dodajemy nowe kafelki do każdego wiersza i dołączamy listy macierzy, gdy łączymy ze sobą dwa zestawy nachyleń. Jest to proste zastosowanie pojęcia, które J nazywa rangą: zasadniczo manipuluje wymiarowością swoich argumentów i domyślnie zapętla się w razie potrzeby.Go wypróbować na tryj.tk .
źródło
Python 3: 70 bajtów
Rekurencyjnie buduje wszystkie możliwe ciągi
s
reprezentujące jeden wiersz domin, które są powielane i drukowane. Rozpoczęcies
od znaku nowej linii powoduje, że pusta linia pojawia się automatycznie.==
Między dwoma połączeniami zaf
to tylko, aby wykonać zarówno wywołań funkcji. Zwykle zwracają się,None
ponieważ po prostu drukują i==
są jednym z niewielu zdefiniowanych operatorówNone
.W
and
s ior
s są w celu wytworzenia odpowiedniego zachowania Zwarcie do odtworzeniaif
S ielse
S w kodzie ungolfed.Nie golfowany:
źródło
Siatkówka , 44 bajty
Uwaga: Retina jest młodsza od tego wyzwania.
Pobiera dane wejściowe jednoargumentowe z końcowym znakiem nowej linii.
Każda linia powinna przejść do własnego pliku i
#
powinna zostać zmieniona na nową linię w pliku. Jest to niepraktyczne, ale możesz uruchomić kod w postaci pliku z-s
flagą, zachowując#
znaczniki (i zmieniając znak nowej linii również#
na wejściu). Możesz zmienić#
powrót do nowych linii w wyjściu dla czytelności, jeśli chcesz. Na przykład:Metoda:
1
zmianą na|
i jedną z pierwszymi dwoma1
zmienionymi na--
. Robimy to, dopóki nie będziemy mieć linii z co najmniej dwoma kreskami1
.1
, zmieniliśmy je na|
.źródło