ねじれた言葉!


34

ねじれた言葉!

文字列と正の整数を指定します。ひもを前後にねじる必要があります。

入力/出力の例

入力

Programming Puzzles & Code Golf
4

出力

Prog
mmar
ing 
zzuP
les 
oC &
de G
 flo

入力

入力は、STDIN、または関数引数を介して取り込むことができます。入力は、文字列と正の整数nで構成されます。整数は、各ツイスト線の長さを決定します。

弦は前後にねじれています。HELLO, WORLD!と5 の入力は次のようになります。

こんにちは世界!

出力

出力は、ねじれたテキストになります。末尾の空白は使用できません。入力文字列の長さが行の長さで割り切れない場合、行がいっぱいになるまでスペースを追加します。

この例:

入力

Hello, World!
5

出力(最後の空白に注意してください)

Hello
roW ,
ld!  


末尾の空白は使用できません。動詞を捨てた?
アダム

行のリストを返すことができますか?
アダム

回答:


10

ピス、19 15

VPc+z*dQQ_W~!ZN

文字列を事前に埋め込み、印刷するときに他の各行を反転します。パディングはボックスのサイズと同じですが、入力を切り刻んだ後の最後の行は破棄されます。

ここで試してみてください


6

CJam、19バイト

q~1$S*+/W<{(N@Wf%}h

入力例:

5 "Hello, World!"

説明

q~         e# Input n and the string.
1$S*+      e# Append n spaces to the string.
/W<        e# Split by each n characters, and remove the last chunk.
{          e# While the array of chunks isn't empty:
    (N     e# Extract the first chunk and push a newline.
    @Wf%   e# Reverse every chunk left in the array.
}h

5

Snowman 1.0.1、91バイト

{vg10vg|sB*#.'aGal'NdE'aaAaL|al!*+#5nS" "'aR'!#aCwR|.aC2aG:0aa|sP"
"sP'NdE|1aA.aNsP"
"sP;aE

または、2バイトのコストですべてを1行で(美学、より具体的には反美学のために):

{vg10vg|sB*#.'aGal'NdE'aaAaL|al!*+#5nS" "'aR'!#aCwR|.aC2aG:0aa|sP10wRsP'NdE|1aA.aNsP10wRsP;aE

雪だるまにとっては、これは短すぎます。(ただし、これはおそらく最短です。私はこれをかなり長い間ゴルフに取り組んでいました。)

これには1つの注意点があります。最後の行が反転されない場合、エラーの50%で終了します(ただし、正しい出力が生成されます)。(これは私が使用しているためですag、配列要素を2つのグループにグループ化して、1つおきに反転できるようにするためですが、最後の要素に両方の期待される要素があるかどうかを確認しないため、存在しない要素にアクセスしようとします行数が奇数です。)

Ungolfed /説明:

{vg10vg|sB*#      // get input, convert second string to number and store
.'aG              // split string into groups of n chars
al'NdE'aaAaL      // take out the last element of the array
|al!*+#5nS" "'aR  // subtract its length from 5, repeat that many spaces
'!#aCwR|.aC       // concat spaces to last el. and that back to the array
2aG               // split in groups of 2, so we can reverse every other string
// for each sub-group in the array of groups...
:
    0aa|sP10wRsP         // print the first element as is
    'NdE|1aA.aNsP10wRsP  // print the second element, reversed
;aE

5

Python 2、60

s,n=input()
d=1
while s:print(s+n*' ')[:n][::d];s=s[n:];d=-d

nからの文字を一度に取得し、とを交互に切り替えるs方向で印刷します。最後の行のスペースについては、切り取られる前に最後にスペースが埋め込まれます。これは、残りの文字数が少ない場合にのみ影響します。d1-1snn

再帰的な解決策は、末尾の改行を残すことを除いてchar(59)を保存しますが、これは許可されません。

f=lambda s,n,d=1:s and(s+n*' ')[:n][::d]+"\n"+f(s[n:],n,-d) 

4

Haskell83 75バイト

(id!)
(f![])_=[]
(f!l)n=f(take n$l++cycle" ")++'\n':((f.reverse)!drop n l)n

シンプル chunksOfテイクアンドドロップを使用した実装。出力に偶数または奇数の反転を適用します。

5バイトの@BMOと3バイトの@ØrjanJohansenに感謝します!

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


2
を使用するとcycle5バイト節約され、オンライン
ბიმო

続き3は除去することにより、バイトgとスワッピングnlオンラインそれをお試しください!
Ørjanヨハンセン

3

スタック42 41 40 38バイト

これはちょっと長すぎるので、おそらくもっとゴルフしようとするでしょう!

tg;_lu_@%u;-_0G<*' *+0GKE"];2%;Y_Y?p":

入力はのようにする必要があります"string"|n

説明:

tg                 # Take input, place each item on stack, save the int to variable stack                                        
;_l                # Swap the top two items, duplicate the string and obtain length
u_@%               # Rotate to the left, duplicate, rotate right and take mod
u;-                # Rotate left, swap the top two and subtract from each other
_0G<*              # duplicate this value, check if less than stored int and multiply
' *+               # Push space onto stack n times, append to starting string
0GKE               # Split this string into segments, and enumerate
"];2%;Y_Y?p":      # For each segment, determine if should be reversed, and print

2

Haskell、108バイト

(#)=splitAt
s!n=let(a,t)=n#s;(b,u)=n#t in a:reverse b:(u!n)
s%n=unlines$takeWhile(any(>' '))$(s++cycle" ")!n

ちょっと長いですね。ここに動作しています:

*Main> putStrLn $ "Programming Puzzles & Code Golf" % 4
Prog
mmar
ing
zzuP
les
oC &
de G
 flo

let式のバインドはどのように機能しますか?
xnor

これはlet、セミコロンで区切られたツーインワンステートメントです。通常は改行とインデントを使用しますが、Haskellではを記述することもできますlet a=b; c=d in expr
リン

putStrLnをプログラムから除外して、これが許可されていることを知りませんでした!
レイフウィラーツ

1
@LeifWillerts、最近、ここでの課題は、関数の引数/結果またはstdin / stdoutを介してI / Oを実行できるようにする傾向があります-ここでは、私の解決策はの(%) :: String -> String -> String代わりに関数ですIO ()
リン

2

Python 2、109バイト

最後の行を正しくするためにスペースでパディングを追加する必要がありました。

ここで試してみてください

I,c=input()
I+=(c-len(I)%c)*" "
L=[]
i=0
while I:s=I[:c];L+=[[s,s[::-1]][i%2]];i+=1;I=I[c:]
print"\n".join(L)

2

ルア、91 88 88 84 83 82バイト

古いバージョン:

a=arg for i=1,#a[1],a[2]do s=a[1]:sub(i,i+a[2]-1)print(d and s:reverse()or s)d=not d end

新しいバージョン:

arg[1]:gsub((".?"):rep(arg[2]),function(s)print(d and s:reverse()or s)d=not d end)


2

Perl、87バイト

sub f{$_=@_[0].$"x(@_[1]-1);$a.=(($i++&1?reverse$1:$1).$/)while/(.{@_[1]})/g;chop$a;$a}

古いバージョン(末尾の改行を出力):

sub f{$_=@_[0].$"x(@_[1]-1);print(($i++&1?reverse$1:$1).$/)while/(.{@_[1]})/g}

文字列は、末尾の改行なしで関数の引数として渡されます。このような呼び出し:

$_=<>;chomp;print f($_,5);

2

おたふく風邪、86バイト

R I,S,! S P=$L(I),$P(I," ",P)=P F Q=1:S:P S F=$E(I,Q,Q+S-1),P='P W $S('P:F,1:$RE(F)),!

最初の「、!」を削除すると、2バイト短くなる可能性がありますが Rステートメントの文字(STDINから読み取られます); 入力と出力の間にキャリッジリターンが追加されます。それがなければ、出力は技術的には正しいですが、最初の行が入力文字列に追加されて表示されます。[[私が使用している標準のMumps端末には、ローカルエコーがありません。]]   そのままの状態で、ここにテストがあります:

R I,S,! S P=$L(I),$P(I," ",P)=P F Q=1:S:P S F=$E(I,Q,Q+S-1),P='P W $S('P:F,1:$RE(F)),!
ABCDEFGHIJKLMNOPQRSTUVWXYZ1236
ABCDEF
LKJIHG
MNOPQR
XWVUTS
YZ123 

また、実際には、入力の最後の「123」と「6」の間にキャリッジリターン/ Enterキーがあります。 [[再びローカルエコーする。]]

誰かが興味を持っているなら、コードで何が起こっているのか説明できます。しかし、私はムンプス愛好家がたくさんいないことに気づいています... :-)


2

PowerShell、102バイト

param($s,$i)$l=$s.Length;$s+' '*($i%$l)-split"(.{$i})"|?{$_}|%{$r=-not$r;@($_,($_[$l..0]-join''))[$r]}

次のように呼び出されます(ファイルに保存されている場合CodeGolf55051.ps1

.\CodeGolf55051.ps1 -s '1234567890' -i 4

以前の試み

(より長いまたは無効)

PowerShell、110バイト

param($s,$i)$l=$s.Length;$s+' '*(($i-$l%$i)%$i)-split"(.{$i})"|?{$_}|%{$r=-not$r;@($_,($_[$l..0]-join''))[$r]}

PowerShell、111バイト

param($s,$i)$s+' '*(($i-$s.Length%$i)%$i)-split"(.{$i})"|?{$_}|%{$r=-not$r;@($_,($_[$_.length..0]-join''))[$r]}

説明

param($s,$i)                         #Take input text (s) and column width (i)
$s                                   #take the user entered string
+ ' ' * (($i - $s.Length % $i) % $i) #add the least number of spaces required to make its length divisible by i
-split"(.{$i})"                      #break it into chunks of i characters in length
| ?{$_}                              #skip any blank lines created in the process
| %{                                 #for each line
    $r = -not $r;                    #    toggle a boolean value
    @(                               #    define an array
        $_                           #    index 0 = the string going forwards
        ,($_[$_.length..0] -join '') #    index 1 = the string reversed (by taking each character from the last to the first, then joining them)
    )[$r]                            #    if our boolean value is false take the forward string (index 0), if true take the backwards one (index 1)
}                                    #next

PowerShell、180バイト

param($s,$i)$x="`${0}|{1}|`${2}";$w=$x;1..$i|%{$w=$w-f$_,$x,($i+$_)};$w=$w-replace'\||\${.*}';$r=$w-replace'\$\d+','(.)?';$s+' '*($i-$s.Length%$i)-replace$r,$w-split"(.{$i})"|?{$_}

PowerShell、196バイト

param($s,$i)$x="{0}|{1}|{2}";$w=$x;1..$i|%{$w=$w-f$_,$x,($i+$_)};$w=$w-replace'(\d+)','$$$1'-replace'\||{.*}';$r=$w-replace'\$\d+','(.)?';$s+' '*($i-$s.Length%$i)-replace$r,$w-split"(.{$i})"|?{$_}

説明

param ($s, $i)                      #Take input text (s) and column width (i)

$x = "{0}|{1}|{2}"                  #Define string format which takes 3 entries and pipe delimits them

$w = $x                             #initialise our replacement regex with this format
1..$i | %{                          #for 1 to the specified column width
    $w = $w -f $_, $x, ($i + $_)    #update the regex 1|{...}|5, 1|2|{...}|6|5, etc
}                                   #resulting in w = 1|2|3|4|{...}|8|7|6|5
$w = $w -replace '(\d+)', '$$$1'    #now prefix the numbers with a dollar (so they're regex replacement variables)
        -replace '\||{.*}'          #and remove the delimiters and superfluous `{...}` left from our middle insertion routine

$r = $w -replace '\$\d+', '(.)?'    #then create the match pattern by replacing the variables with optional single character captures

$s                                  #now take the user entered string
    + ' ' * ($i - $s.Length % $i)   #add the least number of spaces required to make its length divisible by i
    -replace $r, $w                 #perform a replacement using the regex match and replace patterns created above
    -split "(.{$i})"                #then split the string into blocks of length i
    | ?{$_}                         #removing any blank lines created in the process

{...}上記のコメントでは、実際に{0}|{1}|{2}{...}読みやすさを向上させています。

Powershell、120バイト (無効)

param($s,$i)$s + ' ' * ($i-$s.Length%$i) -replace '(.{4})?(.)(.)(.)(.)',"`$1`n`$5`$4`$3`$2`n" -split "`n" | ?{$_ -ne ""}

1
別のPowerShellスリンガーを見るのは素晴らしい!簡単なスタートは、param($s,$i)$s+' '*($i-$s.Length%$i)-replace'(.{4})?(.)(.)(.)(.)',"`$1`n`$5`$4`$3`$2`n"-split"`n"|?{$_-ne""}108まで下がるすべてのスペースの近くの
ダンを取り除く

ありがとう@TimmyD; 私のスクリプトでいくつかの基本的なエラーを見つけました(要件を満たしていません/ 4でのみ動作するようにハードコードされています...修正中)
-JohnLBevan

テスト中に、正しい方向でフローを前後に開始するために、最終[$r]インデックスを[-not$r]... と交換する必要がありました。そうでなければ、本当に滑らかな実行!
AdmBorkBork

1
また、入力番号nが正であり、文字列の長さが(定義により)非負であることが保証されている(($i-$l%$i)%i)ため($i-$l%$i)、これはに相当し、4文字を節約します。
AdmBorkBork

1
おっと、私はどういうわけかそれをタイプミスした、私はもともと意味した(-$l)%$i。それがどこから来たのか分からない。しかし、興味深いことに、それは同等ではないはずですが、そうであるべきです。どうやら、PowerShell(他の言語の中で)がモジュロ関数を実装する方法の奇妙な点で、私(数学専攻)やWolfram-Alphaが期待するものとは異なります。どうやら、長いバージョンに固執する必要があります。参照 証明->((y-x%y)%y) ==> ((y%y)-(x%y%y))%y ==> ((0)-(x%y))%y ==> (-x%y)%y ==> (-x)%y
AdmBorkBork

2

Clojure、83バイト、87バイト79バイト

(fn[n s](map #(apply str(% %2))(cycle[#(or %)reverse])(partition n n(repeat\ )s))))

以下のコメントの後のいくつかの修正、Ørjanに感謝します。

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

Clojureは、コードゴルフの答えを悲しいことに欠いていることが多いようです。確かに、バイト長でゴルフ言語と競合することはできませんが、完全な欠席はいくぶん不当だと思います。

説明:

  • データ内、2つの引数、数値と文字列
  • clojure組み込み関数パーティションを文字列sで実行し、リストがlengthである一連の文字のリストに分割することから始めますn。最後のチャンクはn、「pad collection」から返される長さまでスペースでパディングされます(repeat " ")そこます。
  • 次にmapを呼び出します、3つの引数でをます。
    • 無名関数( #(..)
    • 恒等関数の#(or %)ように機能し、cycleによって返される逆の(すなわち)関数の無限の交互のレイジーシーケンス[#(or %) reverse #(or %) reverse ...]
    • パーティションによって返されるリストのチャンク化された遅延シーケンス。
  • 最後に匿名関数 #(apply ...)
    • チャンク上で、identityまたはreverse交互に呼び出します。これは、を介して行われる(% %2)[すなわち無名関数の最初の引数としてで送信された関数を呼び出す表現identityreverse呼び出しの引数として無名関数に[すなわち、チャンク]二番目の引数を使用して]。
    • (apply str ...)文字のリストを文字列に変換する呼び出し
  • 外部関数は、文字列の遅延シーケンスを返します

ここで使用する1つのコツはmap、任意の数のコレクションを引数として取るような多くのclojure関数、つまり(map f coll1 coll2 coll3 ...)、関数fがコレクションと同じ数の引数を受け入れる必要がある場合です。この場合、2つのコレクションを送信します。1つは関数参照のコレクションで、もう1つはチャンクアップされた文字列です。


1
これは良いことですが、の最後に必要な空白がないようですld!
Ørjanヨハンセン

あなたは最も正しいです。...問題を解決すべきパッドコレクションを追加しました...そして私の8バイトのコスト
マティアスBjarland

ゴルフ規則について質問があります:インポートまたは同様のステートメント(clojureで必要、javaでインポートなど)を必要とする組み込み関数を使用している場合、その組み込みのインポートはゴルフソリューションのバイト数は?はいと仮定しますが、灰色の領域のように少し感じます。
マティアスビャランド

はい、インポートはカウントされます。
Ørjanヨハンセン

ああ、あなたが破っている別のルールがあります:事前定義された変数に入力を取ることはできません。ソリューション全体または関数のいずれかを解決する必要があります。(どちらfnかを使用してもdefn問題ありません。)反対に、関数は結果を印刷するのではなく、単に返すことができます。
Ørjanヨハンセン

2

APL(Dyalog Unicode)、19バイト

{↑⊢∘⌽\↓↑⍵⊆⍨⌈⍺÷⍨⍳≢⍵}

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

トック⊢∘⌽\からトリックをboustrophedoniseチャレンジにNGNの華麗な答え

主要な改行を含む行で送信が中断することに気付いた後、さらに2バイト追加しました。以下は古い投稿です。

APL(Dyalog Unicode)、17バイト

{↑⊢∘⌽\⍵⊆⍨⌈⍺÷⍨⍳≢⍵}

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


2

Python 3、 110 108 107 103バイト

def a(s,n):l=len(s)//n+1;s+=' '*(len(s)-l);print('\n'.join([s[x*n:n*x+n][::(-1)**x]for x in range(l)]))

(他の回答を見て)、とrjust95 93 92 90バイト

def a(s,n):print('\n'.join([s[x*n:n*x+n][::(-1)**x].rjust(n)for x in range(len(s)//n+1)]))

出力の最後の行が間違っています。ここで実行します。これは素晴らしい最初の投稿です。修正したら、いくつかのバイトをオフにする方法を提案します。最初は、回答からすべてのスペース/タブを削除できることです。
mbomb007

ハハ、あなたはとても正しい。これを修正するには多くの費用がかかりますが、私はそれに取り組んでいます。ありがとう
-bobrobbob


また、あなたはかなり前の私の答えを打ち負かしました:codegolf.stackexchange.com/a/55082/34718
mbomb007

ヒントを読む。おかげで再び
bobrobbob

1

PHP、135バイト

で示されているように、2つのコマンドライン引数を取ります$argv

<? foreach($a=str_split($s=$argv[1],$n=$argv[2])as$k=>&$v)$v=$k%2?$v:strrev($v);echo implode("\n",$a).str_repeat(' ',$n-strlen($s)%$n);

1

CoffeeScript、131バイト

これは長すぎるようです。

f=(s,n,r=l=s.length,i=0,z='')->(t=s[i...i+=n].split '';t=t.reverse()if r=!r;z+=t.join('')+(i<l&&'\n'||' '.repeat n-l%n))while i<l;z

1

ジュリア、104バイト

f(s,n)=(L=length(s);L+=L÷n;j=0;for i=1:n:L-n+1 x=rpad(s,L)[i:i+n-1];println(j%2<1?x:reverse(x));j+=1end)

ゴルフをしていない:

function f(s::String, n::Int)
    L = length(s) + length(s) ÷ n
    j = 0
    for i = 1:n:L-n+1
        x = rpad(s, L)[i:i+n-1]
        println(j % 2 == 0 ? x : reverse(x))
        j += 1
    end
end


1

q、46

{-1@neg[y]$@[a;(&)(til(#)a:y cut x)mod 2;|:];}

q){-1@neg[y]$@[a;(&)(til(#)a:y cut x)mod 2;|:];}["Programming Puzzles & Code Golf";4]
Prog
mmar
ing
zzuP
les
oC &
de G
 flo

これは、最後の行が短く、ねじれていない場合は正しくありません。バグ修正を回答に投稿したかったのですが、代わりにあなたのものを更新できる方が良いと思います:{-1@[l;(&)(til(#)l:y cut x)mod 2;'[neg[y]$;|:]];}(49バイト)。インスピレーションをありがとう!:)
hjk

1

Q、64 56バイト

{c::neg y;-1(til(#)l){$[x mod 2;c$(|:)y;y]}'l:y cut x;}
  • {}はとして呼び出す必要がある関数です{}[x;y]
    • x 文字列になります。
    • y 結果の行の長さになります。

テスト:

{c::neg y;-1(til(#)l){$[x mod 2;c$(|:)y;y]}'l:y cut x;}["Programming Puzzles & Code Golf";4]
Prog
mmar
ing
zzuP
les
oC &
de G
 flo

編集@tmartinによる他のqの答えに触発されたように短い機能を使用しました


1

Python 2、82 75バイト

s,n=input()
k=0
while k<=len(s):print s[k:k+n].ljust(n)[::1-2*(k/n%2)];k+=n

@willemにはコメントできませんでしたが、彼のコードを小さくしました。

ここで 試してくださいここで試してください


こんにちはAlexN、いい人。「Try here」の例の最後の行は正しくないと思います。それは正しく正当化されるべきです。また、86文字を数えますか?アップデートの私のエントリを参照しください。
ウィレム

こんにちはwillem、あなたは正しいです、私はコードを修正し、あなたにエラーがあることがわかりました:ideone.com/GOmMrE 右側にあるはずです。
アレクサンダーニグル

1

Perl、72バイト

perl -p0e's/\n(.*)/$"x($1-$-[0]%$1)/e;s/.{$1}/($i++%2?reverse$&:$&)."\n"/ge;chop'

70バイト、プラス-p0

デモ:

$ echo -en 'Hello, World!\n5' | perl -p0e's/\n(.*)/$"x($1-$-[0]%$1)/e;s/.{$1}/($i++%2?reverse$&:$&)."\n"/ge;chop'
Hello
roW ,
ld!  $

STDINから読み取った入力は改行で終わることができないことに注意してください(2バイト余分にかかります)。

説明:

perl -p0e'  # Read from STDIN, splitting on null bytes,
            # and print $_ automatically at the end

    s/
        \n(.*)  # Replace everything after first newline,
                # capturing wrap length in $1...
     /
        $"x($1-$-[0]%$1)  # ...with spaces until the total length of $_ is
                          # a multiple of $1 (i.e. right-pad with spaces)
     /e;

    s/
        .{$1}  # Replace series of $1 contiguous chars...
     /
        ($i++%2?reverse$&:$&)."\n"  # ...alternately with themselves or in
                                    # reverse, with a trailing newline
     /ge;

    chop'  # Remove final newline

1

JavaScript ES6、123バイト

var t=(s,n)=>{for(var d=1,i=0,o='',l=s.length;i<l;i++){o+=d?s[i]:s[i-i%n+n-1-i%n]||' ';if(i%n==n-1){d=!d;o+='\n'}}return o}

で呼び出しt(input_string, twist_length)、出力文字列を返します。


1
申し訳ありませんが、投稿が速すぎます。修正されました。
DankMemes



0

Coffeescript、151バイト

f=(s,n)->r="";d=n;i=0;_="\n";u=" ";l=s.length;(d--and(r+=s[i]or u;++i)or(r+=_;r+=s[c]or u for c in[i+n-1..i];i+=d=n;r+=_ if i<l))while i<(l/n+1>>0)*n;r

多すぎる=(


0

バッシュ、83 74

for((i=0;i<${#1};i+=$2));do b=cat;((i/$2%2))&&b=rev;echo ${1:i:$2}|$b;done

これはcatrevは、最初の引数の部分文字列とので、2番目の引数の長さます。

使用される特別な変数には、

  • ${#1}(文字列の長さ$1
  • ((i/$2%2))(インクリメンターを除算$i$2、そのモジュロを使用して奇数と偶数を決定する算術式で、使用するかどうかを決定しますrev
  • ${1:i:$2}$1開始位置$iの長さの部分文字列$2)。

うーん、私は今bash見たばかりの他の答えから独立してこれをしました。事実上、同じロジックがあります。...実際、viktorahlströmの答えは、私がさらに9文字を削るのを許しました。
アダム・カッツ

0

JavaScript ES6、113バイト

私自身の質問に対する私自身の亀裂。スペースを追加するので、で割り切れnます。そのように単純に分割および反転します。

(s,n)=>(s+' '.repeat(n-s.length%n)).match(eval(`/.{1,${n}}/g`)).map((l,i)=>i%2?[...l].reverse().join``:l).join`
`
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.