Po wprowadzeniu listy słów wypisz słowa z literami ułożonymi po przekątnej:
p
r
o
p g
u r
z a
a z m
n l m
d e i
c s n
o g
d
g e
o
l
f
(Powyższe powinno być wyjściem dla danych wejściowych programming puzzles and code golf
.)
Mówiąc ściślej, każde słowo zaczyna się w pierwszej kolumnie i trzy rzędy poniżej poprzedniego słowa, a każda kolejna litera przesuwa jedną kolumnę w prawo i jeden wiersz w dół.
Dane wejściowe mogą być dostarczane jako pojedynczy ciąg słów oddzielony dokładnie jedną spacją lub lista / tablica słów. Słowa będą się składać tylko z małych liter a-z
i zawsze będą miały co najmniej jeden znak.
Wynik może być pojedynczym łańcuchem, tablicą linii lub tablicą tablic znaków. Wiodące lub końcowe białe znaki nie są dozwolone, z wyjątkiem pojedynczej nowej linii.
Dalsze przypadki testowe:
a bcd efgh i j
a
b
c
d
e
f
g
i h
j
x
x
verylongword short
v
e
r
s y
h l
o o
r n
t g
w
o
r
d
Ponieważ jest to code-golf , wygra najkrótszy kod w bajtach!
Odpowiedzi:
Vim,
85, 76, 66, 52 naciśnięcia klawiszy / bajtyKiedy po raz pierwszy spojrzałem na to wyzwanie, pomyślałem: „To idealne rozwiązanie dla vima!” A potem, kiedy spróbowałem, wszystko poszło nie tak. Oto wszystko, w całej tej niechlujnej, hackerskiej chwale:
Wypróbuj online, dzięki (głównie) kompatybilnemu wstecznie interpreterowi V.
Wyjaśnienie:
Na początku myślałem, że mogę zrobić tę pięknie prostą 37-bajtową wersję:
Niestety nie jest to takie proste. Weźmy to linia po linii:
Umożliwia to funkcję zwaną „edycją wirtualną”. Pozwala kursorowi przejść do kolumn, które jeszcze nie istnieją. Bez niej odpowiedź byłaby w zasadzie niemożliwa.
Teraz musimy rozdzielić słowa na różne linie. Dlatego zastąpimy każde miejsce 3 nowymi liniami. Ponieważ jest to polecenie ex, możemy je uruchomić jednocześnie z naszym ostatnim poleceniem ex
:se ve=all
, oddzielając je dwoma paskiem.Teraz bufor wygląda następująco:
Tutaj zaczyna się zabawa. Skonfigurowaliśmy tradycyjne makro rekurencyjne za pomocą:,
qq
a następnie nazywamy to:Następnie kończymy makro rekurencyjne za pomocą
@qq@q
. W tym momencie mamy wszystkie przekątne, musimy tylko trochę posprzątać.źródło
Turtlèd ,
2826 bajtówOch, wydaje mi się, że biję język specjalnie zaprojektowany do gry w golfa. to jest wspaniały dzień.
Wypróbuj online!
Wyjaśnienie
(zapis oznacza zapis do komórki na siatce, spiczasty znak oznacza znak na wejściu, na który wskazuje wskaźnik łańcucha)
zwróć uwagę na spację końcową.
Dane wejściowe również wymagają spacji końcowych. widząc, jak Python może pobrać listę, jest to bardzo podobne do pobierania listy w Turtlèd
źródło
MATL , 28 bajtów
Dane wejściowe to tablica komórek z ciągami znaków, z przecinkami jako opcjonalnymi separatorami:
lub
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe: 1 , 2 , 3 , 4 .
Wyjaśnienie
Rozważ następujące dane wejściowe jako przykład:
Możesz zobaczyć wyniki częściowe (zawartość stosu) wstawiając symbol komentarza
%
w dowolnym punkcie kodu. Na przykład wyświetl zawartość stosu po czwartej funkcji (&n
).źródło
JavaScript (ES6),
11810984 bajtówPobiera dane wejściowe jako tablicę słów. Zwraca tablicę tablic znaków.
Alternatywna wersja, 109 bajtów
Zwraca ciąg.
Pokaż fragment kodu
źródło
Common Lisp,
673668597 bajtówOkropne rozwiązanie, wiem. Prawdopodobnie zedytuję to później po pewnym czasie snu.
Stosowanie:
Powoduje to zapętlanie każdego słowa na podanej liście i dodaje odpowiednie znaki do bieżącego wiersza. Odpowiednie wypełnienie zapewnia moje niestosowne użycie
format
.Uwaga: Jestem nowy w Common Lisp, ale wiem wystarczająco dużo, aby zdać sobie sprawę, że przydałoby się to wiele ulepszeń.
źródło
C #, 336 bajtów:
Gra w golfa:
Nie golfowany:
Testowanie:
źródło
Func<string[], string>
i dokonaj różnych innych zmian dla 297 bajtów,s=>{int i=0,x=0,y=0,r=0,l=s.Length,q=2*(s.Max().Length+l)+1,j;var a=new char[q,q];for(;i<l;i++){y=r;for(j=0;j<s[i].Length;)a[y++,x++]=s[i][j++];x=0;r+=3;}var o="";for(;x<q;x++){var t="";for(y=0;y<q;)t+=a[x,y++];o+=t==string.Join("",Enumerable.Repeat('\0',q))?"":(t.TrimEnd('\0')+"\n");}return o;};
jednak musisz dodać 18 bajtów dlausing System.Linq;
i
ij
do deklaracji int na górze i przenosząc niektóre z nich,++
więc są one używane przy ostatnim użyciu zmiennejPython 2, 146 bajtów
Uwaga: wcięcia dla dwóch ostatnich wierszy to
<space>
i<tab>
, co oszczędza jeden bajt, ponieważ nie muszę podwójnego wcięcia.Dane wejściowe należy wprowadzić jako tablicę ciągów takich jak:
["hello", "world"]
lub['hello', 'world']
. Dane wyjściowe to tablica tablic znaków.Prawdopodobnie jest na to lepszy sposób ...
EDYCJA Dzięki Klamce za wskazanie brakującego nawiasu kwadratowego. Umieściłem go przed
*k...
trzecim wierszem.źródło
Mathematica, 146 bajtów
Jestem rozczarowany tym bajtem, ale no cóż.
Definiuje anonimową funkcję, która pobiera listę słów (np.
{"this","that","these"}
) I zwraca dwuwymiarową tablicę znaków. Aby wyświetlić w formie siatki, dodaj//Grid
na końcu.Konwertuje ciągi znaków na tablicę, dodaje dodatkowe linie, transponuje tablicę, poprzedza niezbędne zmiany, a następnie transponuje ponownie.
Przykładowy wynik (sformatowany jako siatka):
źródło
Galaretka , 24 bajty
Wypróbuj online!
W jaki sposób?
źródło
Python 2, 182 bajty
Nieco długi, ale po stronie dodatniej, zwraca ciąg bez końcowych białych spacji w każdej linii i bez końcowych białych spacji lub zwraca na końcu; ograniczenia, których niektóre inne wpisy nie przestrzegają.
Lista słów jest przekazywana do funkcji; niektóre „puste” miejsca są dodawane do tej listy, a następnie algorytm odwzorowuje wiersz, parę kolumn na słowoNumer, znakNumer na rozwiniętej liście. (Jest to odwrotność zwykłej strategii obserwowanej w innych rozwiązaniach).
Jeśli zezwolimy na końcowe białe znaki na wszystkich liniach oprócz ostatniej, możemy zrobić trochę lepiej (163 bajty):
źródło
q / kdb +,
13010994908684 bajtówRozwiązanie:
Przykłady:
Objaśnienie (bez golfa):
Podstawową zasadą jest utworzenie wiązki ciągów o równej długości z ciągu wejściowego, odwrócenie (obrócenie), a następnie dodanie odpowiedniej białej spacji, aby uzyskać coś, co wygląda następująco:
który jest ponownie odwracany i drukowany na standardowe wyjście.
Oto podział koncepcji linia po linii:
Uwagi:
Kilka sposobów na zmniejszenie niektórych (11) łatwych bajtów, jeśli naprawdę chcemy:
f:
i pozostawiając jako funkcję anonimową-1
i;
i powrocie listę ciągów zamiast drukować do stdoutEdycje:
rtrim
aby znaleźć maksymalną długość do padu, usunięto potrzebę przechowywaniaC
zmiennejmax count each
funkcję lambda,a
która jest tworzona raz i używana dwa razyraze
do funkcji lambda, aby zapisaćraze each
(+)
jako skrót dlaflip
źródło
Węgiel drzewny ,
169 bajtówMoja pierwsza odpowiedź na węgiel drzewny. Dzięki @DLosc za sugestie
P
iM
zamiast używaniaS
iJ
(Jump), aby wrócić do początku linii (i trzy w dół).Wypróbuj online (pełny) lub Wypróbuj online (czysty) .
Wyjaśnienie:
Pętla, gdy jest jeszcze następny ciąg wejściowy:
Wydrukuj ten ciąg bez przesuwania kursora w prawo-dół:
Następnie przejdź o trzy pozycje w dół do następnej iteracji:
źródło
θ
zmienna reprezentuje pierwsze wejście, więc po prostu przypisuję wejście testowe do tej zmiennej w nagłówku, a następnie piszę resztę kodu, abyś mógł pozbyć sięα
zmiennej i iterować podzielone elementyθ
. Wypróbuj online! (Nie konkuruje z powodu wiodących miejsc.)Japt
-Rx
,171613 bajtówPobiera dane wejściowe jako tablicę słów. Jeśli końcowe białe znaki w każdej linii byłyby dozwolone, można usunąć 4 ostatnie znaki, aby powiązać je z roztworem węgla drzewnego.
Wypróbuj lub uruchom wszystkie przypadki testowe
Wyjaśnienie
źródło
K4 , 58 bajtów
Rozwiązanie:
Przykłady:
Wyjaśnienie:
Ciągi prawego pada, aby były tej samej długości, transponuj, łącz, za pomocą
" "
lewego pada, aby wygenerować przekątne, a następnie prawego pada, aby skorygować długości i transponować z powrotem. Pobiera listę ciągów i zwraca listę ciągów. Prawdopodobnie gra w golfa, ale wciąż jest krótszy niż moje rozwiązanie q / kdb +.źródło
Perl 6 , 73 bajtów
Wypróbuj online!
Argument wejściowy to lista słów. Dane wyjściowe to tablica znaków.
źródło
PHP , 100 bajtów
Wypróbuj online!
źródło