糸巻きのゴルフ


24

弦のねじれ方

ツイストアルゴリズムは非常に単純です。各列はそのインデックスによって下にシフトされます(列0は0に移動し、列1は1に移動します...)。列シフトは上に折り返されます。それはこのように動作します:

aaaa
bbbb
cccc

になる:

a
ba
cba
----
 cba
  cb
   c

行の下のすべてが上に折り返されます。実際の例:

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

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

入力

入力は、文字列の配列または複数行の文字列です。すべての行の長さは同じです。

出力

ツイスト文字列、std-outへの複数行出力(または最も近い代替)。

例:

>入力を示し、末尾のスペースが重要です)

>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
これにはMathematicaが組み込まれていない方が良いでしょう。
ママファンロール

1
入力にASCIIのみが含まれると想定できますか?または、印刷可能なASCII +ラインフィードなどのみですか?
マーティンエンダー

はい、ASCIIと改行のみです(入力を配列として受け取らない限り)。
Jアトキン

回答:


3

Brachylog、5バイト

iᵇ↻₎ᵐ

オンラインでお試しください!

列の配列として入力を取得します(質問の仕様内にあるようです)。

iᵇ-配列内の各要素について、その要素を(0
から
↻₎始まる)インデックスとペアにします-この述語を結果の各要素にマッピングします:-最後の要素(インデックス)として指定された量だけ循環(列)を並べ替えます

単一の複数行文字列を受け入れるバージョンに簡単に拡張できます。

13バイト

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

オンラインでお試しください!


これは驚くべき情報圧縮です。
Jアトキン



6

網膜111 101 92 87バイト

バイトカウントはISO 8859-1エンコードを前提としています。

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

うーん、単一の正規表現の置換でそれを解決しました。:)(チャンスは、いくつかを使用することでより短い解決策がありますが、その中の楽しみはどこにありますか...)

オンラインでお試しください!

説明

これには、グループバランスに関する基本的な知識が必要です。つまり、.NETの正規表現フレーバーを使用すると、1つのグループで複数回キャプチャし、すべてのキャプチャをスタックにプッシュできます。そのスタックからポップすることもできます。これにより、正規表現内の項目をカウントするために使用できます。

(?<=((.))*)

これにより、1つのキャプチャが両方のグループに1、および2一致の前の文字(現在の行)ごとにプッシュされます。つまり、一致の水平位置をカウントします。

残りは先読みです:

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

我々は、各ラインに一致し、また、グループにそれを押し1、その結果、グループは1今や(後者がカウントされ、水平および垂直位置の和である底部から)。これは本質的に、グリッドの対角線に左下隅から始まる値を増加させてラベルを付けます。ことは、.*その後、単なる文字列の末尾にエンジンのカーソルを移動します。

次に、.NETで右から左に一致する後読みに切り替えます。

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

これによりH、グループからのキャプチャが繰り返しポップされます1H入力の高さ)。その目的は、グループを法とすることHです。その後、グループ1には、現在の列で新しい文字を選択する行(下から数えて)が含まれます。

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

後ろからもう一度、右から始めます。(?<-1>.+¶)*.+group 1を使用して新しい文字を選択する行を検索し、lookaheadはgroupを使用して正しい列を検索します2

目的の文字がグループにキャプチャさ3れ、置換によって書き戻されます。


ああ、Retinaのソースを読むのは素晴らしくて明確でした:) $+便利そうです...特に1回だけ置換したい場合:^)
FryAmTheEggman

@FryAmTheEggman $+は実際には役に立たない... MSDNの説明は、(a)|(b)-> $+$+がすべてaのsとbs を2倍にすることを暗示しているため、MSDNの説明は非常に便利に聞こえますが、代わりにa構文的に最後のグループを指しているため、すべてのsを削除します。つまり、あなたが怠けすぎている場合(私がそうだったように)、すべてのグループを数えるのを避けるための方法にすぎません。ゴルフでは、グループが9つ以上ある場合にのみバイトを節約しますが、これはおそらく最初から非常にまれです。
マーティンエンダー

それは残念です...おそらく、網膜には、最後の空でないマッチグループを返す新しい置換グループタイプがありますか?とにかく、説明ありがとう!:)
FryAmTheEggman

@FryAmTheEggman(Regex.ReplaceRetina向けに書き換える際に念頭に置いていたものの1つですが、まだ実装していませんでした)。
マーティンエンダー

4

CJam、13バイト

qN/zee::m>zN*

ここでテストしてください。

説明

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
そのソースコードはほとんど発音できます。
mınxomaτ

4

TeaScript、10バイト

xHl@C(r╢tD

TeaScript 3の非常に簡潔な構文のおかげで、これは本当に短いです:D

シグマループにバグがない場合、1バイト短くなります。

オンラインで試す

説明

      // 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バイト

ロングショットによる最良の答えではありませんが、Pythonの最初の答えです...

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
あなたは、次のスペース取り出してバイトの一握りを救うことができる)か、]ほとんどの場合には、例えば''.join(l)for l in....完全に有効ですが
wnnmaw

3

MATLAB、92 36バイト

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

入力文字列sが既に2D char配列/行列の形式であると仮定します。例えば

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

説明:マトリックスの列を反復処理します。列ごとに、列インデックスに等しい文字数(MATLABインデックス付けのため-1)だけ要素の循環シフトを実行します。


2

ブラキログ、96バイト

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

これは、入力として文字コード文字列のリストを期待し、出力を期待しません。 brachylog_main([`aaaa`,`bbbb`,`cccc`],_).

それはとてつもなく長い答えの1つであり、おそらくもっと短い方法があります。

説明

§ 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バイト

@Neilに感謝します

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


以下を使用して3バイト節約できますreplacem.replace(/./g,(n,j)=>z[((l=z.length)*j+i-j)%l][j])
ニール

1
確かに、[...m].map(最初のを含むすべての方法.join
ニール

2

Python 2、115バイト

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

zipこれを1行にまとめることができたのは不思議です。アクションでそれを参照してくださいここに


2

MATL、18 21バイト

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

入力は次の形式です

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

オンラインでお試しください!

仕組み

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バイト

私の最初の突き刺し(\nキャラクターだけが必要です):

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

使用法:

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

PPCGでF#を見たことはないと思います。
Jアトキン

1

JavaScript(ES6)、73バイト

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

説明

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

テスト


1

Japt、29バイト

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

オンラインでテストしてください!

使い方

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バイト

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

CJamの例の再実装では、reverse、map、enumerateはmapAccumRの一部ですが、sndはアキュムレータを削除します。これはもう必要ないためです。反転は右フォールドの副作用です。


1

Haskell、65バイト

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

使用例:g ["1111","2222","3333"]-> ["1321","2132","3213"]


1

MATL、9バイト

"@X@qYS&h

オンラインでお試しください!

プリティ・ルイス・Mendoのコアで同様の既存のMATLの答えは 1:しかし、その時点での言語で、おそらくいなかった機能使って、短い"(自動的今行列の列を反復処理をするので、それらに列インデックスとインデックスを構築する費用のかかる事業これは大物です)、2。&hの省略表現としてN$h、および3. ]指定されていない場合の暗黙的なループ終了。

または、同じバイト数の場合:

tsn:ql&YS

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)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.