Napisz program lub funkcję, która przyjmuje ciąg znaków, który ma gwarantować, że zawiera tylko drukowalne znaki ASCII z wyjątkiem spacji i ma być dodatnią liczbą trójkątną (1, 3, 6, 10, 15, ...).
Wydrukuj lub zwróć ten sam ciąg, ale w kształcie trójkąta, używając spacji. Niektóre przykłady najlepiej pokażą, co mam na myśli:
Jeśli wejście jest, R
wtedy wyjście będzie
R
Jeśli wejście jest, cat
wtedy wyjście będzie
c
a t
Jeśli wejście jest, monk3y
wtedy wyjście będzie
m
o n
k 3 y
Jeśli wejście jest, meanIngfu1
wtedy wyjście będzie
m
e a
n I n
g f u 1
Jeśli wejście jest, ^/\/|\/[]\
wtedy wyjście będzie
^
/ \
/ | \
/ [ ] \
Jeśli dane wejściowe to
Thisrunofcharactersismeanttohavealengththatcanbeexpressedasatriangularnumber.Diditwork?Youtellme,Ican'tcountverywell,ok?
wtedy wyjście będzie
T
h i
s r u
n o f c
h a r a c
t e r s i s
m e a n t t o
h a v e a l e n
g t h t h a t c a
n b e e x p r e s s
e d a s a t r i a n g
u l a r n u m b e r . D
i d i t w o r k ? Y o u t
e l l m e , I c a n ' t c o
u n t v e r y w e l l , o k ?
Zasadniczo nowe linie są wstawiane między podłańcuchy o długości trójkąta, spacje są dodawane między wszystkimi znakami, a każda linia jest wcięta spacjami, aby pasowały do kształtu trójkąta.
Pojedynczy znak nowej linii i linie ze znakami spacji są opcjonalnie dozwolone, ale w przeciwnym razie dane wyjściowe powinny dokładnie pasować do tych przykładów. Ostatnia linia trójkąta nie powinna mieć spacji wiodących.
Najkrótszy kod w bajtach wygrywa.
Odpowiedzi:
Pyth, 22 bajty
Wypróbuj online: pakiet demonstracyjny lub testowy
Wyjaśnienie:
źródło
Python, 81 bajtów
Funkcja rekurencyjna. Idzie od końca
s
, odcinając i drukując postacie. Liczba znaków do pobrania jest obliczana na podstawie długościs
. Funkcja jest skonfigurowana do drukowania w odwrotnej kolejności wywołań rekurencyjnych, które kończą się, gdys
jest pusta, a następnie rozwiązują z powrotem linię. Każda warstwa, prefiksp
ma dodatkową przestrzeń.W Pythonie 3
if
można to zrobić przez zwarcie, choć nie wydaje się, aby zapisywało znaki:Równie długa alternatywa z łańcuchem nierówności:
Zarówno
print
if
powrótNone
, co jest trudne w użyciu.źródło
Retina ,
1081029487826463 bajtyDzięki Sp3000 za zmuszenie mnie do kontynuowania mojego oryginalnego podejścia, co spowodowało zmniejszenie liczby bajtów ze 108 do 82.
Ogromne podziękowania dla Kobi, który znalazł znacznie bardziej eleganckie rozwiązanie, które pozwoliło mi zaoszczędzić kolejne 19 bajtów.
Gdzie
<space>
reprezentuje pojedynczy znak spacji (który w innym przypadku zostałby usunięty przez SE). Do celów zliczania każda linia przechodzi do osobnego pliku i\n
powinna zostać zastąpiona rzeczywistym znakiem linii. Dla wygody możesz uruchomić kod z jednego pliku z-s
flagą.Wypróbuj online.
Wyjaśnienie
Cóż ... jak zwykle nie mogę tutaj podać pełnego opisu grup równoważących. Aby uzyskać podkład, zobacz moją odpowiedź Przepełnienie stosu .
Pierwszy etap to etap
S
plitowania, który dzieli wkład na linie o coraz większej długości._
Wskazuje, że puste kawałki powinny być pominięte z podziału (który tylko wpływa na koniec, bo nie będzie to mecz w ostatniej pozycji). Sam regex jest całkowicie zawarty w rozejrzeniu, więc nie będzie pasował do żadnych znaków, a jedynie do pozycji.Ta część oparta jest na rozwiązaniu Kobi z pewną dodatkową golfistą, którą znalazłem. Zauważ, że lookbehinds są dopasowane od prawej do lewej w .NET, więc poniższe wyjaśnienie najlepiej jest przeczytać od dołu do góry. Do
\G
wyjaśnienia dodałem także inne, chociaż nie jest to konieczne, aby wzorzec zadziałał.Nadal podziwiam tu pracę Kobiego. Jest to nawet bardziej eleganckie niż regex pierwszego testu. :)
Przejdźmy do następnego etapu:
Proste: wstaw spację po każdym znaku nieliniowym.
Ten ostatni etap prawidłowo wcina wszystkie linie, tworząc trójkąt. Jest
m
to zwykły tryb multilinii, który^
dopasowuje początek linii.+
Mówi Retina powtórzyć ten etap aż łańcuch zatrzyma się zmienia (co w tym przypadku oznacza, że regex nie pasuje już).To pasuje do początku dowolnej linii, która nie ma większego wcięcia niż następna. W każdej takiej pozycji wstawiamy spację. Proces ten kończy się, gdy linie zostaną ułożone w czysty trójkąt, ponieważ jest to minimalny układ, w którym każda linia ma większe wcięcie niż następna.
źródło
Cukierki ,
675957 bajtów&iZ1-=yZ1+Z*2/>{0g}0=z@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j
&1-8*1+r1-2/=y@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j
&8*7-r1-2/=y@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j
lub:
długa forma:
źródło
CJam,
2726 bajtówDzięki Sp3000 za oszczędność 1 bajtu.
Zaskakująco blisko Pyth, zobaczmy, czy można grać w golfa ...Sprawdź to tutaj.
Wyjaśnienie
źródło
'
naS
???S
jest łańcuchem, a nie znakiem, więc zamapujef
ten łańcuch zamiast listy linii.Ruby,
847773 bajtów77 bajtów
Zmniejszono kilka dodatkowych bajtów, usuwając zmienną,
r
jak sugeruje steveverrill.84 bajtów
Nie golfowany:
Najpierw obliczamy liczbę trójkątną z ciągu wejściowego
tzn. na przykład rozmiar łańcucha wejściowego wynosi 120, a nasza liczba trójkątna n będzie wynosić 15.
W powyższym wierszu wypisuje spacje, a następnie serię ciągów, które są pobierane z ciągu wejściowego przy użyciu następującego wzorca
[[0,0],[1,2],[3,5],[6,9]]
Stosowanie:
źródło
upto
że nie wymaga liczb całkowitych (ztimes
pewnością tak.) Włączyłem część twojej składni do wersji mojej odpowiedzi. Największą wskazówką, jaką mam dla ciebie, jest to, że nie potrzebujesz tej zmiennejr
. Wystarczy użyć,
zamiast,..
a liczba po przecinku to całkowita liczba elementów do zwrócenia, a nie koniec zakresu.Pyth, 27 bajtów
Pakiet testowy
Ciekawe podejście - konieczne i użyteczne
.I
. Prawdopodobnie gra w golfa.źródło
C,
138136134 bajtówPobiera ciąg jako dane wejściowe:
źródło
printf(" ")
oraz zaprintf("\n")
pomocąputs(" ")
iputs("\n")
. Każda zamiana pozwoli Ci zaoszczędzić 2 bajty. :)Podejście Ruby 2 rev 1, 76 bajtów
Zoptymalizowany przy użyciu pomysłów na składnię z odpowiedzi Vasu Adari oraz kilku własnych zwrotów akcji.
Podejście Ruby 2 rev 0, 93 bajty
Zupełnie inne podejście. Najpierw dodajemy spacje między znakami wejścia. Następnie drukujemy rzędy linia po linii.
Podejście Ruby 1, 94 bajty
skończyło się to znacznie dłużej niż oczekiwano.
w
zawiera liczbę znaków do wydrukowania w dolnym rzędzie lub równoważnie liczbę wierszy.Każdy wiersz zawiera
w
znaki białych znaków (ostatnim z nich jest nowy wiersz), więc pomysł polega na wydrukowaniu tych białych znaków i wstawieniu znaków do wydruku w razie potrzeby.źródło
Minkolang 0,14 , 42 bajty
Wypróbuj tutaj.
Wyjaśnienie
źródło
Python 2,
8885 bajtówDzięki xnor za zapisanie 3 bajtów.
źródło
s
obliczeń liczby miejsc?S=s=raw_input()
?CJam, 50 bajtów
Wypróbuj tutaj.
Wyjaśnienie
źródło
JavaScript (ES6), 135 bajtów
De-golf + wersja demo:
źródło
for (s = j = 0; j < w.length; j += s++);
? Ponadto w środku<pre>
możesz użyć\n
zamiast<br>
. Zapomniałeś też wspomnieć, że to ES6.Java,
258194Gra w golfa:
Nie golfowany:
Wyjście programu:
źródło
import static System.out;
ma 25 bajtów iSystem.
7 bajtów. Używa się go trzy razy, a 21 <25, więc zwiększyłby rozmiar o 4 bajty. Dobry ołów, jednak import statyczny może zaoszczędzić miejsce i nie wszyscy o nim wiedzą.JavaScript (ES6), 106 bajtów
Używa rekurencji zamiast pętli for do budowania łańcucha.
Aby znaleźć długość najdłuższego rzędu, użyj wzoru na n-ty trójkątny numer
T_n
toT_n = (n^2 + n)/2
. Biorąc pod uwagęn
i rozwiązującT_n
zastosowanie formuły kwadratowej, mamy:Okazuje się, że po posadzce dodanie 1/4 do pierwiastka kwadratowego nie zmienia wyniku, stąd wzór na najdłuższy rząd
Math.sqrt(2*a.length)|0
.źródło
TeaScript , 44 bajty
Używa tej samej metody co moja odpowiedź JavaScript , ale jest o wiele krótsza.
Bez golfa
źródło
PowerShell, 69 bajtów
Skrypt testu mniej golfowego:
Wynik:
źródło
C #, 202
Nie wiem, czy jest to legalne w code-golfie, ale czy przekazanie listy w funkcji ma znaczenie? Nie mogę znaleźć sposobu, aby to powtórzyć bez zadeklarowania List <string> poza funkcją, więc umieściłem to jako parametr.
Stosowanie:
źródło
C, 102 bajty
źródło
Bash + sed, 87
źródło
R, 142 bajty
Jestem całkiem pewien, że mogę to jeszcze bardziej obniżyć. Nadal nad tym pracuję. Czuję, że brakuje mi łatwej rekurencji - ale nie byłem w stanie jej odpowiednio skrócić.
bez golfa
źródło
05AB1E , 11 bajtów
Wypróbuj online!
źródło