Oto trzecie miasto ABACABA:
_
A|_|
B|__|
A|_|_
C|___|
A|_|
B|__|
A|_|
Jest on wykonany z sekwencji ABACABA , która jest w zasadzie:
- A (pierwsza iteracja)
- miejsce B - AB
- powtórz A - ABA (2. iteracja)
- Miejsce C - ABAC
- Powtórz ABA - ABACABA (3. iteracja)
i masz pomysł.
Budynki mają wysokość (odpowiadającą liczbie znaków podkreślenia) równą literom zamienionym na liczby jako A = 1, B = 2 itd.
Wejście
Liczba iteracji 1 <= n <= 26.
Wynik
Miasto ABACABA rzędu n , w tym litery na początku wiersza.
Odpowiedzi:
Python 2, 82 bajty
Zauważyłem, że nikt nie opublikował metody rekurencji binarnej i postanowiłem spróbować ... a teraz, dzięki sztuczce zapożyczonej z Sherlocka9, jest to najkrótsza odpowiedź na pytanie w pythonie! (Ponadto, dzięki xnor za jeszcze jedno skrócenie.) (A potem Dennis, który ogolił garść więcej ...)
Nie golfowany:
źródło
s
, i ustawiając drugą linię jako funkcjęf=lambda n:n*"?"and f(n-1)+"_"*(n-2)+"\n%c|%s|"%(64+n,"_"*n)+f(n-1);lambda n:" _"+f(n)
f=lambda n,s=1:n*"_"and" _"*s+f(n-1,0)+"_"*(n-2)+"\n%c|%s|"%(64+n,"_"*n)+f(n-1,0)
powinna działać.Python 2, 99 bajtów
Aby znaleźć
i
numer th sekwencji ABACABA, piszi
w formacie binarnym, policz liczbę końcowych zer i dodaj jeden. Używamy klasycznej sztuczki bitoweji&-i
do znalezienia największej potęgi2
tego podziałui
, a następnie obliczamy długość bitu. Tak naprawdę liczymyi
od2**n-1
do0
, co jest w porządku, ponieważ sekwencja ABACABA jest symetryczna.Śledzimy zarówno bieżącą, jak i ostatnią liczbę sekwencji za pomocą „poprzedniej” zmiennej
b
. To pokazuje nam, ile znaków podkreślenia należy wydrukować jako „zwis”. Ostateczny budynek jest rysowany poprawnie bez zwisu, ponieważ0
jest traktowany jako bitowy1
.Format ciągu do drukowania jest pobierany ze Sp3000 , podobnie jak sztuczka polegająca
input
na wydrukowaniu pierwszego wiersza.źródło
MATL , 59 bajtów
Używa bieżącej wersji (15.0.0) języka.
Wypróbuj online!
(Jeśli litery nie musiałyby być zawarte w danych wyjściowych: działałyby następujące, 48 bajtów):
Wyjaśnienie
źródło
CJam,
3735 bajtówJest to iteracyjna implementacja algorytmu rekurencyjnego z odpowiedzi @ quintopia .
Wypróbuj online!
Jak to działa
źródło
JavaScript (ES6), 162 bajty
Gdzie
\n
jest dosłowny znak nowej linii.źródło
\n
jest na końcu, jeśli ktoś się zastanawia.Python 2,
123121 bajtówlink ideone (-2 bajty dzięki @xsot)
f
generuje sekwencję ABACABA jako listę liczb, npf(3) = [1, 2, 1, 3, 1, 2, 1]
. Przesunięcie danych wejściowych o 1 w porównaniu do wyzwania sekwencji ABACABA pozwala nam zagrać w bajtf
.Pierwszy wiersz jest drukowany osobno, a następnie wszystkie inne wiersze są drukowane przy użyciu wyrażenia uwzględniającego bieżący numer i następny numer. Dla zabawy pierwsza linia jest drukowana przy użyciu
input()
.źródło
[0]
zL
.Pyth -
6462 bajtyPrawdopodobnie można by grać w golfa więcej, ale na razie wystarczy.
Wypróbuj tutaj!
Wyjaśnienie:
źródło
Python 3.5 -
262236220 bajtów:-16 bajtów dzięki @CatsAreFluffy! Moja cała funkcja może teraz być wreszcie w jednym wierszu! :)
Może być trochę długi i może drukować nowe linie między budynkami, ale robi to, czego potrzebuje. Możesz to przetestować samodzielnie, aby to potwierdzić.EDYTOWAĆ:
Mój poprzedni kod w golfa nie wydrukował właściwie żadnego wzoru. Jednak teraz ten pokazany powyżej ma i moim zdaniem robi to dobrze. Możesz również uruchomić go dla siebie, aby to potwierdzić.
Uwaga: Program drukuje wszystkie małe litery za każdym „budynkiem”. Mam nadzieję, że to w porządku.
Wersja bez golfa z Objaśnieniem:
Zasadniczo to, co robię, to najpierw zaimportować funkcję Uporządkowanego słownika modułu kolekcji, a następnie utworzyć uporządkowany słownik, przy czym każda mała litera na liście „j” jest przypisana do odpowiedniego budynku, z odpowiednią długością w podkreśleniach. Następnie obliczam sekwencję, na podstawie danych wejściowych użytkownika, używając
f=lambda w:"a"[w:]or f(w-1)+j[w]+f(w-1)
funkcji, a następnie na podstawie sekwencji zwróconej przez to, budynki, z odpowiadającymi im literami, są drukowane.źródło
OrderedDict
jakoo
zamiast? I zmieniaop
sięp
iitem
doj
roboty też.if
(wszystkie dane wejściowe to 1≤v≤26), zmienićrange(26)
narange(v)
i użyćreturn"\n".join(f(v))
zamiastfor
.from collections import*
io=OrderedDict
zamiastfrom collections import OrderedDict as o
range(26)
narange(v)
wyniki wIndex Error
. Ponadto, robireturn"\n".join(f(v))
tylko zwraca sekwencję, ale nie same budynki. Poza tym twoje wskazówki były całkiem dobre. Dzięki! :)Ruby, 129 bajtów
Funkcja anonimowa zwraca ciąg wielowierszowy.
źródło
JavaScript (ES6), 143
W backtickach znajdują się 2 nowe linie, które są znaczące i zostały policzone.
... lub 138, jeśli litery mogą być małe.
Mniej golfa
Test
źródło
PowerShell, 67 bajtów
źródło