Enkode cipher kolom


8

Diberikan string untuk menyandikan, dan sejumlah kolom (kunci), menyandikan string sebagai berikut:

Saya akan menggunakan contoh Hello, world!dan kuncinya3

Pertama, tuliskan jumlah kolom:

1 2 3

Selanjutnya, tulis teks mulai dari kiri atas, satu karakter per kolom, dan ketika Anda kehabisan kolom, pergi ke baris berikutnya.

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

Sekarang, untuk mendapatkan teks yang disandikan, baca teks mulai dari sudut kiri atas, tetapi kali ini, pertama baca satu kolom, lalu yang berikutnya, dan seterusnya. Jika tidak ada karakter di slot, beri spasi.

Hl r!eowl l,od 

Perhatikan bahwa di sini, ada ruang tambahan.

Ini adalah teks Anda yang disandikan.

Test case lain Programming Puzzles and Code Golf SEdengan kunci 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

Teks yang dikodekan adalah PagzaooErm lndl omPedef gius rnz CGS.

Lebih banyak kasus uji

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

Ingat, ini adalah , jadi kode dengan byte paling sedikit menang.


Ups, tidak, salahku
Oliver Ni


@TimmyD Diperbaiki ..
Oliver Ni

5
Saya pikir Anda harus menyertakan beberapa kasus uji lagi untuk memverifikasi bahwa bantalan ditangani dengan benar.
Dennis

Kasing uji baru Anda mengikuti pola yang sama persis dengan yang lama. Sebuah kasus tepi potensial terjadi ketika panjang string adalah kelipatan dari kunci, misalnya, Programming Puzzles and Code Golf, 3.
Dennis

Jawaban:


5

MATL , 4 byte

e!1e

Cobalah online!

Ini tentang sejelas mungkin. eadalah builtin yang membentuk kembali sebuah matriks menjadi n baris. Jadi kita baca di input1 sebagai string, dan bentuk ke dalam matriks dengan baris input2 :

Hl r!
eowl 
l,od 

Kemudian, kami memindahkannya untuk mendapatkan ini:

Hel
lo,
 wo
rld
!  

Setelah itu, kami hanya memanggil 1euntuk membentuk kembali menjadi satu baris, dan menampilkannya sebagai string.

Seperti yang Anda lihat dalam program sampel ini , fungsi "membentuk kembali" dengan mudah menambahkan nol sebanyak yang diperlukan agar matriks menjadi persegi panjang yang sempurna. Ketika ditampilkan sebagai string, MATL memperlakukan '0 sebagai spasi, jadi ini secara otomatis mengisi jumlah ruang yang diperlukan tanpa kerja ekstra.


dan kodenya hampir palindromic! :-)
Luis Mendo

1
@LuisMendo Oh, ini pasti palindrom, hanya saja tombol shift saya rusak. : P
James

5

Jelly , 3 byte

sz⁶

TryItOnline!

Bagaimana?

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

Ini tidak termasuk ruang pengisi.
xnor

Saya hanya tidak menyertakan spasi tambahan ketika saya mengetik argumen untuk contoh.
Jonathan Allan

Input tidak memiliki ruang tambahan. Anda diharuskan memasukkan spasi tambahan sebagai padding ketika panjang string bukan kelipatan dari angka.
xnor

Benarkah sekarang?
Jonathan Allan

1
Yup, terlihat bagus.
xnor

2

PHP, 85 Bytes

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

PHP, 90 Bytes

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

2

Ruby, 78 67 65 byte

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

Lihat di eval.in: https://eval.in/668412

Tidak disatukan

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

2

Pyth - 5 byte

s.tcF

Cobalah online di sini .


+1 Jauh lebih baik daripada solusi jelek saya. :)
boboquack

@oboquack jangan khawatir, pyth memiliki "gaya idiomatik" sendiri yang sebenarnya sedikit berbeda dari python, dan Anda akan mempelajarinya saat Anda menulis lebih banyak program (dan mulai mengingat daftar perintah: P). Semoga berhasil!
Maltysen

2

Python 2, 46 byte

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

Idenya adalah untuk mengambil string input, menyalinnya nkali dengan karakter pertama dari dihapus, lalu mengambil setiap nkarakter.

Mari kita lihat misalnya di s="abcdef", n=3, di mana panjangnya adalah kelipatan dari n:

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

Siklus pertama melalui string mengambil setiap nkarakter th dari yang pertama. Kemudian, setiap siklus berikutnya menggeser satu indeks ke kanan karena karakter pertama dilewati. Untuk memastikan bahwa panjangnya adalah kelipatan n, string awal diisi dengan spasi.


1

Japt, 15 byte

U+SpV f'.pV)y q

Uji secara online!

Japt memiliki "semua subbagian panjang N" built-in, tetapi tidak juga "semua subbagian yang tidak tumpang tindih" atau "setiap Nth char". Tiba-tiba, ada lubang menganga dalam hidupku ...

Penjelasan

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 byte

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

Uji di Ideone .


1
Saya sangat suka def f(s,n):t=[*s,' '];del t[print(end=s[::n]):f(''.join(t),n-1):n], tapi terlalu lama ...
Dennis

1

JavaScript (ES6), 84 byte

Ini solusi rekursif.

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 byte

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

Cobalah R-biola

Ini ternyata sedikit sakit kepala karena R secara otomatis mendaur ulang vektor input ketika baris atau kolom yang ditentukan dalam pembuatan matriks bukan kelipatan dari panjang input. Karena itu kita harus menambahkan vektor-nchar(x)%%n spasi sebelum meneruskannya ke fungsi matriks.

Langkah terakhir adalah hanya mentransposisikan matriks dan mencetaknya.


Apa tujuannya l=nchar(x)? Sepertinya Anda tidak menggunakan apa lpun. Fungsinya elcukup penemuan, +1.
plannapus

@plannapus, sejujurnya aku tidak tahu mengapa aku menaruhnya di sana. Saya percaya ini adalah sisa dari bagaimana saya pertama kali menghitung berapa kali ruang kosong diulang. Tangkapan yang bagus.
Billywob

1

Perl, 61 byte

54 byte kode dan -F -pibendera.

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

Mengambil string input tanpa baris akhir final, dan kunci harus ditempatkan setelah -ibendera:

$ 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 byte

Berkat miles untuk menghemat tiga byte!

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

Fungsi tanpa nama mengambil dua argumen, array karakter dan integer; mengembalikan array karakter. Sebagian besar pengangkatan berat dilakukan oleh Threadfungsi, yang (dalam konteks ini) bertukar baris dan kolom. Partitionperlu dipanggil dengan beberapa argumen yang tidak berguna sehingga akan sesuai dengan argumen kelima " ".


Anda juga dapat menggunakan ThreadbukanTranspose Join@@Thread@Partition[##,#2,1," "]&
mil

whoa. Aku mengerti sekarang!
Greg Martin

0

Ruby, 89 byte

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

Skor mengerikan, tips dihargai.


Gunakan sizesebagai ganti lengthuntuk satu byte.
Jordan

@ Jordan, bukankah itu dua?
dkudriavtsev

0

Perl, 87 byte

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

Menerima dua argumen sebagai parameter dan Penggunaan:

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

@ Dada Mengapa Anda tidak mempostingnya sebagai jawaban Anda sendiri?
boboquack

0

Pyth, 40 byte

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

Uji di sini

Mungkin kode Pyth paling jelek yang pernah ada, tapi ini adalah percobaan pertama saya di 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)

Jika ada yang punya tips untuk meningkatkan golf saya, silakan tinggalkan komentar!


Jangan khawatir, percobaan pertama saya dengan Pyth sama panjangnya :) Jumlah ruang untuk pad sama dengan (-len(Z))%Q, jadi Anda bisa menggantinya +Q-*Q/lZQlZdengan %_lZQ. (Atau, Anda bisa mengatur ulang +Q-*Q/lZQlZuntuk +-*/lZQQlZQIni tidak lebih pendek, tapi. +-*/Tampak dingin;))
ETHproductions

0

Sebenarnya , 12 byte

Saran bermain golf disambut baik, terutama jika Anda dapat menemukan cara bermain golf untuk mengisi ruang. Cobalah online!

;' *(q╪dX┬ΣΣ

Tidak melakukanolf

      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.

Versi 12 byte lainnya

Dalam versi ini, urutan input terbalik, tetapi ini dapat diubah jika itu tidak diizinkan. Saran bermain golf diterima. Cobalah online!

│l±%' *o╪┬ΣΣ

Tidak melakukanolf

      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 byte

Saya mohon maaf.

(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 Bytes

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

Pad input dengan plafon ukuran dibagi menjadi npotongan.

Dapatkan string empuk sebagai daftar karakter.

Susun menjadi n potongan dan transpos.

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

Hasil dalam:

PagzaooErm lndl omPedef gius    rnz CGS

0

Python 3, 48 byte

lambda c,k:''.join([c[i:-1:k]for i in range(k)])

0

Powershell, 57 byte

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

Skrip uji:

$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"
}

Keluaran:

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 byte BASIC tokenized

 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

Parameter pertama A$adalah nilai string yang ingin Anda sandi, dan yang kedua Aadalah jumlah kolom yang ingin Anda sandi. Variabel Cdigunakan untuk menambahkan baris baru setelah Akarakter.

Baris 4 hingga 6 termasuk mencetak nomor kolom di bagian atas area layar.

Baris 7 menambahkan baris baru ( "\r\n"setara).

Baris 8 - 13 kemudian akan mencetak setiap karakter A$.

Program ini tidak memerlukan ekspansi RAM untuk berfungsi.

Cipher kolom ZX81 menggunakan Sinclair BASIC canggih


0

K (oK) , 27 byte

Larutan:

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

Cobalah online!

Penjelasan:

{,/+(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 (warisan) , 3 byte

ôζJ

Versi Python legacy digunakan sebagai ganti penulisan ulang Elixir, karena versi baru tidak secara implisit mengubah string menjadi karakter ketika menggunakan zip , yang dilakukan versi lama.

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

ô      # 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 '
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.