Chúng ta hãy làm một số enciph5r47g


35

Đây là nghịch đảo của Hãy thực hiện một số "deciph4r4ng"


Trong thử thách này, nhiệm vụ của bạn là mã hóa một chuỗi. May mắn thay, thuật toán khá đơn giản: đọc từ trái sang phải, mỗi ký tự viết điển hình (phạm vi ASCII 32-126) phải được thay thế bằng số N (0-9) để chỉ ra rằng nó giống với ký tự N + 1 vị trí trước nó. Ngoại lệ là khi ký tự không xuất hiện trong 10 vị trí trước đó trong chuỗi gốc. Trong trường hợp đó, bạn chỉ cần in lại ký tự. Hiệu quả, bạn sẽ có thể đảo ngược hoạt động từ thách thức ban đầu.

Thí dụ

Chuỗi đầu vào "Programming"sẽ được mã hóa theo cách này:

Ví dụ 1

Do đó, sản lượng dự kiến ​​là "Prog2am0in6".

Làm rõ và quy tắc

  • Chuỗi đầu vào sẽ chứa các ký tự ASCII trong phạm vi 32 - 126. Bạn có thể cho rằng nó sẽ không bao giờ trống rỗng.
  • Chuỗi ban đầu được đảm bảo không chứa bất kỳ chữ số nào.
  • Khi một ký tự đã được mã hóa, nó có thể lần lượt được tham chiếu bằng một chữ số tiếp theo. Ví dụ, "alpaca"nên được mã hóa thành "alp2c1".
  • Tài liệu tham khảo sẽ không bao giờ bao quanh chuỗi: chỉ các ký tự trước có thể được tham chiếu.
  • Bạn có thể viết một chương trình đầy đủ hoặc một chức năng, trong đó in hoặc xuất kết quả.
  • Đây là mã golf, vì vậy câu trả lời ngắn nhất trong byte thắng.
  • Sơ hở tiêu chuẩn bị cấm.

Các trường hợp thử nghiệm

Input : abcd
Output: abcd

Input : aaaa
Output: a000

Input : banana
Output: ban111

Input : Hello World!
Output: Hel0o W2r5d!

Input : this is a test
Output: this 222a19e52

Input : golfing is good for you
Output: golfin5 3s24o0d4f3r3y3u

Input : Programming Puzzles & Code Golf
Output: Prog2am0in6 Puz0les7&1Cod74G4lf

Input : Replicants are like any other machine. They're either a benefit or a hazard.
Output: Replicants 4re3lik448ny3oth8r5mac6in8.8T64y'r371it9376a1b5n1fit7or2a1h2z17d.

6
Tôi thấy rằng các trường hợp thử nghiệm của bạn luôn sử dụng chữ số thấp nhất có thể cho bất kỳ sự thay thế nào. Đây có phải là hành vi bắt buộc không, hay chúng ta cũng có thể sử dụng các chữ số cao hơn, khi có nhiều hơn một khả năng?
Leo

@Leo Bạn có thể sử dụng bất kỳ chữ số nào bạn muốn 0-9 miễn là hợp lệ.
Kỹ sư Toast

Đây giống như một bộ mã hóa di chuyển về phía trước , ngoại trừ không có sự di chuyển :)
đường ống

Câu trả lời:


6

05AB1E , 20 19 18 byte

-2 Cảm ơn Emigna

õ¹vDyåiDykëy}?yìT£

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

õ                  # Push an empty string
 ¹v y              # For each character in input
   D               # Duplicate the string on the stack (call this S)
     åi            # If this character is in S
       Dyk         #   Push the index of that that character 
          ë }      # Else
           y       #   Push the character 
             ?     # Print without newline
              yì   # Prepend this character to S
                T£ # Remove all but the first 10 elements from S

Tôi nghĩ rằng )¹vDyåiDykëy}?y¸ìT£làm việc là tốt.
Emigna

Trên thực tế, kết hợp câu trả lời của bạn với câu trả lời của tôi õIvDyåiDykëy}?yìT£cho 18 :)
Emigna

@Emigna Hãy thoải mái cập nhật thông tin của bạn với điều đó :)
Riley

Tôi sẽ không nghĩ về nó nếu không có câu trả lời của bạn, vì vậy bạn nên có nó. Làm tốt lắm!
Emigna

@Emigna Tôi đoán là công bằng. Cảm ơn!
Riley

12

Võng mạc , 24 23 byte

(.)(?<=\1(.{0,9}).)
$.2

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

Một sự thay thế regex khá đơn giản. Chúng tôi khớp từng ký tự và cố gắng tìm một bản sao của nó 0-9 ký tự trước nó. Nếu chúng tôi tìm thấy nó, chúng tôi thay thế ký tự bằng số lượng ký tự chúng tôi phải khớp để có được bản sao.

Các kết quả không hoàn toàn khớp với các trường hợp thử nghiệm, bởi vì trường hợp này sử dụng chữ số lớn nhất có thể thay vì chữ số nhỏ nhất có thể.


4
Biến chiều dài nhìn phía sau là gian lận: p
Dada

8
@Dada Lookbehind biến chiều dài là cách giác ngộ.
Martin Ender

Đáng buồn thay ... Nếu bạn chán, hãy thoải mái thực hiện chúng bên trong Perl!
Dada

Theo nhận xét của OP về nhiệm vụ ban đầu, "Bạn có thể sử dụng bất kỳ chữ số nào bạn muốn 0-9 miễn là hợp lệ." ... Vì vậy, lớn nhất có thể nên có hiệu lực
Doktor J

@DoktorJ có, tôi đã thay đổi nó sau khi OP thêm vào đó làm rõ.
Martin Ender

8

JavaScript (ES6), 74 57 54 byte

Đã lưu 3 byte nhờ vào ETHproductions với sự xuất sắc p=/./gthay vì p={}(lấy cảm hứng từ Neil)

s=>s.replace(p=/./g,(c,i)=>(i=p[c]-(p[c]=i))>-11?~i:c)

Các trường hợp thử nghiệm


Vì chuỗi được đảm bảo không chứa một chữ số, bạn có thể sử dụng sthay vì pkhông?
Neil

(Tôi đã có thể vượt qua findphiên bản gốc của bạn bằng cách sử dụng lastIndexOf, điều hơi ngạc nhiên khi nó dài 11 chữ cái ....)
Neil

@Neil Tôi không ở trước máy tính ngay bây giờ nhưng tôi không nghĩ rằng nó sẽ hoạt động vì các chuỗi JS là bất biến.
Arnauld

2
Tôi có thể xác nhận rằng cài đặt thuộc tính trên chuỗi ký tự không hoạt động. Nhưng ... có vẻ như nó hoạt động với regex, vì vậy tôi nghĩ bạn có thể làm s=>s.replace(p=/./g,(c,i)=>(i=p[c]-(p[c]=i))>-10?~i:c)để tiết kiệm 3 byte.
Sản xuất ETH

1
@ Tôi không thực sự biết chuyện gì đã xảy ra ở đây, nhưng hóa ra tôi đã giới thiệu một lỗi cho tất cả các trình duyệt trong lần chỉnh sửa cuối cùng của mình. Điều này hiện đã được sửa. Cảm ơn đã chú ý!
Arnauld

7

Haskell , 72 66 byte

Cảm ơn Laikoni vì đã chơi golf 6 byte!

(a:r)%s=last(a:[n|(n,b)<-zip['0'..'9']s,b==a]):r%(a:s)
e%s=e
(%"")

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

Hàm %giữ cho chuỗi được xử lý một phần đảo ngược trong đối số thứ hai của nó, vì vậy nó có thể tìm kiếm 10 phần tử đầu tiên của chuỗi này để tìm các lần xuất hiện của ký tự mà nó đang kiểm tra. Đệ trình bao gồm hàm không tên (%"")gọi hàm trước đó với chuỗi rỗng làm đối số thứ hai của nó.


f(a:s)=f s++(last$[a]:[show n|(n,b)<-zip[0..9]s,b==a])tiết kiệm hai byte.
Laikoni

Chờ đã, f(a:s)=f s++[last$a:[n|(n,b)<-zip['0'..'9']s,b==a]]tiết kiệm hơn nữa.
Laikoni

Đảo ngược khi đang di chuyển thay vì sử dụng reversetiết kiệm thêm một byte: Hãy thử trực tuyến!
Laikoni

@Laikoni Cảm ơn bạn, thật tuyệt vời!
Leo


3

Perl 5 , 36 byte

35 byte mã + -pcờ.

s/(\D)(.{0,9})\K\1/length$2/e&&redo

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

Một số giải thích:
Mục tiêu là thay thế một ký tự không có chữ số ( \Dnhưng nó tương ứng với độ phản \1hồi trong biểu thức chính của tôi) đi trước ít hơn 10 ký tự ( .{0,9}) và cùng một ký tự ( (\D)... \1) theo độ dài của .{0,9}nhóm ( length$2). Và redotrong khi các nhân vật được thay thế.


rõ ràng .*là không bắt buộc, bất kỳ char hợp lệ nào trong phạm vi trước khi chữ số thay thế đều ổn.
colsw

@ConnorLSW Yup, tôi vừa thấy bản cập nhật của thử thách và sửa đổi câu trả lời của tôi, cảm ơn vì đã chỉ ra nó.
Dada

3

Python 2, 89 84 byte

m=input()[::-1];j=1;t=''
for i in m:s=m[j:].find(i);t=[i,`s`][0<s<10]+t;j+=1
print t

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

Lặp lại qua chuỗi ngược lại và xây dựng một chuỗi mới với các số chính xác được chèn.


3

Japt , 18 byte

£¯Y w bX s r"..+"X

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

Giải trình

£   ¯  Y w bX s r"..+"X
mXY{s0,Y w bX s r"..+"X}
                          // Implicit: U = input string
mXY{                   }  // Replace each char X and index Y in U by this function:
    s0,Y                  //   Take U.slice(0,Y), the part of U before this char.
         w bX             //   Reverse, and find the first index of X in the result.
                          //   This gives how far back this char last appeared, -1 if never.
              s           //   Convert the result to a string.
                r"..+"X   //   Replace all matches of /..+/ in the result with X.
                          //   If the index is -1 or greater than 9, this will revert to X.
                          // Implicit: output result of last expression


2

05AB1E , 20 byte

õIv¹N£RT£©yåi®ykëy}J

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

Giải trình

õ                     # push an empty string
 Iv                   # for each [index,char] [N,y] in input
   ¹N£                # push the first N characters of input
      R               # reverse
       T£             # take the first 10 characters of this string
         ©            # save a copy in register
          yåi         # if y is in this string
             ®yk      #   push the index of y in the string in register
                ë     # else 
                 y    #   push y
                  }   # end if
                   J  # join stack as one string


2

C (tcc) , 113 byte

Vì hàm tạo một bản sao của chuỗi đầu vào, kích thước tối đa của đầu vào là 98 ký tự (quá đủ để phù hợp với đầu vào thử nghiệm dài nhất). Tất nhiên, điều này có thể được thay đổi thành bất kỳ giá trị khác.

i,j;f(char*s){char n[99];strcpy(n,s);for(i=1;s[i];i++)for(j=i-1;j>-1&&i-j<11;j--)if(n[i]==n[j])s[i]=47+i-j;j=-1;}

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

Chỉnh sửa

-15 byte. Cảm ơn Johan du Toit .


À! Giới hạn đầu vào là 98 ký tự và tiết kiệm cho mình một byte!
đường ống

Giải pháp hay nhưng bạn có thể tiết kiệm thêm 15 byte: i,j;f(char*s){char n[99];strcpy(n,s);for(i=1;s[i];i++)for(j=i-1;j>-1&&i-j<11;j--)if(n[i]==n[j])s[i]=47+i-j,j=-1;}
Johan du Toit

@JohanduToit Cảm ơn! Tôi có một câu hỏi. Chính xác thì s [i] hoạt động như một điều kiện của vòng lặp for như thế nào? Tôi đã thấy nó rất nhiều lần trong câu trả lời của người khác trên trang web này.
Maxim Mikhaylov

@Max Lawnboy. Ban đầu, bạn có các thông tin sau: 's [i] ^' \ 0 '' viết tắt cho 's [i]! =' \ 0 ''. Ký tự '\ 0' bằng 0 nên bạn có thể viết nó như thế này: 's [i]! = 0'. Câu lệnh if trong C chỉ kiểm tra nếu giá trị ước tính bằng 0 hoặc khác không nên '! = 0' là không cần thiết.
Johan du Toit


2

Java 7, 102 101 byte

void a(char[]a){for(int b=a.length,c;--b>0;)for(c=b;c-->0&c+11>b;)if(a[c]==a[b])a[b]=(char)(b-c+47);}

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

-1 byte nhờ Kevin Cruijssen . Tôi luôn thích một cái cớ để sử dụng toán tử go-to.


Tại sao --c>=0? Bạn có thể thay thế nó c-->0để lưu một byte.
Kevin Cruijssen

@KevinCruijssen Bằng cách nào đó tôi đã có nó trong đầu rằng tôi cần phải dự đoán trước nếu không tính toán thực tế sẽ sai ... Bắt tốt đẹp!
Chọc

1

MATL, 31 30 byte

&=R"X@@f-t10<)l_)t?qV}xGX@)]&h

Hãy thử nó tại MATL Online!

Giải trình

        % Implicitly grab input as a string
&=      % Perform element-wise comparison with automatic broadcasting.
R       % Take the upper-triangular part of the matrix and set everything else to zero
"       % For each column in this matrix
X@      % Push the index of the row to the stack
@f      % Find the indices of the 1's in the row. The indices are always sorted in
        % increasing order
-       % Subtract the index of the row. This result in an array that is [..., 0] where
        % there is always a 0 because each letter is equal to itself and then the ...
        % indicates the index distances to the same letters
t10<)   % Discard the index differences that are > 9
l_)     % Grab the next to last index which is going to be the smallest value. If the index
        % array only contains [0], then modular indexing will grab that zero
t?      % See if this is non-zero...
  qV    % Subtract 1 and convert to a string
}       % If there were no previous matching values
  x     % Delete the item from the stack
  GX@)  % Push the current character
]       % End of if statement
&h      % Horizontally concatenate the entire stack
        % Implicit end of for loop and implicit display

Bạn có thể là một chút nhưng tôi siêu không thể biết nơi. this is a testSản lượng đầu vào this 222a1te52thay vì this 222a19e52. Thứ hai tkhông được chuyển đổi thành 9.
Kỹ sư Toast

@EngineerToast Haha cảm ơn. Tôi sẽ xem qua một chút.
Suever

1

PHP, 104 byte

giải pháp chuyển tiếp

for($i=0;$i<strlen($a=&$argn);$f[$l]=$i++)$a[$i]=is_int($f[$l=$a[$i]])&($c=$i-$f[$l]-1)<10?$c:$l;echo$a;

Giải pháp ngược

Phiên bản trực tuyến

PHP, 111 byte

for(;++$i<$l=strlen($a=&$argn);)!is_int($t=strrpos($argn,$a[-$i],-$i-1))?:($p=$l-$i-$t-1)>9?:$a[-$i]=$p;echo$a;

PHP, 112 byte

for(;++$i<$l=strlen($a=&$argn);)if(false!==$t=strrpos($argn,$a[-$i],-$i-1))($p=$l-$i-$t-1)>9?:$a[-$i]=$p;echo$a;

Phiên bản trực tuyến


1

REXX, 124 125 byte

a=arg(1)
b=a
do n=1 to length(a)
  m=n-1
  c=substr(a,n,1)
  s=lastpos(c,left(a,m))
  if s>0&m-s<=9 then b=overlay(m-s,b,n)
  end
say b

Bạn có thể là một chút. Tôi không biết REXX nhưng tôi cho rằng lỗi nằm ở dòng 7, nơi nó có s<9thay vì s<10hoặc s<=9. this is a testSản lượng đầu vào this 222a1te52thay vì this 222a19e52. Thứ hai tkhông được chuyển đổi thành 9. Dùng thử trực tuyến
Kỹ sư Toast

Cảm ơn bạn, đó là một nỗ lực ngu ngốc để loại bỏ một byte. Mã đã được sửa.
idrougge

1

C (gcc) , 117 103 byte

i,j;f(char*s){for(i=strlen(s)-1;s[i];i--)for(j=i-1;s[j]&&i-j<11;j--)if(s[i]==s[j]){s[i]=47+i-j;break;}}

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

103 byte không nhập chuỗi.h, hoạt động w / cảnh báo. Nếu điều này là trái với quy tắc, tôi sẽ kéo nó

Mã đẹp:

i,j;
f(char *s) {
    // Chomp backwards down the string
    for(i=strlen(s)-1; s[i]; i--)
        // for every char, try to match the previous 10
        for(j=i-1; s[j] && i-j < 11; j--)
            // If there's a match, encode it ('0' + (i-j))
            if (s[i] == s[j]) {
                s[i] = 47+i-j;
                break;
            }
}

Chỉnh sửa:

  • Đã thay đổi từ LLVM sang gcc để cho phép khai báo i, j, loại bỏ nhập lib.
  • Đã thêm chức năng bao bọc cho tuân thủ

Đề xuất (i=strlen(s);s[--i];)thay vì(i=strlen(s)-1;s[i];i--)
trần
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.