Golf twister struny

24

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
J Atkin
źródło
12
Lepiej, żeby nie była do tego wbudowana Mathematica.
Mama Fun Roll
1
Czy możemy założyć, że dane wejściowe będą zawierać tylko ASCII? A może tylko linie wydruku ASCII + czy coś takiego?
Martin Ender
Tak, tylko ASCII i znak nowej linii (chyba że weźmiesz dane wejściowe jako tablicę).
J Atkin

Odpowiedzi:

3

Brachylog , 5 bajtów

iᵇ↻₎ᵐ

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

ṇẹ\iᵇ↻₎ᵐ\cᵐ~ṇ

Wypróbuj online!

sundar - Przywróć Monikę
źródło
To niesamowita kompresja informacji.
J Atkin
7

Pyth, 11

jC.>R~hZC.z

Wypróbuj tutaj

jC.>R~hZC.z    ##  implicit: .z = list of input split by lines
        C.z    ##  transpose .z to get columns
  .>R~hZ       ##  shift each column by it's index
               ##  equivalent to .e.>bk
jC             ##  transpose back and join by newlines
FryAmTheEggman
źródło
7

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.

H.PWiz
źródło
6

Retina , 111 101 92 87 bajtów

Liczba bajtów zakłada kodowanie ISO 8859-1.

(?<=((.))*)(?=(?<1>.*¶)*.*(?<=(?=(?<-2>.)*(.))(?<-1>.+¶)*.*(.(?<=^(?<-1>¶?.+)*))*)).
$3

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 1i2 dla każdej postaci przed meczem (w bieżącym wierszu). Oznacza to, że liczy pozycję poziomą meczu.

Reszta jest w zasięgu wzroku:

(?=(?<1>.*¶)*.* [...] )

Dopasowujemy każdą linię, a także wypychamy ją do grupy 1, tak aby grupa 1był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:

(?<= [...] (.(?<=^(?<-1>¶?.+)*))*)

To wielokrotnie wyskakuje dokładnie Hprzechwytywanie z grupy 1(gdzie Hjest wysokość wejścia). Ma to na celu przejęcie grupy modulo H. Następnie grupa 1zawiera wiersz (liczony od dołu), z którego należy wybrać nowy znak w bieżącej kolumnie.

(?=(?<-2>.)*(.))(?<-1>.+¶)*.*

Kolejne spojrzenie za, znów zaczynając od prawej. (?<-1>.+¶)*.+używa teraz grupy 1do 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 3i zapisywana przez podstawienie.

Martin Ender
źródło
Ach, czytanie źródła $+
Retiny
@FryAmTheEggman $+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 wszystkie as i bs, ale zamiast tego usuwa wszystkie as, 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.
Martin Ender
To niefortunne ... Być może siatkówka mogłaby mieć nowy typ grupy zastępczej, który zwróciłby ostatnią niepustą grupę dopasowania? W każdym razie dzięki za wyjaśnienie! :)
FryAmTheEggman
@FryAmTheEggman To zrobi (to jedna z rzeczy, o których pomyślałem, przepisując Regex.ReplaceRetinę, ale jeszcze nie udało mi się go wdrożyć).
Martin Ender
4

CJam, 13 bajtów

qN/zee::m>zN*

Sprawdź to tutaj.

Wyjaśnienie

q    e# Read all input.
N/   e# Split into lines.
z    e# Transpose to get an array of columns.
ee   e# Enumerate, pairing each column with its index.
::m> e# Map: fold: rotate (cyclically shifting each column by its index).
z    e# Transpose again.
N*   e# Join with linefeeds.
Martin Ender
źródło
2
Możesz prawie wymówić ten kod źródłowy.
mınxomaτ
4

TeaScript, 10 bajtów

xHl@C(r╢tD

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

      // Implicit, x = input
xH    // Transpose input
l@    // Loop
 C(r╢   // Cycle column by index
        // `╢` exits loop
t    // Transpose
D    // Join on \n
Downgoat
źródło
3

Python 3, 164 bajty

Nie najlepsza odpowiedź z daleka, ale pierwsza w Pythonie ...

s=list(zip(*open(0).readlines()))[:-1]
r=[[s[i][(j-i)%len(s[i])] for j in range(len(s[i]))] for i in range(len(s))]
print('\n'.join([''.join(l) for l in zip(*r)]))
josh2112
źródło
1
Możesz zaoszczędzić garść bajtów, wyjmując miejsce następujące po )lub ]w większości przypadków, na przykład, ''.join(l)for l in....jest to całkowicie poprawne
wnnmaw
3

MATLAB, 92 36 bajtów

s=bsxfun(@circshift,s,0:size(s,2)-1)

Zakładając, że łańcuch wejściowy sma już postać tablicy / macierzy znaków 2D, np

s = ['abcdefg';'.......'];
s = ['\\\\.....././';'...../.......';'........././.';'..../.^\\....'];

Objaś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).

Matthias W.
źródło
2

Brachylog , 96 bajtów

$\:0{h_.|[M:I]hh:I{bh0,?h.|[C:I]h$)D,I-1=:Dr:2&.}C,I+1=J,Mb:J:1&:[C]rc.}$\{hA,[A]:"~s
"w,?b:3&;}

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

§ Main Predicate

$\:0{}$\{}                            § Create a list containing the transposed input and 0
                                      § Call sub-predicate 1 with this list as input
                                      § Transpose its output and pass it as input to
                                      § sub-predicate 3


§ Sub-predicate 1

h_.                                   § If the matrix is empty, output is empty list
   |                                  § Else
    [M:I]hh:I{}C,                     § Input is [M,I], call sub-predicate 2 with the first
                                      § line of M and I as input. Its output is C.
                 I+1=J,Mb:J:1&        § Call sub-predicate 1 with M minus the first line
                                      § and I+1 as input
                              :[C]rc. § Its output is appended after C, which is then
                                      § unified with the output of sub-predicate 1.


§ Sub-predicate 2

bh0,?h.                               § If the second element of the input list is 0,
                                      § output is the first element of the input
       |                              § Else
        [C:I]                         § Input is [C,I]
             h$)D,                    § Perform a circular permutation of C from left to
                                      § right (e.g. [a,b,c] => [c,a,b]) and unify it with D
                  I-1=:Dr:2&.         § Call sub-predicate 2 with D and I-1 as input, unify
                                      § its output with sub-predicate 2's output


§ Sub-predicate 3

hA,[A]:"~s\n"w,                       § Write the first line of the input as a char codes
                                      § string followed by a new line

               ?b:3&;                 § Call sub-predicate 3 with input minus the first
                                      § line. If it fails (empty input), terminate
Fatalizować
źródło
2

JavaScript, 92 89 bajtów

3 bajty wyłączone dzięki @Neil .

s=>(z=s.split`
`).map((m,i)=>m.replace(/./g,(n,j)=>z[((l=z.length)*j+i-j)%l][j])).join`
`

oddalony
źródło
Można zapisać 3 bajty za pomocą replace: m.replace(/./g,(n,j)=>z[((l=z.length)*j+i-j)%l][j]).
Neil
1
Rzeczywiście, [...m].map(aż do pierwszego .join.
Neil
2

Python 2, 115 bajtów

lambda s:'\n'.join("".join(s)for s in zip(*[k[-i%len(k):]+k[:-i%len(k)]for i,k in enumerate(zip(*s.split('\n')))]))

Dzięki cudowi zipudało się sprowadzić to do jednej linii. Zobacz to w akcji tutaj .

wnnmaw
źródło
2

MATL , 18 21 bajtów

Zy2):"G@Z)@qYS]N$h

Dane wejściowe mają formę

['Hello, world!'; 'I am another '; 'string to be '; 'twisted!']

Wypróbuj online!

Jak to działa :

Zy       % implicitly take input: 2D char array. Get its size
2)       % second element from size vector: number of columns, say n
:        % create vector [1,2,...,n]
"        % for each element k in that vector
  G      %   push input
  @      %   push k
  Z)     %   k-th column from input
  @qYS   %   circularly shift k-1 positions
]        % end for loop
N$h      % concatenate all stack contents horizontally
         % implicitly display
Luis Mendo
źródło
1

F #, 105 bajtów

Moje pierwsze dźgnięcie w niego ( \nwymagana jest tylko postać):

let m x y=(x%y+y)%y
let f(a:string[])=Array.mapi(fun i x->String.mapi(fun j _->a.[m(i-j)a.Length].[j])x)a

Stosowanie:

f [| @"\\\\\\\\\\\\"
     "............"
     "............"
     "............" |]
pswg
źródło
Nie sądzę, że widziałem F # wcześniej na PPCG.
J Atkin
1

JavaScript (ES6), 73 bajty

t=>t.replace(/./g,(_,i)=>t[(i+s*l-i%l*l)%s],l=t.search`
`+1,s=t.length+1)

Wyjaśnienie

t=>
  t.replace(/./g,(_,i)=> // replace each character at index i
    t[                   // get the character at index:
      (i                 // start at i
        +s*l             // add s*l to ensure the result is always positive for %s
        -i%l*l           // move the index upwards the num of chars from start of the line
      )%s                // shift the index into the the range of s
    ],
    l=t.search`
`+1,                     // l = line length
    s=t.length+1         // s = input grid length (+1 for the missing newline at the end)
  )

Test

użytkownik 81655
źródło
1

Japt, 29 bajtów

Uy £XsV=(Y*Xl -Y %Xl)+X¯V}R y

Przetestuj online!

Jak to działa

Uy        // Transpose rows and columns in the input string.
£     }R  // Map each item X and index Y in the result, split at newlines, to:
Y*Xl -Y   //  Take Y times X.length and subtract Y.
%Xl)      //  Modulate the result by X.length.
XsV=      //  Set V to the result of this, and slice off the first V chars of X.
+X¯V      //  Concatenate this with the first V chars of X.
y         // Transpose the result again.
          // Implicit: output last expression
ETHprodukcje
źródło
1

Haskell, 81 bajtów

let t=transpose in t.snd.mapAccumR(\c l -> 1+c,take(length l)(drop c$cycle l))0.t

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.

Daniel Hill
źródło
1

Haskell, 65 bajtów

g l@("":_)=l;g l|t<-tail<$>l=zipWith(:)(head<$>l)$g$last t:init t

Przykład użycia: g ["1111","2222","3333"]-> ["1321","2132","3213"].

nimi
źródło
1

MATL , 9 bajtów

"@X@qYS&h

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 powiedzenia N$hi 3. niejawna pętla kończy się jeśli] nie jest określone.

Alternatywnie, dla tego samego bajtu:

tsn:ql&YS

Wypróbuj na MATL Online

      &YS   % circularly shift the matrix
     l      % across rows (i.e. shift each column) by the amounts
            %  given by this array:
tsn         % duplicate input, get the sum of each column, get the 
            %  number of elements in that (which is the number of columns)
   :q       % construct range 1 to ncols, then decrement to start at 0
            % (implicit output)
sundar - Przywróć Monikę
źródło
0

C (brzęk) , 114 bajtów

Działa w GCC pod MinGW. GCC TIO jest zdezorientowane poprzez użycie strlenw wyrażeniu init pierwszej pętli for.

f(L,n)char**L;{for(int l=strlen(*L),i=0,j,c;i<n;i++)for(j=c=0;j<=l;j++,c=c?c-1:n-1)putchar(l^j?L[(c+i)%n][j]:10);}

Wypróbuj online!

gastropner
źródło