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.

Oliver Ni
sumber
Ups, tidak, salahku
Oliver Ni
Terkait .
AdmBorkBork
@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.

James
sumber
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
Jonathan Allan
sumber
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]??" ";
Jörg Hülsermann
sumber
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 =~ /./
}
Yordania
sumber
2

Pyth - 5 byte

s.tcF

Cobalah online di sini .

Maltysen
sumber
+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.

Tidak
sumber
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
Produksi ETH
sumber
1

Python 2, 58 byte

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

Uji di Ideone .

Dennis
sumber
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)
Huntro
sumber
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.

Billywob
sumber
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 
Dada
sumber
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 " ".

Greg Martin
sumber
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.

dkudriavtsev
sumber
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
Gabriel Benamy
sumber
@ 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!

boboquack
sumber
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.
Sherlock9
sumber
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))));
downrep_nation
sumber
0

GolfSharp , (tidak bersaing) 82 byte

(s,i)=>r(0,i).m(x=>r(0,s.L()/i+1).s(n=>(n*3+x)).w(m=>m<s.L()).s(o=>s.R(o,1))).j();
downrep_nation
sumber
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
Guci Gurita Ajaib
sumber
0

Python 3, 48 byte

lambda c,k:''.join([c[i:-1:k]for i in range(k)])
0WJYxW9FMN
sumber
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
mazzy
sumber
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

Shaun Bebbers
sumber
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
streetster
sumber
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 '
Kevin Cruijssen
sumber