Bir dize twister Golf


24

Dizeler nasıl bükülür

Büküm algoritması çok basittir. Her sütun kendi dizinine göre aşağı kaydırılır (sütun 0, aşağı 0, aşağı hareket 1, ...). Sütun kayması en üste kaydırılır. Bu gibi çalışır:

aaaa
bbbb
cccc

Oluyor:

a
ba
cba
----
 cba
  cb
   c

Çizginin altındaki her şey üste gelecek şekilde. Gerçek örnek:

Original:
\\\\\\\\\\\\
............
............
............

Twisted:
\...\...\...
.\...\...\..
..\...\...\.
...\...\...\

Giriş

Giriş, bir dize dizisi veya çok satırlı bir dizedir. Tüm çizgiler aynı uzunluktadır.

Çıktı

Bükülmüş dize, çok satırlı çıkıştan std çıkışına (veya en yakın alternatif).

Örnekler:

( >girişi belirtir, takip alanı önemlidir)

>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

12
Bunun için yerleşik bir Mathematica olmamalıdır.
Mama Fun Roll

1
Girişin yalnızca ASCII içereceğini varsayabilir miyiz? Veya yalnızca yazdırılabilir ASCII + satır beslemeleri veya başka bir şey?
Martin Ender

Evet, sadece ASCII ve newline (bir dizi olarak giriş yapmazsanız).
J Atkin

Yanıtlar:


3

Brachylog , 5 bayt

iᵇ↻₎ᵐ

Çevrimiçi deneyin!

Girdiyi bir sütun dizisi olarak alır (bu, sorunun özellikleri dahilinde görünmektedir).

iᵇ- Dizideki her öğe için, (0-tabanlı) dizini ile
eşleştirin - bu yüklemeyi sonucun her öğesiyle eşleştirin:
↻₎- Son öğe (dizin) olarak belirtilen miktarla dairesel olarak izin ver (sütun)

Tek bir çok satırlı dizgiyi kabul eden bir sürüme kolayca genişletilebilir:

13 bayt

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

Çevrimiçi deneyin!


Bu inanılmaz bilgi sıkıştırma.
J Atkin

7

Pyth, 11

jC.>R~hZC.z

Burada dene

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

7

APL (Dyalog) , 7 bayt

⊖⊖⊖⍨⍬⍋⍉

gerektirir ⎕io←0

Çevrimiçi deneyin!

⍬⍋⍉0'dan sütunların sayısına kadar olan aralığı
tersine
⊖⊖⍨⍬⍋⍉döndürür (dikey olarak) (tersine) ters çevrilmiş girişi 0,1..
tersine döndürür ve döndürür.


6

Retina , 111 101 92 87 bayt

Bayt sayısı, ISO 8859-1 kodlamasını varsayar.

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

Woo, tek bir regex yerine koydu. :) (Büyük olasılıkla, birkaç kullanarak daha kısa bir çözüm var, ama bunun neresinde eğlenceli ...)

Çevrimiçi deneyin!

açıklama

Bu, dengeleme gruplarına ilişkin bazı temel bilgileri gerektirir . Kısacası, .NET'in regex tadı, tek bir grupla birden çok kez çekim yapmanıza olanak sağlar ve tüm yakalamaları bir yığına iter. Bu yığın, regex içindeki şeyleri saymak için kullanmamıza izin veren de çıkarılabilir.

(?<=((.))*)

Bu, bir yakalamayı her iki gruba 1ve 2maçın önündeki her karakter için (geçerli satırda) iter . Yani, eşleşmenin yatay konumunu sayar.

Gerisi bir gözle görülebilir:

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

Her çizgiyi eşleştiriyoruz ve aynı zamanda onu grubun üzerine itiyoruz 1, böylece grup 1şimdi yatay ve dikey konumun toplamı (ikincisi alttan sayılıyor ). Bu, esas olarak, kılavuzun köşegenlerini sol alt köşeden başlayarak artan değerlerle etiketler. Bu .*daha sonra sadece motorun imlecini dizenin sonuna götürür.

Şimdi .NET'te sağdan sola eşleşen bir gözbebekine geçiyoruz:

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

Bu art arda Hgruptan tam olarak yakalar 1( Hgirişin yüksekliği nerede ). Bunun amacı, modulo grubunu almaktır H. Daha sonra grup 1, yeni sütunun geçerli sütunda seçileceği satırı (alttan sayılır) içerir.

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

Yine sağdan başlayarak başka bir gözbebeği. (?<-1>.+¶)*.+Şimdi 1yeni karakterin seçileceği satırı bulmak için grup kullanır ve ardından bakıcı grubu kullanarak doğru sütunu bulur 2.

İstenilen karakter gruba dahil 3edilir ve oyuncu değişikliği ile geri yazılır.


Ah, Retina'nın kaynağını okumak güzel ve netti :) $+faydalı görünüyor ... özellikle de yalnızca bir oyuncu değişikliği yapmak istersen: ^)
FryAmTheEggman

@FryAmTheEggman $+aslında oldukça işe yaramaz ... MSDN'deki açıklama, seslerin olduğundan daha faydalı olduğunu gösteriyor (a)|(b)-> $+$+tüm as ve s'leri iki katına bçıkarır a, ancak bunun yerine tüm s'leri kaldırır , çünkü sadece sözdizimsel olarak son gruba atıfta bulunur . Bu, (eğer benim gibi) çok tembelseniz tüm grupları saymamanın bir yolu demektir. Golf oynamak için, 9'dan fazla grubunuz olduğunda, muhtemelen başlangıçta oldukça nadir olduğu durumlarda bayt tasarrufu sağlar.
Martin Ender

Bu talihsiz bir durum ... Belki de retinanın boş olmayan son maç grubunu geri getirecek yeni bir değiştirme grubu türü olabilir mi? Neyse, açıklama için teşekkürler! :)
FryAmTheEggman

@FryAmTheEggman Olacak ( Regex.ReplaceRetina için yeniden yazarken aklımdaki şeylerden biriydi , ancak henüz uygulamaya koymadım ).
Martin Ender

4

CJam, 13 bayt

qN/zee::m>zN*

Burada test et.

açıklama

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.

2
Bu kaynak kodunu neredeyse telaffuz edebilirsiniz.
mınxomaτ

4

TeaScript, 10 bayt

xHl@C(r╢tD

TeaScript 3'ün son derece kısa sözdizimi sayesinde, bu gerçekten kısa: D

Sigma döngüsü buggy olmasaydı 1 bayt daha kısa olurdu

Çevrimiçi deneyin

açıklama

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

3

Python 3, 164 bayt

Uzun bir vuruşta en iyi cevap değil, Python'da birincisi ...

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)]))

1
Bir )veya ]birkaç durumda izleyen boşluğu ''.join(l)for l in....
bırakarak

3

MATLAB, 92 36 bayt

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

Giriş dizesinin szaten bir 2B karakter dizisi / matrisi biçiminde olduğunu varsayarak , örneğin

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

Açıklama: matrisin sütunlarını yineleyin. Her sütun için, elemanlarının dairesel bir kaymasını, sütun indeksine eşit karakter sayısına göre gerçekleştirin (MATLAB indekslemesi nedeniyle -1).


2

Brachylog , 96 bayt

$\: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&;}

Bu, girdi olarak ve çıktı olmadan karakter kodlarının bir listesini bekler; brachylog_main([`aaaa`,`bbbb`,`cccc`],_).

Bu gülünç derecede uzun bir cevap ve muhtemelen bunu yapmanın çok daha kısa bir yolu var.

açıklama

§ 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

2

JavaScript, 92 89 bayt

3 bayt kapalı teşekkür @Neil .

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


replace: Kullanarak 3 bayt kaydedebilirsiniz m.replace(/./g,(n,j)=>z[((l=z.length)*j+i-j)%l][j]).
Neil

1
Gerçekten de, [...m].map(ilki de dahil olmak üzere tüm yolu .join.
Neil,

2

Python 2, 115 bayt

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')))]))

zipBunu bir kenara atmayı başarmanın harikası sayesinde . İşlemde görünBurada .


2

MATL , 18 21 bayt

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

Giriş biçimindedir

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

Çevrimiçi deneyin!

Nasıl çalışır :

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

1

F #, 105 bayt

Ona ilk bıçaklama (sadece bir \nkarakter gerekli):

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

Kullanımı:

f [| @"\\\\\\\\\\\\"
     "............"
     "............"
     "............" |]

Daha önce PPCG'de F # gördüğümü sanmıyorum.
J Atkin

1

JavaScript (ES6), 73 bayt

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

açıklama

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)
  )

Ölçek


1

Japt, 29 bayt

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

Çevrimiçi test edin!

Nasıl çalışır

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

1

Haskell, 81 bayt

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

CJam örneğinin yeniden uygulanması, ters, harita ve numaralandırmanın mapAccumR'nin bir parçası olmasına rağmen, snd akümülatörü kaldırır, çünkü artık ihtiyacımız yok, tersine çevirme sadece sağ katın bir yan etkisi.


1

Haskell, 65 bayt

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

Kullanım örneği: g ["1111","2222","3333"]-> ["1321","2132","3213"].


1

MATL , 9 bayt

"@X@qYS&h

Çevrimiçi deneyin!

Luis Mendo'nun mevcut MATL cevabına çekirdeği ile oldukça benzer , ancak o noktada muhtemelen dilde olmayan özellikleri kullanarak daha kısa: 1. "Şimdi bir matrisin sütunlarını otomatik olarak yineliyor , bu nedenle sütun indeksleri oluşturma ve bunlara endeksleme masraflı bir iş değil ( bu biggiedir), 2. &hkısa yoldan söyleme şekli olarak N$hve 3. belirtilmemişse örtük döngü sonu ].

Alternatif olarak, aynı bytecount için:

tsn:ql&YS

MATL Online'da deneyin

      &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)

0

C (clang) , 114 bayt

MinGW altında GCC'de çalışır. TIO'nun GCC'si strlen, ilk for döngüsü ifadesinin başlangıç ​​ifadesinde kullanılmasıyla karışır .

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);}

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.