Mã hóa mật mã cột


8

Đưa ra một chuỗi để mã hóa và một số cột (khóa), mã hóa chuỗi như sau:

Tôi sẽ sử dụng ví dụ Hello, world!và khóa3

Đầu tiên, viết ra số lượng cột:

1 2 3

Tiếp theo, viết văn bản bắt đầu từ phía trên bên trái, một ký tự cho mỗi cột và khi bạn hết cột, hãy chuyển đến dòng tiếp theo.

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

Bây giờ, để có được văn bản được mã hóa của bạn, hãy đọc văn bản bắt đầu từ góc trên cùng bên trái, nhưng lần này, trước tiên, hãy đọc một cột, sau đó tiếp theo, v.v. Nếu không có ký tự trong vị trí, hãy đặt khoảng trắng.

Hl r!eowl l,od 

Lưu ý rằng ở đây, có một không gian dấu.

Đây là văn bản được mã hóa của bạn.

Một trường hợp thử nghiệm khác là Programming Puzzles and Code Golf SEvới khóa 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

Các văn bản được mã hóa là PagzaooErm lndl omPedef gius rnz CGS.

Nhiều trường hợp kiểm tra

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

Hãy nhớ rằng, đây là , vì vậy mã có ít byte nhất sẽ thắng.


Rất tiếc, không, lỗi của tôi
Oliver Ni


@TimmyD Đã sửa ..
Oliver Ni

5
Tôi nghĩ bạn nên bao gồm một vài trường hợp kiểm tra nữa để xác minh rằng phần đệm được xử lý chính xác.
Dennis

Trường hợp thử nghiệm mới của bạn tuân theo chính xác mẫu tương tự như mẫu cũ. Trường hợp cạnh tiềm năng xảy ra khi độ dài của chuỗi là bội số của khóa, ví dụ Programming Puzzles and Code Golf, 3.
Dennis

Câu trả lời:


5

MATL , 4 byte

e!1e

Hãy thử trực tuyến!

Đây là về càng đơn giản càng tốt. elà một nội trang có thể định hình lại một ma trận thành n hàng. Vì vậy, chúng ta đọc trong input1 dưới dạng một chuỗi và định hình thành một ma trận với các hàng input2 :

Hl r!
eowl 
l,od 

Sau đó, chúng tôi hoán đổi nó để có được điều này:

Hel
lo,
 wo
rld
!  

Sau đó, chúng ta chỉ cần gọi 1eđể định hình lại nó thành một hàng duy nhất và hiển thị nó dưới dạng một chuỗi.

Như bạn có thể thấy trong chương trình mẫu này , hàm "định hình lại" thuận tiện thêm càng nhiều số không cần thiết để ma trận trở thành một hình chữ nhật hoàn hảo. Khi hiển thị dưới dạng chuỗi, MATL coi '0' là khoảng trắng, do đó, chuỗi này sẽ tự động điền vào số lượng khoảng trống cần thiết để không phải làm thêm.


và mã gần như palindromic! :-)
Luis Mendo

1
@LuisMendo Ồ, đó chắc chắn là một bảng màu, chỉ là phím shift của tôi bị hỏng. : P
James

5

Thạch , 3 byte

sz⁶

Dùng thử trực tuyến!

Làm sao?

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

Điều này không bao gồm các không gian phụ.
xnor

Tôi chỉ không bao gồm dấu cách khi tôi nhập đối số cho ví dụ.
Jonathan Allan

Đầu vào không có dấu cách. Bạn được yêu cầu chèn thêm khoảng trắng dưới dạng phần đệm khi độ dài chuỗi không phải là bội số của số.
xnor

Bây giờ có đúng không?
Jonathan Allan

1
Yup, có vẻ tốt.
xnor

2

PHP, 85 byte

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

PHP, 90 byte

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=~/./}

Xem nó trên eval.in: https://eval.in/668412

Ung dung

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

2

+1 Tốt hơn nhiều so với giải pháp xấu xí của tôi. :)
boboquack

@boboquack đừng lo lắng, pyth có "phong cách thành ngữ" riêng của nó thực sự hơi khác so với python và bạn sẽ học nó khi bạn viết nhiều chương trình hơn (và bắt đầu nhớ danh sách lệnh: P). Chúc may mắn!
Maltysen

2

Python 2, 46 byte

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

Ý tưởng là lấy chuỗi đầu vào, sao chép nlần đó với ký tự đầu tiên bị xóa, sau đó lấy mọi nký tự thứ.

Hãy xem ví dụ s="abcdef", n=3, trong đó độ dài là bội số của n:

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

Chu kỳ đầu tiên thông qua chuỗi lấy mọi nký tự thứ từ ký tự đầu tiên. Sau đó, mỗi chu kỳ tiếp theo sẽ dịch chuyển một chỉ số sang phải vì ký tự đầu tiên bị bỏ qua. Để đảm bảo rằng độ dài là bội số của n, chuỗi ban đầu được đệm bằng khoảng trắng.


1

Japt, 15 byte

U+SpV f'.pV)y q

Kiểm tra nó trực tuyến!

Japt có "tất cả các phần phụ có độ dài N" được tích hợp sẵn, nhưng không phải là "tất cả các phần phụ không chồng chéo" cũng không phải là "mọi phần thứ N". Đột nhiên, có một lỗ hổng trong cuộc sống của tôi ...

Giải trình

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]

Kiểm tra nó trên Ideone .


1
Tôi thực sự thích def f(s,n):t=[*s,' '];del t[print(end=s[::n]):f(''.join(t),n-1):n], nhưng nó quá dài ...
Dennis

1

JavaScript (ES6), 84 byte

Đó là một giải pháp đệ quy.

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

Hãy thử nó trên R-fiddle

Điều này hóa ra hơi đau đầu vì R tự động tái chế vectơ đầu vào khi các hàng hoặc cột được chỉ định trong quá trình tạo ma trận không phải là bội số của độ dài của đầu vào. Do đó, chúng ta phải đệm vectơ với -nchar(x)%%nkhoảng trắng trước khi chuyển nó vào hàm ma trận.

Bước cuối cùng chỉ là hoán vị ma trận và in nó.


Mục đích của nó là l=nchar(x)gì? Bạn dường như không sử dụng lbất cứ nơi nào. Chức năng ellà khá khám phá mặc dù, +1.
plannapus

@plannapus Thật lòng tôi không biết tại sao tôi lại đặt nó ở đó. Tôi tin rằng đó là phần còn lại của lần đầu tiên tôi tính số lần khoảng trống được lặp lại. Bắt tốt mặc dù.
Billywob

1

Perl, 61 byte

54 byte mã và -F -picờ.

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

Lấy chuỗi đầu vào mà không có dòng mới cuối cùng và khóa phải được đặt sau -icờ:

$ 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

Toán học, 43 40 byte

Nhờ dặm để lưu ba byte!

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

Hàm không tên lấy hai đối số, một mảng các ký tự và một số nguyên; trả về một mảng các ký tự. Hầu hết các công việc nặng được thực hiện bởi Threadchức năng, trong đó (trong bối cảnh này) trao đổi các hàng và cột. Partitioncần phải được gọi với một vài đối số vô dụng để nó sẽ đệm với đối số thứ năm " ".


Bạn có thể sử dụng Threadcũng thay vìTranspose Join@@Thread@Partition[##,#2,1," "]&
dặm

Ái chà. Giờ thì tôi hiểu rồi!
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}

Điểm số khủng khiếp, lời khuyên đánh giá cao.


Sử dụng sizethay vì lengthcho một byte.
Jordan

@Jordan Sẽ không phải là hai?
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;

Chấp nhận hai đối số là tham số và Cách sử dụng:

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

@Dada Tại sao bạn không đăng nó dưới dạng câu trả lời của riêng bạn?
boboquack

0

Bình thường, 40 byte

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

Kiểm tra nó ở đây

Có lẽ là mã Pyth xấu nhất từ ​​trước đến nay, nhưng đây là lần thử đầu tiên của tôi tại 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)

Nếu bất cứ ai có lời khuyên để cải thiện việc chơi golf của tôi, xin vui lòng để lại nhận xét!


Đừng lo lắng, lần thử đầu tiên của tôi với Pyth cũng dài như vậy :) Số lượng khoảng trống để đệm bằng (-len(Z))%Q, vì vậy bạn có thể thay thế +Q-*Q/lZQlZbằng %_lZQ. (Ngoài ra, bạn có thể sắp xếp lại +Q-*Q/lZQlZthành +-*/lZQQlZQ. Nó không ngắn hơn, nhưng +-*/trông rất tuyệt;))
Sản phẩm ETH

0

Trên thực tế , 12 byte

Đề nghị chơi gôn được chào đón, đặc biệt là nếu bạn có thể tìm ra một cách chơi gôn để đệm không gian. Hãy thử trực tuyến!

;' *(q╪dX┬ΣΣ

Ungolfing

      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.

Một phiên bản 12 byte khác

Trong phiên bản này, thứ tự của các đầu vào bị đảo ngược, nhưng điều này có thể được thay đổi nếu điều đó không được phép. Gợi ý chơi golf chào mừng. Hãy thử trực tuyến!

│l±%' *o╪┬ΣΣ

Ungolfing

      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

Tôi rât tiêc.

(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

GolfSharp , (không cạnh tranh) 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();

0

Groovy, 90 byte

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

Pad đầu vào bằng trần của kích thước được chia thành n khối.

Lấy chuỗi đệm như một danh sách các ký tự.

Đối chiếu thành n khối và hoán vị.

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

Kết quả trong:

PagzaooErm lndl omPedef gius    rnz CGS


0

Powershell, 57 byte

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

Kịch bản thử nghiệm:

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

Đầu ra:

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 được mã hóa

 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

Tham số đầu tiên A$là giá trị chuỗi mà bạn muốn mã hóa và thứ hai Alà số cột mà bạn muốn mã hóa. Biến Cđược sử dụng để thêm vào một dòng mới sau các Aký tự.

Các dòng 4 đến 6 bao gồm in ra các số cột ở đầu khu vực màn hình.

Dòng 7 thêm một dòng mới ("\r\n" tương đương).

Dòng 8 - 13 sau đó sẽ in ra từng ký tự của A$.

Chương trình này không yêu cầu mở rộng RAM để hoạt động.

Mật mã cột ZX81 sử dụng BASlair BASIC tiên tiến


0

K (oK) , 27 byte

Giải pháp:

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

Hãy thử trực tuyến!

Giải trình:

{,/+(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 (di sản) , 3 byte

ôζJ

Phiên bản kế thừa Python được sử dụng thay vì viết lại Elixir, vì phiên bản mới không hoàn toàn chuyển đổi chuỗi thành ký tự khi sử dụng zip, phiên bản cũ đã làm.

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

ô      # 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 '
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.