列を回転させる


28

整数kとテキストブロック、または内部配列の長さが等しくない(テキストブロックに似ている)2d配列の場合、k番目の列のすべての文字または要素を次の位置まで上下に回転させます。それが存在します。

次のテキストの20番目の列を回転します(1から始まります)。

A line with more than k characters.
A longer line with more than k character.
A short line.
Rotate here: ------v--
This is long enough.

This is not enough.
Wrapping around to the first line.

出力:

A line with more thtn k characters.
A longer line with aore than k character.
A short line.
Rotate here: ------m--
This is long enoughv

This is not enough.
Wrapping around to .he first line.

35 < k <42 である同じ入力のk番目の列を回転すると、入力テキストは変更されません。

ルール

  • 生のテキスト、行の配列、2Dの文字配列、またはデータを表すための妥当な形式を使用できます。文字以外のデータ型を使用することもできます。
  • 要素のデータ型の可能な値の数は、コード長に依存する場合は少なくとも20、それ以外の場合は少なくとも2でなければなりません。これは、ネイティブ型でサポートされる文字または他の値のサブセットです。
  • 入力で許可されている場合、スペースとあらゆる種類のヌル値は通常の値です。要素タイプで単純に除外することもできます。
  • ルールの変更:データを保存するために同じ長さの配列を使用する場合、短い配列に一般的なデフォルト値(スペースなど)を埋め込むことができます。
  • kは0ベースまたは1ベースです。入力の最長行内にあることが保証されています(入力に少なくとも1つの空でない行があることを意味します)。
  • 上下に回転するかどうかを選択できます。
  • だけ回転1の位置、又は回転のいずれかのN位置Nは、入力で与えられた正の整数です。
  • 最短のコードが優先されます。

回答:


8

APL(Dyalog Extended)、9 バイトSBCS

完全なプログラム。stdinにテキストの2Dブロックを要求し、k(APLの現在の設定に応じて0ベースまたは1ベース)、nの順に要求します。正のnは上に回転し、負のnは下に回転します。

ドメインは、次のいずれかで構成されます。

  1. スペースを除くすべてのUnicode文字。許可される値は1114111で、必要な20を超えます。

  2. 0を除くすべての数値で、約2 129の許容値が残っており、これは必要な20を超えています

APLでは2Dブロックが長方形である必要があるため、入力にはスペース/ゼロを埋め込む必要があります。これは、文字列/数値リストのリストの左側に入力することにより、自動的に実行できます。

⎕⌽@≠@⎕⍢⍉⎕

オンラインでお試しください!(見かけのスペースは実際には改行なしスペースです)

 テキストブロックのプロンプト

⍢⍉ 転置中:

@⎕ 入力の行に次を適用します。

  @≠ プロトタイプとは異なる要素(文字のスペース、数字のゼロ):

   ⎕⌽ 「入力」ステップを左に回転

APL(Dyalog Unicode)、22 バイト以上のSBCS

このバージョンでは、ゼロを識別可能な塗りつぶし要素として使用して、完全な文字セットを使用できます。

0~¨⍨↓⍉⎕⌽@(0≠⊢)@⎕⍉↑0,¨⎕

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

もちろん、これは数値引数にゼロを使用できないことを意味します。すべての数字に対応するプログラムでは、3つのオカレンスが0置き換えられ' '、スペースが塗りつぶされます。

' '~¨⍨↓⍉⎕⌽@(' '≠⊢)@⎕⍉↑' ',¨⎕

文字と数字の両方の完全な範囲(混合であっても)が本当に必要な場合は、nullを塗りつぶしとして使用できます。

n~¨⍨↓⍉⎕⌽@(n≠⊢)@⎕⍉↑⎕,¨⍨n←⎕NULL

最後に、入力ドメインにヌルとオブジェクトを含める場合、fillクラスを定義し、このインスタンスをfillとして使用できます。

~∘I¨⍨↓⍉⎕⌽@(~⊢∊I←⎕INSTANCES⊢∘C)@⎕⍉↑⎕,¨⍨⎕NEWFIX':Class C' ':EndClass'

ここで、これ(およびこのような新しい回答)を有効な回答として公式に宣言します。これがあまりにも煩わしい場合は申し訳ありません。
jimmy23013

nullバージョンよりも短い:n~¨⍨↓⍉⎕⌽@(≢¨)@⎕⍉↑⎕,¨⍨n←⊂⊂⍬ 拡張機能にmodded を追加して、さらにゴルフをすることもできます(ただし、それらがどれほど役立つかはわかりません)。
jimmy23013

@ jimmy23013ええ、私はそれを考えましたが、その後、任意にネストされたもののリストを取ることができません。最後のものは、特に場合、最終的な解決策であるCI彼らは汚染しないようにローカライズされています{~∘I¨⍨↓⍉⎕⌽@(~⊢∊I←⎕INSTANCES⊢∘C)@⎕⍉↑⎕,¨⍨⎕NEW⎕FIX I←C←':Class C' ':EndClass'}
アダム・

11

パイソン2111 110 109 99 98の 96の 94バイト

lambda a,n:[l[:n]+(l[n:]and[L[n]for L in a[i:]+a if L[n:]][1]+l[n+1:])for i,l in enumerate(a)]

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

入力を行のリストおよび0インデックス列として受け取り、文字列のリストを返します。

列が上に回転します1。

-11バイト、Jo Kingのおかげ


7

ジャワ8、107の 106 135 107バイト

k->m->{int s=m.length,i=-1;for(char p=0,t;i<s;t=m[i%s][k],m[i%s][k]=p<1?t:p,p=t)for(;m[++i%s].length<=k;);}

バグ修正のために+29バイト。

0インデックス付き。例のように下に回転します。
文字行列として入力。バイトを節約するために新しいものを返す代わりに、char-matrixを変更します。

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

説明:

k->m->{                 // Method with integer and char-matrix parameters and no return-type
  int s=m.length,       //  Amount of lines in the matrix `s`
      i=-1;             //  Index-integer `i`, starting at -1
  for(char p=0,         //  Previous-character, starting at 0
           t;           //  Temp-char, uninitialized
      i<s               //  Loop as long as `i` is smaller than `s`:
      ;                 //    After every iteration:
       t=m[i%s][k],     //     Set the temp to the `k`th character of the `i`'th line
       m[i%s][k]=       //     Replace the `k`'th character of the `i`'th line with:
         p<1?           //      If `p` is still 0:
          t             //       Set it to the temp we just set
         :              //      Else:
          p,            //       Set it to the previous-character instead
       p=t)             //     And then replace `p` with the temp for the next iteration
    for(;m[++i          //   Increase `i` by 1 before every iteration with `++i`,
             %s].length //   And continue this loop until the length of the `i`'th line
           <=k;);}      //   is smaller than or equal to the input `k`

1
私が気づいたことの1つは、最初の行に十分な文字があると仮定していることです char p=m[0][k]-それがない場合、これは例外をスローしませんか?いい仕事ですね。あなたは私のC#の試みを大きなマージンで打ち負かしている:)
dana

@danaあ、うん、あなたは正しい..たぶん、私は誤ってその仮定をするので、私はおそらくあなたがこの大きなマージンであなたをbeっています。.それを修正しようとします。
ケビンクルーッセン

1
@dana修正、気づいてくれてありがとう。
ケビンクルーッセン

2
@danaそして再び107に戻ります。;)
ケビンクルーッセン

1
nknkint p=0,t;pm[i%s][k]=(char)(p<1?t:p)

7

Zsh94 87 78 74 69バイト

算術3進に変更して-7バイト、インプレース文字(TIL)を変更して-9バイト、stdinのインデックスと文字列を引数として入力して-4バイト、配列の代わりに文字列を使用して-5バイト回転する文字を保存します。

read i
for s;c+=$s[i]
c=$c[-1]$c
for s;s[i]=$c[$[$#s<i?0:++j]]&&<<<$s

古い 古い 古い 古い オンラインで試してみてください!

この回答を機能させるための鍵は次のとおりです。

  • $array[0]または$string[0]常に空です
  • $array[n]または$string[n]、nが配列/文字列の長さより大きい場合は空
  • array[i]=cまたはstring[i]=c、要素/文字を置き換えます。
  • では$[$#s<i?0:++j]jは増加しません$#s<i

元の94バイトの回答には、<<<印刷に使用することに関連する興味深い問題がありました。私はechoそれを回避するために使用しなければなりませんでした:

for s;echo $s[0,i-1]$c[$[$#s<i?0:++j]]${s:$i}

この理由は次のとおりです。

echo $ZSH_SUBSHELL   # prints 0
<<< $ZSH_SUBSHELL    # prints 1

here-stringsは、別のプログラムにstdinとして渡されるため、サブシェルで実行されます。プログラムが指定されていない場合、暗黙的にに指定されcatます。これはで確認できます<<< $_<<< $ZSH_SUBSHELLに似ていecho $ZSH_SUBSHELL | catます。インクリメントする必要があるためj、サブシェルにすることはできません。


6

R、62バイト

function(L,n){L[A,n]<-rep(L[A<-L[,n]!=' ',n],2)[1+1:sum(A)];L}

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

入力をスペースで埋められた文字のマトリックスとして受け取ります。上に回転します。キリル・Lに感謝します!

R、74バイト

function(L,n){substr(L[A],n,n)=rep(substr(L[A<-nchar(L)>=n],n,n),2)[-1]
L}

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

この提出は、パディングされた行の許可よりも前です。

エイリアシングsubstr私たちが呼んでいるので、ここで仕事をしませんsubstrし、substr<-最初の行に。

非パディング行のリストとしてのI / O。上向きに回転します。


コンセンサスは入力の変更を許可するため、このクレイジーな
Kirill L.

また、OPはそれがスペースで埋め行列、のようなもので動作するようになりまし可能であるように、ルールを緩和し、この
キリルL.

@KirillL。Rが参照渡しになるとは思わないので、おそらくそれは許可されません。これは、引数がL親環境で指定されている場合にのみ機能することを私に印象付けます。ただし、スペースパディングを喜んで更新します!
ジュゼッペ

ああ、そうですね、あなたは正しいです。私はRubyの答えを見てこのアイデアを思いつきました(これにより1バイト全体が節約されます:))が、この状況では実際に言語は異なる動作をします。
キリルL.

5

C#(Visual C#Interactive Compiler)、82バイト

k=>a=>{var c='0';a.Where(b=>b.Count>k&&((b[k],c)=(c,b[k])).c>0).ToList()[0][k]=c;}

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

foreach12バイトの節約につながった提案をしてくれた@ASCIIOnlyに感謝します!

@someoneのおかげで-8バイト!
@EmbodimentofIgnoranceのおかげで-1バイト!



charの代わりにintを使用している場合は183
Expired Data

@ExpiredDataはcharではなくint
ASCIIのみ

あまりにも悪いあなたが使用することはできませんforeach、それは逆の順序:(だから
ASCIIのみ

1
dynamic宣言をマージして2バイトを保存するために使用します(これはこれまで見たことがない!)オンラインで試してみてください!
私の代名詞は


3

05AB1E、21 バイト

ʒg‹}U¹εXyk©diX®<èIèIǝ

間違いなくもっとゴルフをすることができます。

0インデックス付き。入力と出力の両方を文字列のリストとして。
例のように下に回転し<ますが、代わりに上>に回転するように置き換えることができます。

オンラインで試す(フッターはリストを改行で結合し、削除して実際のリスト出力を確認します)。

説明:

ʒ  }             # Filter the (implicit) input-list by:
 g               #  Where length of the current string
                #  is larger than the (implicit) input-integer
    U            # Pop and store this filtered list in variable `X`
¹ε               # Map over the first input-list again:
  Xyk            #  Get the index of the current string in variable `X`
     ©           #  Store it in the register (without popping)
      di         #  If the index is not -1, so the current string is present in variable `X`
        X®<è     #   Get the (index-1)'th string in variable `X`
            Iè   #   Get the character at the index of the input-integer
              Iǝ #   And insert it at the index of the input-integer in the current string

3

K4バイト

溶液:

{.[x;i;:;.q.rotate[1;x . i:(&y<#:'x;y)]]}

説明:

私が何かを逃しているかどうかわからない... 0インデックス、上に回転します(下に回転するには1を変更-1します)

{.[x;i;:;.q.rotate[1;x . i:(&y<#:'x;y)]]} / the solution
{                                       } / lambda taking implicit x and y
 .[x; ;:;                              ]  / index apply assignment back into x
         .q.rotate[1;                 ]   / left rotate 1 character
                           (       ; )    / two item list
                                    y     / index to rotate
                               #:'x       / count (#:) each (') input
                             y<           / index less than ?
                            &             / indexes where true
                         i:               / assign to variable w
                     x .                  / index into x
     i                                    / indexes we saved as i earlier

3

Japt v2.0a0、18バイト

入力と出力が複数行の文字列である0ベース。1回転します。

もっと短い方法があります!

yÈr\S_Y¦V?Z:°TgXrS

それを試してみてください

yÈr\S_Y¦V?Z:°TgXrS     :Implicit input of string U & integer V
y                      :Transpose
 È                     :Pass each line X at 0-based index Y through the following function & transpose back
  r                    :  Replace
   \S                  :  RegEx /\S/g
     _                 :  Pass each match Z through the following function
      Y¦V              :    Test Y for inequality with V
         ?Z:           :    If true, return Z, else
            °T         :    Increment T (initially 0)
              g        :    Index into
               XrS     :    X with spaces removed

コメントと新しいルールを詳しく見ていないので(以前はそうではなかったが、今では許可されていると言われているかもしれませんが)、最初の入力のスペースをスキップできますか?input-indexをに変更すると、1行目と4行目で6スペースがスキップされますが、他のほとんどの回答ではそのスペースも回転します。line withRotate here
ケビンクルーッセン

@KevinCruijssen、私はすべての追加の規則と手当に少し混乱していますが、それ問題であれば、入力にスペースを許可しないことでそれを回避できるようです。おもう。
シャギー

1
私は思う」この部分は、実際に私も応答する方法です(笑)。必須とオプションが何であるかはもうわかりませんが、入力および出力でスペースを省略することは実際に選択できると思います。スペースをカウントするかどうかを選択できると思います。そして、出力にトライアルスペースを使用できるかどうを考えます。など。やや混乱しています。よくああ...
ケビンCruijssen

3

ゼリー、16バイト

z⁷⁹ịỴFṙ-ṁƲY⁸ṛ⁹¦"

左側の行のリスト(改行文字を含まない文字のリスト)を受け入れ、右側の整数で行のリストを返す2項リンク。

オンラインでお試しください!(フッターは改行で分割され、リンクを呼び出し、再び改行で結合されます)

どうやって?

z⁷⁹ịỴFṙ-ṁƲY⁸ṛ⁹¦" - Link: lines L; index I        e.g. example in question; 20
z⁷               - transpose L with filler '\n'       ['AAART\nTW', '   oh\nhr', ...]
  ⁹ị             - Ith item                           'am\nv.\n\nt'
    Ỵ            - split at newlines                  ['am', 'v.', '', 't']
         Ʋ       - last four links as a monad - i.e. f(X):
     F           -   flatten                          'amv.t'
       -         -   -1
      ṙ          -   rotate left by                   'tamv.'
        ṁ        -   mould like X                     ['ta', 'mv', '', '.']
          Y      - join with newlines                 'ta\nmv\n\n.'
                 -   -- call this C
           ⁸     - chain's left argument, L
               " - zip with - i.e. [f(L1,C1), f(L2,C2), ...]:
              ¦  -   sparse application...
             ⁹   -   ...to indices: chain's right argument, I
            ṛ    -   ...of: right argument, Cn


2

Perl 6の38の 33バイト

配列を所定の位置に変更します(ルールは許可しません)

{@^a.grep(*>$^b+1)[*;$b].=rotate}

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


@joking最初は、出力するのではなく保存するのは少しごまかしだと思っていましたが、ルールを読み直すと、出力するための実際の規定がないので… (...)(...)を実行して31を取得することは間違いなく不正行為のようです。これは、ブロックから呼び出しを効果的に巻き上げているためです。それで行くよ。
user0721090601

ああ、間違ったリンクを貼り付けた。あなたは私がコメントする意味を理解しました。(それはこの場合には作業をしませんが)入力がうまくしかし完璧であるカリー、および参照によって渡される引数を変更することは許さ入力の標準fornです
ジョー・キング

2

JavaScript(Node.js)、52バイト

k=>a=>a.filter(b=>b[k]&&([b[k],a]=[a,b[k]]))[0][k]=a

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

シャギーのおかげで-7バイト!

JavaScriptの回答がまだありませんでした!私のC#回答のポート。


63バイト。おそらくさらにゴルフすることができます。
シャギー

@Shaggy-nice :)ほとんどの場合、JSがあらゆる種類のクレイジーなことをしていると答えます。今回は、戦略を持っていたので、試してみました。
ダナ

1
ああ、きれいにゴルフができました!:)
シャギー

2

34 28 21バイト

θJη⁰≔ΦKDLθ↓℅ιζUMζ§ζ⊖κ

オンラインでお試しください!リンクは、コードの詳細バージョンです。入力として文字列の配列を受け取ります。0インデックス。編集:これPeekDirectionは修正されました。直接操作できます。説明:

θ

入力文字列を出力します。

Jη⁰

回転する列の上部にジャンプします。

≔ΦKDLθ↓℅ιζ

印刷されたセルを抽出します。

UMζ§ζ⊖κ

印刷された各セルを前のセルの値に(周期的に)置き換えます。便利なことに、PeekDirection呼び出し時にセルの値が読み取られるため、MapCommand呼び出しがセルに新しい値を書き込むという事実は重要ではありません。


1

ピップ -rn、32バイト

POgY#(g@_)>aFI,#gFiyAE@ySsg@i@ag

0インデックス、下に回転します。 オンラインでお試しください!

回転に参加するのに十分な長さのすべての行のインデックスを見つけるためのフィルター。次に、これらの行をループし、各行の適切な文字を一時変数に交換しますs。最後に最初の行に再度アクセスすると、ダミー値が再びスワップアウトされます。


1

ゼリー、19バイト

ZnÄ×$ịḟ¹ṙ-;ɗɗʋ€⁹¦⁶Z

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

1インデックス。下に回転します。右詰めのJelly文字列のリスト(文字のリストのリスト)を最初の引数、kを2番目の引数として取るモナドリンク。右パディング以外の入力ではスペースを使用できませんが、他のすべての文字は許可されます。

TIOに実装されているように、フッターは単一の文字列入力を文字列のリストに分割して右詰めしますが、これは便宜上のものです。私が理解しているように、そのステップの結果は、ルールごとにメインリンクへの入力が許可されています。


1

GFortran、199バイト

-20程度、ファイルではなくstdinから読み込む場合
-14スペースを削除してi, k, n
-4の暗黙的な整数を使用する場合::

ユーザーが入力する必要があります kし、n最初のライン上にk回転するように列であり、nテキストの行数です。後続の入力は、回転するテキストの行です。これは書くのが大変でした!Fortranはとても独創的です!

character(99),allocatable::A(:);character(1)r,s
read(*,*)k,n;allocate(A(n))
do i=1,n;read(*,'(A)')A(i);r=A(i)(k:k)
if(r.ne.''.or.r.ne.' ')then;A(i)(k:k)=s;s=r;endif;enddo
A(1)(k:k)=s;print'(A)',A;end

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