Zainspirowany kafelkami Domino Fibonacciego , ten problem polega na generowaniu sztuki ASCII reprezentującej kolejną znaną sekwencję kombinatoryczną.
Góra schemat n kroków jest rysunkiem z gór, stosując dokładnie n „/” i n „\” znaków, tak że znaki szkic ciągłą krzywą, która nigdy nie wchodzi poniżej początkowej „wysokości”. Na przykład,
/\/\
/\/ \
i
/\
/\/ \/\
są to 4-stopniowe diagramy górskie, ale
/\ /\/\
\/
nie jest.
Wejście
Program powinien zaakceptować liczbę całkowitą n ze standardowego wejścia lub jako parametr funkcji.
Wynik
Wydrukuj wszystkie n- stopniowe diagramy górskie na standardowe wyjście. Diagramy mogą być w dowolnej kolejności, ale powinny być oddzielone białą spacją. Możesz zdecydować, czy różne diagramy będą wyświetlane w poziomie, w pionie itp.
Podobnie jak w przypadku problemu z kafelkami domina, możesz użyć dowolnej białej spacji. Obejmuje to dodatkowe znaki nowego wiersza przed wydrukiem lub po nim.
Przykład
Niektóre przykładowe prawidłowe dane wyjściowe dla n = 3:
Prawidłowe wyjście A:
/\
/\ /\ / \ /\/\
/\/\/\ / \/\ /\/ \ / \ / \
Prawidłowe wyjście B:
/\
/\/ \
/\/\
/ \
/\/\/\
/\
/ \
/ \
/\
/ \/\
Prawidłowe wyjście C:
/\
/ \ /\
/ \ /\/ \
/\/\
/\ / \
/ \/\ /\/\/\
To jest kod golfowy; najkrótszy program (w bajtach) wygrywa.
źródło
Odpowiedzi:
Python 2: 151 znaków
Wow, to jest bałagan.
Pierwszym pomysłem jest użycie liczb
0 to 2**N-1
do zakodowania wszystkich sekwencjiN
ruchów w górę i w dół w ich bitach. Odczytujemy te bity jeden po drugim, powtarzając%2
i/2
powtarzając wexec
pętli.Przechowujemy pasmo górskie z boku w transponowanej liście ciągów
L
. Za każdym razem generujemy nowy rząd spacji zamieniamy jedno miejsce w nowym rzędzie na/
lub w\
zależności od tego, czy nastąpił ruch w górę, czy w dół.Indeks tej przestrzeni to
c
spacje od końca, gdziec
jest wysokość robocza. Robienie tego z przodu sprawiłoby, że góry były do góry nogami.b
Przesuwamy go dalej, aby wyrównać ruchy w górę i w dół[b-c]
. Począwszyc
od 1 zamiast 0 naprawia błąd off-by-one.Aby wyeliminować przypadki, w których
c
spadki poniżej wartości początkowej1
, kiedy tak się dzieje, ustawiamyi
na0
, co powoduje, że wszystkie dalsze ruchy są w dół, przez coc
stają się bardziej negatywne. Następnie, gdy sprawdzamy, czyc
skończył się w1
, sprawdzamy również, czyc
kiedykolwiek spadł poniżej. My tylkoprint
pasmo górskie, jeślic
jest1
.Aby wydrukować, wykonujemy
zip(*L)
transpozycję zakresu z pionowego na poziomy i drukujemy każdy połączony ciąg. Wiele problemów w tej odpowiedzi wynikało z tego, że Python traktuje ciągi jako niezmienne, więc pracowaliśmy z nimi jako listami znaków i połączyliśmy je w ciągi do drukowania.Dzięki @flornquake za pomoc i ulepszenia.
źródło
' '
zamiast," "
jeśli chcesz używać pętliexec
. :) Przy okazji, nie musisz uciekać przed odwrotnym ukośnikiem.' '
i próbowałem zastąpić ciąg cudzysłowami zmienną. To wciąż dawało indeks poza zakresem:for _ in[0]*N:exec("b=i%2;c+=2*b-1;L+=[[" "]*N];L[-1][b-c]='\\/'[b];i=i//2*(c>0);")
exec("b=i%2;c+=2*b-1;L+=[[' ']*N];L[-1][b-c]='\\/'[b];i=i//2*(c>0);")
, tzn. Wewnętrzne cytaty muszą różnić się od zewnętrznych.APL (88)
Dane wyjściowe dla
n=3
:Wyjaśnienie:
(N/2)⊤⍳2*N←2×⍵
: uzyskaj pole bitowe dla każdej liczby od0
do2^⍵
.Z←↓⍉¯1+2×
: pomnóż przez 2 i odejmij 1, dając1
w górę i-1
w dół. Przechowuj wektor wektorów, każdy wektor zawierający reprezentację dla jednej liczby, wZ
.{
...}¨Z
: dla każdego elementuZ
:∧/0≤+\⍵
: sprawdź, czy suma bieżąca nigdy nie spada poniżej0
(nie schodzi poniżej poziomu gruntu),(0=+/⍵)
: i że całkowita suma wynosi0
(kończy się na poziomie gruntu).{
...}¨Z/⍨
: wybierz te elementy,Z
dla których to prawda. Dla każdego z nich:K←(⍵≠1)++\⍵
: znajdź wysokość każdej postaci i zapiszK
. Podnieś każdy\
z nich, tak aby odpowiednio dopasował się do/
s. To sprawia, że wysokość gruntu1
.¯1+2×K=⊂⌽⍳⌈/K
: dla każdej kolumny utwórz listę[1..max(K)]
i zaznacz pozycję znaku w tej kolumnie za pomocą,1
a resztę jako-1
. (Replikacja przez -1 wypełnia tę pozycję spacją.)'\/'[1+⍵=1]/⍨¨
: znajdź poprawny znak dla każdej kolumny i powtórz go według listy dla tej kolumny.⍉↑
: zamień wynik w matrycę i umieść go po prawej stronieźródło
Python,
261241236 znakówZaczyna się to długo
n=5
i dłużej ...źródło
JavaScript (ES6) 159
163Podobnie jak moja odpowiedź na płytki Fibonacciego Domino, badam wszystkie sekwencje n + n bitów, z 1 oznaczeniem „/” i 0 oznaczeniem „\” (tylko dla wyjścia, „2” jest później dodawany, aby zaznaczyć nowy wiersz) . Budując wzór ascii sprawdzam równowagę - te same liczby 0 i 1 i nigdy nie schodząc poniżej linii bazowej - i wypisuję to, co jest zgodne z regułami.
Wyjście wykonane z „alert”, co jest standardem dla kodegolfa JS, ale dość denerwujące i być może niezgodne z regułami. Przy użyciu console.log liczba znaków wynosi 165.
Mniej golfa
Przetestuj w konsoli FireFox / FireBug.
Wynik
źródło
-b-b
i-n-n
zamiast-2*b
?2*b+1
->b-~b
)CJam, 84 bajty
Zauważ, że ten program drukuje góry w nieskończonej pętli, więc tłumacz online ci nie pomoże; wywołaj w wierszu poleceń, używając
lub spróbuj użyć online
i po prostu kilka razy z rzędu nacisnąłem przycisk Uruchom i wyobraźcie sobie, że wynik jest połączony.
Podstawową ideą jest to, że wiemy, że pasmo górskie o wielkości Q ma Q każdego przejścia w górę i w dół.
Następnie, jeśli jest poprawny, drukujemy go, a jeśli nie, usuwamy go ze stosu, aby się nie przepełnił.
Trasa drukowania w zasadzie buduje każdą kolumnę jako odstępy Q - wysokość, następnie symbol, a następnie wystarczająco dużo spacji, aby trafić Q + 1 znaków ogółem, a następnie transponujemy i drukujemy linie z nowymi liniami między nimi.
źródło
C 179
wykluczając niepotrzebne białe znaki.
Podobna strategia do edc65. Przeglądam wszystkie
n*2
-bitowe wartości binarne, biorąc pod uwagę/
= 1 i\
= 0.n
Formatuję pojedynczy ciąg zawierający podziały wierszy dla każdegon*3
znaku. Jak napisano, ciąg zawiera 1000 znaków, więc po górze zwykle drukowanych jest wiele białych znaków. (Można to naprawić, dodającs[n*n*3]=0
przedputs
.) W każdym razie pozwala mi to wyprowadzić całą górę za jednym razemputs
po sprawdzeniu, czy jest zgodna z regułami.Spróbuję później przekonwertować go na funkcję i zredukować do pojedynczej
for
pętli.Wyjście (zwróć uwagę na dużą ilość białych znaków po prawej stronie)
źródło
Haskell, 140 bajtów
Po kilku próbach niemożności gry w golfa skończyłem z tą implementacją Haskell. Cieszę się, że jestem w odległości 2-krotności rozwiązania APL!
Rozwiązanie w golfa:
Nie golfił i skomentował:
Program rekurencyjnie tworzy zestaw n- krokowych diagramów górskich. Każdy diagram jest reprezentowany przez listę nieskończenie długich łańcuchów, reprezentujących górę narysowaną bokiem, a następnie spacje rozciągające się do nieskończoności. Zapewnia to, że wszystkie diagramy mają tę samą wysokość, co ułatwia rekurencję. Drukarka górska akceptuje parametr, który przycina wysokość do skończonej wartości.
Przykładowe użycie:
źródło
GolfScript 103 ( wersja demo )
Program przyjmuje parametr liczby całkowitej, który próbuje renderować jako góry wszystkie binarne reprezentacje liczb od 0 do 2 ^ (n-1). Nie wyświetla niepoprawnych kombinacji (np. Tych, które schodzą poniżej poziomu 0).
źródło