Biorąc pod uwagę listę co najmniej dwóch słów (składających się tylko z małych liter), utwórz i wyświetl drabinkę ASCII słów, zmieniając kierunek pisania najpierw w prawo, a następnie w lewo, w stosunku do początkowego kierunku od lewej do prawej .
Po zakończeniu pisania słowa zmień kierunek i dopiero wtedy zacznij pisać następne słowo.
Jeśli Twój język nie obsługuje list słów lub jest to dla Ciebie wygodniejsze, możesz wziąć dane wejściowe jako ciąg słów oddzielonych pojedynczym odstępem.
Wiodące i końcowe białe znaki są dozwolone.
["hello", "world"]
lub "hello world"
hello
w
o
r
l
d
Tutaj zaczynamy od pisania, hello
a kiedy dochodzimy do następnego słowa (lub w przypadku wprowadzenia jako ciągu - spacja jest znaleziona), zmieniamy względny kierunek w prawo i kontynuujemy pisanieworld
Przypadki testowe:
["another", "test", "string"] or "another test string" ->
another
t
e
s
tstring
["programming", "puzzles", "and", "code", "golf"] or "programming puzzles and code golf" ->
programming
p
u
z
z
l
e
sand
c
o
d
egolf
["a", "single", "a"] or "a single a" ->
a
s
i
n
g
l
ea
Kryteria wygranej
Wygrywa najkrótszy kod w bajtach w każdym języku. Nie daj się zniechęcić językiem golfa!
Odpowiedzi:
Węgiel , 9 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Objaśnienie: Działa poprzez rysowanie tekstu do tyłu, transponowanie płótna po każdym słowie. 10 bajtów na ciąg znaków:
Wypróbuj online! Link jest do pełnej wersji kodu. Objaśnienie: Rysuje tekst do tyłu, przenosząc płótno na spacje.
źródło
C (gcc) ,
947874 bajtów-4 od Johan du Toit
Wypróbuj online!
Drukuje drabinę, jeden znak (wejścia) na raz. Pobiera rozdzielony spacjami ciąg słów.
źródło
*s==32
na,*s<33
aby zapisać bajt.05AB1E ,
1916 bajtów-3 bajty dzięki @Emigna .
Wypróbuj online.
Ogólne wyjaśnienie:
Podobnie jak @Emigna „s 05AB1E odpowiedzi (upewnij upvote go btw !!), używam polecenie wbudowane płótnie
Λ
.Opcje, których używam, są jednak różne (dlatego moja odpowiedź jest dłuższa ...):
b
(ciągi do wydrukowania): pozostawiam pierwszy ciąg na liście bez zmian i dodam znak końcowy do każdego następnego ciągu na liście. Na przykład["abc","def","ghi","jklmno"]
stałby się["abc","cdef","fghi","ijklmno"]
.a
(rozmiary linii): Byłoby to równe tym ciągom, tak[3,4,4,7]
jak w powyższym przykładzie.c
(kierunek drukowania w):,[2,4]
który odwzorowałby na[→,↓,→,↓,→,↓,...]
W powyższym przykładzie krok po kroku wykonaj następujące czynności:
abc
w kierunku2
/→
.cdef
w kierunku4
/↓
(gdzie pierwszy znak nakłada się na ostatni znak, dlatego musieliśmy zmodyfikować listę w ten sposób)fghi
w kierunku2
/→
ponownie (także z nakładaniem się znaków wiodących / wiodących)ijklmno
w kierunku4
/↓
ponownie (także z zakładką)Objaśnienie kodu:
źródło
€θ¨õšsøJ
.€θ¨õšsøJ
sąõIvy«¤})
,õUεXì¤U}
aε¯Jθ줈}
(dwa ostatnie wymagają--no-lazy
). Niestety wszystkie są tej samej długości. Byłoby to znacznie łatwiejsze, gdyby jedna ze zmiennych miała domyślnie""
...""
domyślną wartość … ” Szukaszõ
, czy masz na myśli, czy byłbyX
/Y
/ ? Btw, ładne 13 bajtów w komentarzu do odpowiedzi Emigny. Zupełnie inny niż mój i jego tbh, z podanymi kierunkami .®
""
[→,↙,↓,↗]
õ
nie jest zmienną. Tak, mam na myśli zmienną domyślną""
. Robię to dosłownieõU
na początku jednego z urywków, więc jeśli X (lub inna zmienna) domyślnie""
, domyślnie zapisuje dwa bajty. Dzięki! Tak, ↙↗ jest trochę nowy, ale wpadłem na pomysł, aby przeplatać prawdziwe zapisy o długości 2 manekina z odpowiedzi Emigny.05AB1E ,
1413 bajtówOszczędność 1 bajtu dzięki Grimy
Wypróbuj online!
Wyjaśnienie
źródło
€Y¦
może być2.ý
(nie to, że zaoszczędziłoby to tutaj bajtów). I to pierwszy raz, gdy zobaczyłem nowe zachowanie€
w porównaniu ze zwykłą mapą, które jest przydatne..ý
wcześniej używane, ale nigdy się nie użyłem, więc nie pomyślałem o tym.€
jest dla mnie zwykłą mapą i często jej używam, druga to „nowa” mapa;)Płótno ,
17121110 bajtówWypróbuj tutaj!
Wyjaśnienie:
źródło
JavaScript (ES8),
91 7977 bajtówPobiera dane wejściowe jako tablicę słów.
Wypróbuj online!
Skomentował
źródło
p
do śledzenia zakończeń linii jest bardzo sprytne +1Python 2 , 82 bajty
Wypróbuj online!
źródło
pieprzenie mózgu , 57 bajtów
Wypróbuj online!
Pobiera dane wejściowe jako ciągi rozdzielone NUL. Zauważ, że używa EOF jako 0 i przestanie działać, gdy drabina przekroczy 256 spacji.
Wyjaśnienie:
źródło
.
w wierszu 3 nie ma znaku (w wersji z komentarzem)? Próbowałem grać z wejściem na TIO. Na Macu zmieniłem klawiaturę na wprowadzanie tekstu Unicode i spróbowałem utworzyć nowe granice słów, pisząc,option+0000
ale to nie działało. Masz pomysł, dlaczego nie?-
zamiast.
wyjaśnienia. Aby dodać NUL bajtów w TIO, zalecam użycie konsoli i uruchomienie polecenia podobnego$('#input').value = $('#input').value.replace(/\s/g,"\0");
. Nie wiem, dlaczego twój sposób nie zadziałałJavaScript, 62 bajty
Wypróbuj online!
Dzięki Rick Hitchcock , zapisane 2 bajty.
JavaScript, 65 bajtów
Wypróbuj online!
źródło
t
jea
, a następnie usuwająct=
Aheui (esotop) ,
490458455 bajtówWypróbuj online!
Lekko golfowy za pomocą znaków o pełnej szerokości (2 bajty) zamiast koreańskich (3 bajty).
Wyjaśnienie
Aheui to esolang podobny do befunge. Oto kod z kolorem :? 1 część sprawdza, czy bieżącym znakiem jest spacja, czy nie.
? 2 części sprawdzają, czy słowa pisane były od prawej do lewej lub od góry do dołu.
Część 3 to warunek przerwania pętli, który wpisuje spacje.
? 4 części sprawdzają, czy bieżący znak to koniec linii (-1).
Część czerwona to inicjalizacja stosu. Aheui używa stosów (od
Nothing
doㅎ
: 28 stosów) do przechowywania wartości.Część pomarańczowa pobiera input (
뱋
) i sprawdza, czy jest to spacja, odejmując32
(ascii kod spacji).Zielona część dodaje 1 do stosu, który przechowuje wartość długości przestrzeni, jeśli piszesz od prawej do lewej.
Część fioletowa to pętla do drukowania spacji, w przypadku pisania od góry do dołu.
Część szara sprawdź, czy jest obecny znak
-1
, dodając jeden do bieżącego znaku.Niebieska część drukuje obecną postać i przygotowuje się do następnej postaci.
źródło
Japt
-P
, 15 bajtówSpróbuj
źródło
bash, 119 znaków
Używa sekwencji kontrolnych ANSI do poruszania kursorem - tutaj używam tylko opcji zapisz
\e7
i przywróć\e8
; ale przywracanie musi być poprzedzone znakiem,\n
aby przewinąć dane wyjściowe, jeśli są już na dole terminala. Z jakiegoś powodu nie działa, jeśli nie jesteś jeszcze na dole terminala. * wzrusza ramionami *Bieżący znak
$c
jest izolowany jako ciąg znaków jednego znaku z ciągu wejściowego$w
, przy użyciufor
indeksu pętli$i
jako indeksu w ciągu.Jedyną sztuczką, której tu używam, jest
[ -z $c ]
zwrócenietrue
, tzn. Łańcuch jest pusty, gdy$c
jest spacją, ponieważ nie jest cytowany. Przy prawidłowym użyciu bash, cytujesz testowany ciąg,-z
aby uniknąć dokładnie takiej sytuacji. To pozwala nam odwrócić flagę kierunku$d
pomiędzy1
i0
, która jest następnie używana jako indeks w tablicy sekwencji sterujących ANSI,X
na następnej wartości spacji$c
.Byłbym zainteresowany, aby zobaczyć coś, co wykorzystuje
printf "%${x}s" $c
.O rany, dodajmy trochę białych znaków. Nie widzę gdzie jestem ...
źródło
Perl 6 , 65 bajtów
Wypróbuj online!
Anonimowy blok kodu, który pobiera listę słów i drukuje bezpośrednio do STDOUT.
Wyjaśnienie
źródło
Węgiel drzewny , 19 bajtów
Wprowadź jako listę ciągów
Wypróbuj online (pełne) lub wypróbuj online (czysty)
Wyjaśnienie:
Pętla w zakresie
[0, input-length)
:Jeśli indeks jest nieparzysty:
Wydrukuj ciąg o indeksie
i
w dół:Następnie przesuń kursor raz w prawo w prawym górnym rogu:
W przeciwnym razie (indeks jest parzysty):
Wydrukuj ciąg o indeksie
i
w regularnym prawidłowym kierunku:A następnie przesuń kursor raz w lewy dolny róg:
źródło
Python 2 ,
8988 bajtówWypróbuj online!
źródło
C # (interaktywny kompilator Visual C #) , 122 bajty
Wypróbuj online!
źródło
J ,
474543 bajtówWypróbuj online!
Znalazłem zabawne, inne podejście ...
Zacząłem bawić się w lewe pady i zamki z cyklicznymi gerundami i tak dalej, ale potem zdałem sobie sprawę, że łatwiej byłoby po prostu obliczyć pozycję każdej litery (sprowadza się to do sumy skanowania prawidłowo wybranej tablicy) i zastosować poprawkę
}
do pustego płótno na zniszczonym wejściu.Rozwiązanie obsługiwane jest prawie całkowicie przez Amend
}
:; ( single verb that does all the work ) ]
ogólny widelec;
lewa część niszczy wejście, tzn. umieszcza wszystkie litery w ciągłym ciągu]
właściwa część to sam wkład(stuff)}
używamy formy poprawek gerund}
, która składa się z trzech częściv0`v1`v2
.v0
daje nam „nowe wartości”, czyli „raze” (tzn. wszystkie znaki wejściowe jako jeden ciąg), więc używamy[
.v2
daje nam wartość początkową, którą przekształcamy. chcemy po prostu puste płótno przestrzeni o wymaganych wymiarach.([ ' '"0/ [)
daje nam jeden rozmiar(all chars)x(all chars)
.v1
wybiera pozycje, w których umieścimy nasze zastępcze postacie. To jest sedno logiki ...0 0
w lewym górnym rogu, zauważamy, że każda nowa postać znajduje się albo 1 na prawo od poprzedniej pozycji (tj.prev + 0 1
), Albo jedną w dół (tjprev + 1 0
.). Rzeczywiście robimy pierwsze czasy „długość słowa 1”, a następnie drugie czasy „długość słowa 2” i tak dalej, naprzemiennie. Więc po prostu utworzymy prawidłową sekwencję tych ruchów, a następnie zeskanujemy je i zsumujemy, i będziemy mieli nasze pozycje, które następnie zestawimy, ponieważ tak działa Amend. Poniżej znajduje się tylko mechanika tego pomysłu ...([: <@(+/)\ #&> # # $ 1 - e.@0 1)
#:@1 2
tworzy stałą macierz0 1;1 0
.# $
następnie rozszerza go, aby miał tyle wierszy, co dane wejściowe. np. jeśli dane wejściowe zawierają 3 słowa, które utworzy0 1;1 0;0 1
.#&> #
lewa część tego jest tablicą długości słów wejściowych i#
jest kopiowana, więc kopiuje razy0 1
„długość słowa 1”, a następnie1 0
„długość słowa 2 razy” itd.[: <@(+/)\
robi sumę skanowania i pole.źródło
T-SQL, 185 bajtów
Wypróbuj online
źródło
Siatkówka , 51 bajtów
Wypróbuj online!
Raczej proste podejście, które oznacza każde inne słowo, a następnie stosuje transformację bezpośrednio.
Wyjaśnienie
Oznaczamy każde inne słowo średnikiem, dopasowując każde słowo, ale stosując tylko zamianę na dopasowania (które są indeksowane zerowo), zaczynając od dopasowania 1, a następnie 3 itd.
+(m
ustawia niektóre właściwości dla następujących etapów. Znak plus rozpoczyna pętlę „podczas gdy ta grupa etapów zmienia coś”, a otwarty nawias oznacza, że znak plus powinien obowiązywać na wszystkich kolejnych etapach, dopóki nie pojawi się nawias zamykający przed odwrotnym ruchem (który jest wszystkimi etapami w ta sprawa). Pom
prostu każe wyrażeniu regularnemu leczyć^
jako dopasowanie również od początku linii zamiast od samego początku łańcucha.Rzeczywiste wyrażenie regularne jest dość proste. Po prostu dopasowujemy odpowiednią liczbę elementów przed pierwszym średnikiem, a następnie używamy
*
składni zastępczej Retiny, aby wstawić odpowiednią liczbę spacji.Ten etap jest stosowany po ostatnim, aby usunąć średniki i spacje na końcu słów, które zmieniliśmy na pionowe.
źródło
Retina 0.8.2 , 58 bajtów
Wypróbuj online! Link zawiera przypadki testowe. Alternatywne rozwiązanie, również 58 bajtów:
Wypróbuj online! Link zawiera przypadki testowe.
Celowo nie używam tutaj Retina 1, więc nie otrzymuję operacji na alternatywnych słowach za darmo; zamiast tego mam dwa podejścia. Pierwsze podejście dzieli wszystkie litery na alternatywne słowa, licząc poprzedzające spacje, podczas gdy drugie podejście zastępuje alternatywne spacje nowymi liniami, a następnie wykorzystuje pozostałe spacje, aby pomóc mu podzielić alternatywne słowa na litery. Każde podejście musi następnie połączyć ostatnią literę pionową z następnym poziomym słowem, chociaż kod jest inny, ponieważ dzielą słowa na różne sposoby. Ostatni etap obu podejść następnie wypełnia każdą linię, aż jej pierwszy znak spacji nie zostanie wyrównany pod ostatnim znakiem poprzedniej linii.
Zauważ, że nie zakładam, że słowa to tylko litery, ponieważ nie muszę.
źródło
PowerShell ,
101 8983 bajtów-12 bajtów dzięki mazzy .
Wypróbuj online!
źródło
& $b @p
(każde słowo jako jeden argument), 3) użyć krótszej formy dlanew line
stałej. patrz linia 3,4 na tym przykładziefoo
. zobacz kod .Given a list of at least two words...
PowerShell ,
7465 bajtówWypróbuj online!
źródło
R , 126 bajtów
Wypróbuj online!
źródło
T-SQL, 289 bajtów
Działa to na SQL Server 2016 i innych wersjach.
@ przechowuje listę rozdzielaną spacjami. @I śledzi pozycję indeksu w ciągu. @S śledzi całkowitą liczbę spacji do wcięcia od lewej. @B śledzi, do której osi ciąg jest wyrównany w punkcie @I.
Liczba bajtów obejmuje minimalną listę przykładów. Skrypt przechodzi przez listę, znak po znaku, i zmienia ciąg, aby wyświetlał się zgodnie z wymaganiami. Po osiągnięciu końca ciągu zostanie on WYDRUKOWANY.
źródło
JavaScript (Node.js) , 75 bajtów
Wypróbuj online!
Wyjaśnienia i niepoznany
źródło
Stax , 12 bajtów
Uruchom i debuguj
źródło
Galaretka , 21 bajtów
Wypróbuj online!
Pełny program, który przyjmuje dane wejściowe jako listę ciągów znaków i niejawnie wypisuje je na standardowe słowo drabinkowe.
źródło
C (gcc) ,
9387 bajtówDzięki gastropner za sugestie.
Ta wersja pobiera tablicę ciągów zakończonych wskaźnikiem NULL.
Wypróbuj online!
źródło
Brain-Flak , 152 bajty
Wypróbuj online!
Podejrzewam, że może to być krótsze, łącząc dwie pętle dla nieparzystych i parzystych słów.
źródło
J,
3533 bajtówJest to czasownik, który przyjmuje dane wejściowe jako pojedynczy ciąg znaków ze słowami oddzielonymi spacjami. Na przykład możesz to tak nazwać:
Dane wyjściowe to macierz liter i spacji, które interpreter wyświetla w razie potrzeby z nowymi wierszami. Każda linia będzie wypełniona spacjami, aby miały dokładnie taką samą długość.
Jest jeden drobny problem z kodem: nie zadziała, jeśli dane wejściowe zawierają więcej niż 98 słów. Jeśli chcesz zezwolić na dłuższe dane wejściowe, wymień
_98
kod na,_998
aby zezwolić na maksymalnie 998 słów itp.Pozwól mi wyjaśnić, jak to działa na kilku przykładach.
Załóżmy, że mamy matrycę liter i spacji, które naszym zdaniem są częściowym wynikiem niektórych słów, zaczynając od słowa poziomego.
Jak moglibyśmy wstawić nowe słowo przed tym, w pionie? To nie jest trudne: po prostu zmień nowe słowo na macierz jednokolumnową z czasownikiem
,.
, a następnie dołącz wynik do tej macierzy jednokolumnowej. (Czasownik,.
jest wygodny, ponieważ zachowuje się jak funkcja tożsamości, jeśli zastosujesz go do matrycy, której używamy do gry w golfa.)Teraz nie możemy po prostu powtórzyć tego sposobu wcześniejszego przygotowania słowa, ponieważ wtedy otrzymalibyśmy tylko słowa pionowe. Ale jeśli transponujemy macierz wyjściową między każdym krokiem, wówczas każde inne słowo będzie poziome.
Tak więc naszą pierwszą próbą rozwiązania jest umieszczenie każdego słowa w macierzy jednokolumnowej, a następnie złożenie ich poprzez dołączenie i transpozycję między nimi.
Ale jest z tym duży problem. Spowoduje to umieszczenie pierwszej litery następnego słowa przed obróceniem kąta prostego, ale specyfikacja wymaga obrócenia przed wstawieniem pierwszej litery, więc wynik powinien być mniej więcej taki:
Sposób, w jaki to osiągamy, polega na odwróceniu całego ciągu wejściowego, tak jak w
następnie użyj powyższej procedury, aby zbudować zygzak, ale obracając się dopiero po pierwszej literze każdego słowa:
Następnie odwróć wyjście:
Ale teraz mamy kolejny problem. Jeśli dane wejściowe zawierają nieparzystą liczbę słów, wówczas pierwsze słowo będzie miało pionowe, a specyfikacja mówi, że pierwsze słowo musi być poziome. Aby to naprawić, moje rozwiązanie uzupełnia listę słów dokładnie 98 słowami, dodając puste słowa, ponieważ to nie zmienia wyniku.
źródło