列暗号をエンコードする


8

エンコードする文字列と列数(キー)を指定して、次のように文字列をエンコードします。

Hello, world!とキーを使用します3

まず、列の数を書き出します。

1 2 3

次に、左上から列ごとに1文字ずつテキストを書き、列が足りなくなったら次の行に進みます。

1 2 3
H e l
l o ,
  w o
r l d
!

ここで、エンコードされたテキストを取得するには、左上隅からテキストを読み取りますが、今回は最初に1つの列を読み取ってから、次の列を読み取っていきます。スロットにキャラクターがいない場合はスペースを入れてください。

Hl r!eowl l,od 

ここには、末尾にスペースがあることに注意してください。

これはエンコードされたテキストです。

別のテストケースはProgramming Puzzles and Code Golf SEkeyを使っています5

1 2 3 4 5
P r o g r
a m m i n
g   P u z
z l e s  
a n d   C
o d e   G
o l f   S
E

エンコードされたテキストはPagzaooErm lndl omPedef gius rnz CGSです。

その他のテストケース

"abcdefghijklmnopqrstuvwxyz", 2 -> "acegikmoqsuwybdfhjlnprtvxz"
"codegolf.stackexchange.com", 4 -> "cg.ccgoooskhemdltea. efaxnc "
"Pen Pineapple Apple Pen!!!", 7 -> "PeAeeapnnpp! pl!Ple!ie  n P "
"1,1,2,3,5,8,13,21,34,55,89", 10 -> "18,,,5115,3,2,8,2931 ,, 53 ,4 "

これはなので、バイト数が最も少ないコードが優先されます。


おっと、いや、私のせい
Oliver Ni


@TimmyD Fixed ..
Oliver Ni

5
パディングが正しく処理されていることを確認するには、さらにいくつかのテストケースを含める必要があると思います。
Dennis

新しいテストケースは、古いテストケースとまったく同じパターンに従います。文字列の長さがキーの倍数であるとき、潜在的なエッジの場合は、例えば、発生しProgramming Puzzles and Code Golf3
Dennis

回答:


5

MATL、4バイト

e!1e

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

これは可能な限り簡単です。eマトリックスをn行に再形成する組み込み関数です。したがって、input1を文字列として読み取り、input2行の行列に整形します。

Hl r!
eowl 
l,od 

次に、これを転置してこれを取得します。

Hel
lo,
 wo
rld
!  

その後、呼び出し1eて単一の行に再形成し、文字列として表示します。

このサンプルプログラムでわかるように、「reshape」関数は、行列が完全な長方形になるために必要なだけのゼロを追加します。文字列として表示する場合、MATLは '0'をスペースとして処理するため、余分な作業を行わなくても必要な数のスペースが自動的に入力されます。


そしてコードはほぼ回文的です!:-)
Luis Mendo 2016年

1
@LuisMendoああ、それは間違いなく回文であり、シフトキーが壊れているだけです。:P
ジェームズ

5

ゼリー、3 バイト

sz⁶

TryItOnline!

どうやって?

sz⁶ - Main link: string, columns
s   - split string (a list of characters) into chunks of length column
 z  - transpose the resulting list of lists with filler
  ⁶ - literal ' '
    - implicit print

これにはフィラースペースは含まれません。
xnor 2016年

例の引数を入力するときに、末尾のスペースを含めなかっただけです。
ジョナサンアラン

入力に末尾のスペースがありません。文字列の長さが数値の倍数でない場合は、パディングとして余分なスペースを挿入する必要があります。
xnor 2016年

今は正しいですか?
ジョナサンアラン

1
うん、よさそうだ。
xnor 2016年

2

PHP、85バイト

for(;$i<$x=$argv[2];$i++)for($j=0;$j<strlen($t=$argv[1])/$x;)echo$t[$i+$j++*$x]??" ";

PHP、90バイト

for(;$i<$x=$argv[2];$i++)foreach(array_chunk(str_split($argv[1]),$x)as$a)echo$a[+$i]??" ";

2

Ruby、78 67 65バイト

->s,k{s.gsub!(/(.)(.{,#{k-=1}})/){$><<$1
$2.ljust k}while s=~/./}

eval.inで確認してくださいhttps ://eval.in/668412

未ゴルフ

->s,k{
  s.gsub!(/(.)(.{,#{ k -= 1 }})/) {
    $> << $1
    $2.ljust k
  } while s =~ /./
}

2

+1私の醜い解決策よりはるかに良い。:)
boboquack

@boboquackは心配する必要はありません。pythには独自の「慣用的なスタイル」があり、実際にはpythonとはかなり異なります。さらに多くのプログラムを書くと、それがわかります(そしてコマンドリスト:Pを覚え始めます)。幸運を!
Maltysen 2016年

2

Python 2、46バイト

lambda s,n:(s[0]+(s[1:]+-len(s)%n*' ')*n)[::n]

アイデアは、入力文字列を取得nし、最初の文字を削除してそれを何度もコピーし、次にn'番目の文字ごとに取得することです。

たとえばs="abcdef", n=3、長さが次の倍数であるを見てみましょうn

abcdefbcdefbcdef
^  ^  ^  ^  ^  ^
a  d  b  e  c  f

文字列の最初のサイクルでnは、最初の1文字からすべての文字が使用されます。その後、後続の各サイクルでは、最初の文字がスキップされるため、1つのインデックスが右にシフトします。長さがの倍数になるようnに、最初の文字列にはスペースが埋め込まれます。


1

Japt、15バイト

U+SpV f'.pV)y q

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

Japtには「長さNのすべてのサブセクション」が組み込まれていますが、「すべての重複しないサブセクション」も「N番目ごとの文字」もありません。突然、私の人生には大きな穴があります...

説明

U+SpV            // Take U concatenated with V spaces.
      f'.pV)     // Take every substring of 3 chars.
            y    // Transpose the resulting array.
              q  // Join on the empty string.
                 // Implicit: output last expression

1

Python 2、58バイト

lambda s,n:`sum(zip(*zip(*n*[iter(s+' '*~-n)])),())`[2::5]

Ideoneでテストします。


1
私は本当に好きdef f(s,n):t=[*s,' '];del t[print(end=s[::n]):f(''.join(t),n-1):n]ですが、それは長すぎます...
Dennis

1

JavaScript(ES6)、84バイト

これは再帰的なソリューションです。

f=(s,k,i=0,r=Math.ceil(s.length/k),c=s[i%r*k+i/r|0])=>k*r==i?'':(c?c:' ')+f(s,k,++i)

1

R、92 81バイト

function(x,n)cat(t(matrix(c(el(strsplit(x,"")),rep(" ",-nchar(x)%%n)),n)),sep="")

R-fiddleで試してください

行列の作成で指定された行または列が入力の長さの倍数でない場合、Rは自動的に入力ベクトルをリサイクルするため、これは少し頭痛の種であることがわかりました。したがって-nchar(x)%%n、マトリックス関数に渡す前に、スペースでベクターを埋め込む必要があります。

最後のステップは、マトリックスを転置して印刷することです。


の目的はl=nchar(x)何ですか?lどこでも使用していないようです。elただし、機能はかなりの発見です。+ 1。
plannapus

@plannapus正直なところ、なぜそこに置いたのかわかりません。これは、空白が繰り返された回数を最初に計算した方法の名残だと思います。いいキャッチ。
Billywob 2016年

1

Perl、61バイト

54バイトのコードと-F -piフラグ。

for$l(1..$^I){$\.=$F[$^I*$_+~-$l]//$"for 0..$#F/$^I}}{

最後の改行なしで入力文字列を受け取り、キーは-iflagの後に配置する必要があります。

$ echo -n "Hello, World!" | perl -F -pi3 -E 'for$l(1..$^I){$\.=$F[$^I*$_+~-$l]//$"for 0..$#F/$^I}}{'
Hl r!eoWl l,od 

1

Mathematica、43 40バイト

マイルを3バイト節約してくれてありがとう!

Join@@Thread@Partition[##,#2,{1,1}," "]&

文字配列と整数の2つの引数を取る名前のない関数。文字の配列を返します。重い作業のほとんどは、Threadこのコンテキストで行と列を交換する関数によって行われます。Partition5番目の引数が埋め込まれるように、2つの役に立たない引数を指定して呼び出す必要があります" "


あなたは使用することができますThreadまた、代わりにTranspose Join@@Thread@Partition[##,#2,1," "]&
マイル

うわあ。わかった!
グレッグマーティン

0

Ruby、89バイト

->s,i{t="";i.times{|n|s.ljust(i*(s.size*1.0/i).ceil).scan(/#{?.*i}/).each{|j|t<<j[n]}};t}

ひどいスコア、ヒントは高く評価されています。


1バイトのsize代わりに使用しlengthます。
ジョーダン

@ジョーダン二人じゃないの?
dkudriavtsev

0

Perl、87バイト

($a,$b)=@ARGV;for$c(1..$a){for(0..(length$a)/$b){$e.=substr($a,$b*$_+$f,1)}$f++;}say$e;

2つの引数をパラメーターおよび使用法として受け入れます。

perl -M5.010 encol.pl "Hello, World!" 3
Hl r!eoWll,od

@ダダ自分の答えとして投稿してみませんか?
boboquack

0

Pyth、40バイト

=Zw=+Z*d+Q-*Q/lZQlZV*QlZIq%%NlZQ/NlZp@ZN

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

おそらくこれまでで最も醜いPythコードですが、これはPythでの私の最初の試みです。

=Zw=+Z*d+Q-*Q/lZQlZV*QlZIq%%NlZQ/NlZp@ZN
         Q                               Set Q to eval(input())
=Zw                                      Initialises Z to next input string
              lZ                         Gets the length of Z
             /lZQ                        Integer divides lZ by Q
           *Q/lZQ                        Multiplies that result by Q
          -*Q/lZQlZ                      Subtracts the length of Z from that
        +Q-*Q/lZQlZ                      Adds Q to that
                                         (This is how many spaces to pad)
      *d+Q-*Q/lZQlZ                      Gets that many spaces (d is set to ' ')
   =+Z*d+Q-*Q/lZQlZ                      Appends that to Z
                    *QlZ                 Multiplies Q by lZ
                   V*QlZ                 Does a for loop for integers in that range, on N
                           %NlZ          Gets N modulo lZ
                          %%NlZQ         Gets that modulo Q
                                         This is the column of the letter at index N mod Q
                                /NlZ     Gets the column that is being printed
                        Iq%%NlZQ/NlZ     If they are equal...
                                    p@ZN Print the index of N into Z without a newline
                                         (This is implicitly modulo the length of Z)

誰かが私のゴルフを改善するためのヒントを持っている場合は、コメントを残してください!


心配しないで、Pythと私の最初の試みは、ちょうど同じ長さだった:)パッドにスペースの数に等しく、(-len(Z))%Qあなたが交換できるように、+Q-*Q/lZQlZ%_lZQ。(または、並べ替えることができ+Q-*Q/lZQlZ+-*/lZQQlZQそれは短くはないが、。+-*/ルックスは冷却;))
ETHproductions

0

実際には、12バイト

ゴルフ場の提案は歓迎します。特に、スペースを埋めるゴルファーの方法を見つけられる場合はなおさらです。オンラインでお試しください!

;' *(q╪dX┬ΣΣ

アンゴルフ

      Implicit input s, then n.
;     Duplicate n. Stack: n, n, s
' *   Push n spaces.
(q    Rotate s to TOS and append the spaces to the end of s.
╪     Split s into n-length substrings.
dX    Dequeue and discard any extra spaces that remain after chunking.
      This works even when we didn't need to add spaces in the first place.
┬     Transpose the remaining substrings. This returns a list of lists of chars.
Σ     Sum the transposed substrings into one list of chars.
Σ     Sum the list of chars into one string.
      Implicit return.

別の12バイトバージョン

このバージョンでは、入力の順序が逆になっていますが、許可されていない場合はこれを変更できます。ゴルフの提案を歓迎します。オンラインでお試しください!

│l±%' *o╪┬ΣΣ

アンゴルフ

      Implicit input n first, then s.
│     Duplicate stack. Stack: s, n, s, n
l±    Push -len(s).
%     Push -len(s)%n, which gets the number of spaces we need to pad with. Call this m.
' *   Push m spaces to the stack.
o     Append the spaces to the end of s.
╪     Split s into n-length substrings.
┬     Transpose these substrings. This returns a list of lists of chars.
Σ     Sum the transposed substrings into one list of chars.
Σ     Sum the list of chars into one string.
      Implicit return.


0

C#、161バイト

本当に申し訳ない。

(s,i)=>String.Join("",Enumerable.Range(0,i).SelectMany(x=>Enumerable.Range(0,s.Length/i+1).Select(n=>(n*3+x)).Where(m=>m<s.Length).Select(o=>s.Substring(o,1))));


0

Groovy、90バイト

{s,n->(s.padRight((int)(s.size()/n+1)*n) as List).collate(n).transpose().flatten().join()}

nチャンクに分割されたサイズの上限で入力をパディングします。

パディングされた文字列を文字のリストとして取得します。

n個のチャンクに照合し、転置します。

({s,n->(s.padRight((int)(s.size()/n+1)*n) as List).collate(n).transpose().flatten().join()})("Programming Puzzles and Code Golf SE",5)

結果:

PagzaooErm lndl omPedef gius    rnz CGS


0

Powershell、57バイト

param($s,$n)$r=,''*$n
$s|% t*y|%{$r[$i++%$n]+=$_}
-join$r

テストスクリプト:

$f = {

param($s,$n)$r=,''*$n
$s|% t*y|%{$r[$i++%$n]+=$_}
-join$r

}

@(
    ,("abcdefghijklmnopqrstuvwxyz", 2  , "acegikmoqsuwybdfhjlnprtvxz")
    ,("codegolf.stackexchange.com", 4  , "cg.ccgoooskhemdltea.efaxnc")
    ,("Pen Pineapple Apple Pen!!!", 7  , "PeAeeapnnpp! pl!Ple!ie n P")
    ,("1,1,2,3,5,8,13,21,34,55,89", 10 , "18,,,5115,3,2,8,2931,,53,4")
) | % {
    $s,$n,$expected = $_
    $result = &$f $s $n
    "$($result-eq$expected): $result"
}

出力:

True: acegikmoqsuwybdfhjlnprtvxz
True: cg.ccgoooskhemdltea.efaxnc
True: PeAeeapnnpp! pl!Ple!ie n P
True: 18,,,5115,3,2,8,2931,,53,4

0

SINCLAIR ZX81 / TIMEX TS-1000 / 1500 BASIC、134トークン化BASICバイト

 1 INPUT A$
 2 INPUT A
 3 LET C=-SGN PI
 4 FOR I=SGN PI TO A
 5 PRINT I;
 6 NEXT I
 7 PRINT
 8 FOR I=SGN PI TO LEN A$
 9 LET C=C+SGN PI
10 IF C=A THEN LET C=NOT PI
11 IF NOT C AND I>SGN PI THEN PRINT
12 PRINT A$(I);
13 NEXT I

最初のパラメーターA$は暗号化する文字列値で、2番目のパラメーターはA暗号化する列の数です。変数Cは、A文字の後に新しい行を追加するために使用されます。

4行目から6行目までは、画面領域の上部に列番号を出力します。

7行目は新しい行を追加します("\r\n"同等)。

次に、8〜13行目での各文字が出力されA$ます。

このプログラムは、動作するためにRAM拡張を必要としません。

高度なSinclair BASICを使用したZX81列暗号


0

K(OK)、27バイト

解決:

{,/+(0N;y)#(y*-_-(#x)%y)$x}

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

説明:

{,/+(0N;y)#(y*-_-(#x)%y)$x} / the solution
{                         } / lambda taking implicit x and y
                        $x  / pad x 
           (           )    / do this together
                     %y     / divide by y
                 (  )       / do this together
                  #x        / count (#) length of x
                -           / negate \
               _            / floor   | ceiling
              -             / negate /
            y*              / multiply by y
          #                 / reshape
    (0N;y)                  / null by y grid
   +                        / transpose
 ,/                         / flatten

0

05AB1E(レガシー)、3 バイト

ôζJ

Elixir rewriteの代わりにPythonのレガシーバージョンが使用されます。これは、新しいバージョンではzip、古いバージョンのように、を使用したときに文字列が暗黙的に文字に変換されないためです。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

ô      # Split the (implicit) input-String into chunks of size (implicit) input-integer
       #  i.e. "Hello, world!" and 3 → ['Hel','lo,',' wo','rld','!']
 ζ     # Zip, swapping rows and columns (with space filler by default)
       #  i.e. ['Hel','lo,',' wo','rld','!'] → ['Hl r!','eowl ','l,od ']
  J    # Join the list of strings together (and output implicitly)
       #  i.e. ['Hl r!','eowl ','l,od '] → 'Hl r!eowl l,od '
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.