Jak skręca się sznurki
Algorytm skręcania jest bardzo prosty. Każda kolumna jest przesunięta w dół o indeks (kolumna 0 przesuwa się w dół 0, kolumna 1 przesuwa się 1, ...). Przesunięcie kolumny zawija się do góry. Działa to tak:
aaaa
bbbb
cccc
Staje się:
a
ba
cba
----
cba
cb
c
Wszystko pod linią zawija się do góry. Prawdziwy przykład:
Original:
\\\\\\\\\\\\
............
............
............
Twisted:
\...\...\...
.\...\...\..
..\...\...\.
...\...\...\
Wkład
Dane wejściowe to tablica ciągów lub ciąg wielu wierszy. Wszystkie linie mają tę samą długość.
Wydajność
Skręcona struna, wyjście wieloliniowe do wyjścia standardowego (lub najbliższej alternatywy).
Przykłady:
( >
oznacza wejście, spacja jest ważna)
>Hello, world!
>I am another
>string to be
>twisted!
Hwrmoe oo br!
Ieii ,dttr e
s lsna !ohl
ttaltgnw ed
>\\\\\\\\\\\\
>............
>............
>............
\...\...\...
.\...\...\..
..\...\...\.
...\...\...\
>abcdefg
>.......
a.c.e.g
.b.d.f.
>abcdefghij
>..........
>..........
a..d..g..j
.b..e..h..
..c..f..i.
>\\\\.....././
>...../.......
>........././.
>..../.^\\....
\.........../
.\....^..../.
..\../.\../..
...\/...\/...
>cdeab
>deabc
>eabcd
>abcde
cbbbb
ddccc
eeedd
aaaae
>aeimquy37
>bfjnrvz48
>cgkosw159
>dhlptx260
ahknqx147
beloru258
cfipsvy69
dgjmtwz30
>abcdefghi
>jklmnopqr
>stuvwxyz1
>234567890
a3ume7yqi
jb4vnf8zr
skc5wog91
2tld6xph0
Odpowiedzi:
Brachylog , 5 bajtów
Wypróbuj online!
Pobiera dane wejściowe jako tablicę kolumn (która wydaje się być zgodna ze specyfikacją pytania).
iᵇ
- Dla każdego elementu w tablicy sparuj go z jego indeksem (opartym na 0)ᵐ
- zamapuj predykat na każdy element wyniku:↻₎
- permutuj (kolumna) cyklicznie o wartość określoną jako ostatni element (indeks)Łatwo rozszerzony do wersji, która akceptuje pojedynczy ciąg multilinii:
13 bajtów
Wypróbuj online!
źródło
Pyth, 11
Wypróbuj tutaj
źródło
APL (Dyalog) , 7 bajtów
Wymaga
⎕io←0
Wypróbuj online!
⍬⍋⍉
pobiera zakres od 0 do liczby kolumn⊖
odwraca pionowo⊖⊖⍨⍬⍋⍉
obraca (pionowo) odwrócone wejście (pionowo) o0,1..
⊖
odwrócenie tego i zwraca to.źródło
Retina ,
1111019287 bajtówLiczba bajtów zakłada kodowanie ISO 8859-1.
Woo, rozwiązałem to w pojedynczej zamianie wyrażeń regularnych. :) (Szanse są, istnieje krótsze rozwiązanie przy użyciu kilku, ale gdzie jest zabawa ...)
Wypróbuj online!
Wyjaśnienie
Wymaga to podstawowej wiedzy na temat grup bilansujących . Krótko mówiąc, smak wyrażenia regularnego .NET pozwala przechwytywać wiele razy w jednej grupie, wypychając wszystkie przechwytywania na stos. Z tego stosu można również wyskoczyć, co pozwala nam używać go do zliczania rzeczy w wyrażeniu regularnym.
To popycha jedno przechwycenie do obu grup
1
i2
dla każdej postaci przed meczem (w bieżącym wierszu). Oznacza to, że liczy pozycję poziomą meczu.Reszta jest w zasięgu wzroku:
Dopasowujemy każdą linię, a także wypychamy ją do grupy
1
, tak aby grupa1
była teraz sumą pozycji poziomej i pionowej (gdzie ta ostatnia jest liczona od dołu ). Zasadniczo oznacza to przekątne siatki o rosnących wartościach, zaczynając od lewego dolnego rogu. Że.*
następnie przesuwa kursor silnika na koniec łańcucha.Teraz zmieniamy się w lookbehind, który jest dopasowany od prawej do lewej w .NET:
To wielokrotnie wyskakuje dokładnie
H
przechwytywanie z grupy1
(gdzieH
jest wysokość wejścia). Ma to na celu przejęcie grupy moduloH
. Następnie grupa1
zawiera wiersz (liczony od dołu), z którego należy wybrać nowy znak w bieżącej kolumnie.Kolejne spojrzenie za, znów zaczynając od prawej.
(?<-1>.+¶)*.+
używa teraz grupy1
do znalezienia wiersza, z którego ma zostać wybrany nowy znak, a następnie lookahead znajduje odpowiednią kolumnę za pomocą grupy2
.Pożądana postać jest przechwytywana do grupy
3
i zapisywana przez podstawienie.źródło
$+
$+
jest właściwie całkiem bezużyteczny ... jego opis w MSDN brzmi o wiele bardziej przydatny niż jest, ponieważ sugeruje, że(a)|(b)
->$+$+
podwoi wszystkiea
s ib
s, ale zamiast tego usuwa wszystkiea
s, ponieważ odnosi się tylko do ostatniej składniowej grupy . Oznacza to, że jest to tylko sposób na uniknięcie liczenia wszystkich grup, jeśli jesteś zbyt leniwy (tak jak ja). Do gry w golfa oszczędza bajty tylko wtedy, gdy masz więcej niż 9 grup, co prawdopodobnie jest dość rzadkie.Regex.Replace
Retinę, ale jeszcze nie udało mi się go wdrożyć).CJam, 13 bajtów
Sprawdź to tutaj.
Wyjaśnienie
źródło
TeaScript, 10 bajtów
Dzięki niezwykle zwięzłej składni TeaScript 3 jest to naprawdę krótkie: D
Byłby 1 bajt krótszy, gdyby pętla Sigmy nie była błędna
Wypróbuj online
Wyjaśnienie
źródło
Python 3, 164 bajty
Nie najlepsza odpowiedź z daleka, ale pierwsza w Pythonie ...
źródło
)
lub]
w większości przypadków, na przykład,''.join(l)for l in....
jest to całkowicie poprawneMATLAB,
9236 bajtówZakładając, że łańcuch wejściowy
s
ma już postać tablicy / macierzy znaków 2D, npObjaśnienie: iteruj po kolumnach macierzy. Dla każdej kolumny wykonaj okrągłe przesunięcie jej elementów o liczbę znaków równą indeksowi kolumny (-1 z powodu indeksowania MATLAB).
źródło
Brachylog , 96 bajtów
Oczekuje to listy ciągów znaków znaków jako danych wejściowych i bez danych wyjściowych, np
brachylog_main([`aaaa`,`bbbb`,`cccc`],_).
To jedna absurdalnie długa odpowiedź i prawdopodobnie jest na to znacznie krótszy sposób.
Wyjaśnienie
źródło
JavaScript,
9289 bajtów3 bajty wyłączone dzięki @Neil .
Pokaż fragment kodu
źródło
replace
:m.replace(/./g,(n,j)=>z[((l=z.length)*j+i-j)%l][j])
.[...m].map(
aż do pierwszego.join
.Python 2, 115 bajtów
Dzięki cudowi
zip
udało się sprowadzić to do jednej linii. Zobacz to w akcji tutaj .źródło
MATL , 18
21bajtówDane wejściowe mają formę
Wypróbuj online!
Jak to działa :
źródło
F #, 105 bajtów
Moje pierwsze dźgnięcie w niego (
\n
wymagana jest tylko postać):Stosowanie:
źródło
JavaScript (ES6), 73 bajty
Wyjaśnienie
Test
Pokaż fragment kodu
źródło
Japt, 29 bajtów
Przetestuj online!
Jak to działa
źródło
Haskell, 81 bajtów
reimplementacja przykładu CJam, chociaż rewers, mapa i wyliczenie są częścią mapAccumR, snd usuwa akumulator, ponieważ już go nie potrzebujemy, odwrócenie jest tylko efektem ubocznym właściwego złożenia.
źródło
Haskell, 65 bajtów
Przykład użycia:
g ["1111","2222","3333"]
->["1321","2132","3213"]
.źródło
MATL , 9 bajtów
Wypróbuj online!
Całkiem podobny w rdzeniu do istniejącej odpowiedzi MATL Luisa Mendo , ale krótszy dzięki użyciu funkcji, które prawdopodobnie nie były w tym języku: 1. automatycznie
"
przechodzi teraz przez kolumny macierzy, więc nie ma kosztownego interesu w tworzeniu indeksów kolumn i indeksowaniu do nich ( to jest biggie), 2.&h
jako skrótowy sposób powiedzeniaN$h
i 3. niejawna pętla kończy się jeśli]
nie jest określone.Alternatywnie, dla tego samego bajtu:
Wypróbuj na MATL Online
źródło
C (brzęk) , 114 bajtów
Działa w GCC pod MinGW. GCC TIO jest zdezorientowane poprzez użycie
strlen
w wyrażeniu init pierwszej pętli for.Wypróbuj online!
źródło