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


58

Trong thử thách này, nhiệm vụ của bạn là giải mã 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 chữ số N (0 đến 9) gặp phải phải được thay thế bằng ký tự là vị trí N + 1 trước nó.

Thí dụ

Chuỗi đầu vào "Prog2am0in6"sẽ được giải mã theo cách này:

thí dụ

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

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 giải mã ban đầu được đảm bảo không chứa bất kỳ chữ số nào.
  • Khi một ký tự đã được giải mã, nó có thể được tham chiếu bằng một chữ số tiếp theo. Ví dụ, "alp2c1"nên được giải mã là "alpaca".
  • 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 sẽ 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 : a000
Output: aaaa

Input : ban111
Output: banana

Input : Hel0o W2r5d!
Output: Hello World!

Input : this 222a19e52
Output: this is a test

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

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

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

Chúng ta có thể nhận đầu vào dưới dạng một chuỗi các chuỗi ký tự không? Chúng ta có thể cho rằng con số sẽ không bao giờ lớn hơn 9 không?
fnɛtɪk

@ fəˈnɛtɪk Về định dạng đầu vào: Tôi sẽ nói không, trừ khi đây là định dạng duy nhất được chấp nhận cho ngôn ngữ của bạn. Chúng ta đang xử lý các chữ số đơn hơn là số. Vì vậy, có: nó được đảm bảo là <= 9 nhưng bạn có thể gặp một vài chữ số liên tiếp.
Arnauld

Sẽ 1bbablà một đầu vào hợp lệ (với đầu ra dự kiến ​​là abbab)? Nói cách khác, các tài liệu tham khảo có thể bao quanh chuỗi?
Lu-ca

@Luke Điểm tốt. Không, 1bbabkhông hợp lệ. Tôi đã thêm một giải thích về điều đó.
Arnauld

Câu trả lời:


11

Thạch , 9 7 byte

~ịṭṭµ@/

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

Làm thế nào nó hoạt động

~ịṭṭµ@/  Main link. Argument: s

    µ    Combine the four links to the left into a chain (arity unknown).
     @   Swap the chains arguments. This makes it dyadic.
      /  Reduce s by the chain with swapped arguments. It will be called with
         right argument r (the result of the previous call, initially the first 
         character) and left argument c (the next character of s).
~            Bitwise NOT of c. This maps a digit 'd' to ~d = -(d+1), but all 
             non-digit characters 'D' to 0.
  ṭ          Tack; append c to r.
 ị           Index; select the character of the result to the right at the
             index from the result to the left. Indexing is 1-based and modular,
             so 0 is the last character, -1 the second to last, etc.
   ṭ         Tack; append the resulting character to r.    

13

Java 7, 81 80 byte

void a(char[]a){for(int i=0;++i<a.length;)if(a[i]>47&a[i]<58)a[i]=a[i-a[i]+47];}

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

Đã lưu 1 byte nhờ vào Anders Tornblad . Ký tự đầu tiên không thể là một chữ số vì vậy nó không cần phải được kiểm tra nghĩa là chúng ta có thể tạo ra trước khi kiểm tra điều kiện chấm dứt của chúng ta.


2
Vì char đầu tiên không bao giờ có thể chứa một chữ số, bạn không cần phải kiểm tra nó. Do đó, vòng lặp của bạn có thể được for(int i=0;++i<a.length;){thay thế, lưu một char.
Anders Tornblad

12

Haskell, 55 byte

o#c|c>'/',c<':'=o!!read[c]:o|1<2=c:o
reverse.foldl(#)[]

Ví dụ sử dụng: reverse.foldl(#)[] $ "Prog2am0in6 Puz0les7&1Cod74G4lf"-> "Programming Puzzles & Code Golf". Hãy thử trực tuyến!

Giảm chuỗi thành bản sao ngược của chính nó với các số được thay thế bằng ký tự tương ứng. "Đảo ngược", bởi vì theo cách này, chúng ta có thể dễ dàng truy cập chuỗi cho đến nay khi lập chỉ mục các số. Đảo ngược nó một lần nữa.


1
Ồ, tôi đã viết giải pháp chính xác này nhưng tôi đã chậm trong việc đăng nó :) Vâng, ít nhất bây giờ tôi biết đó là một giải pháp tốt, +1
Leo

11

C, 46 byte

f(char*s){for(;*s++;)*s=s[(*s-52)/6?0:47-*s];}

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


C,  52   49  48 byte

Cảm ơn @ l4m2 vì đã tiết kiệm một byte!

f(char*s){for(;*s++;)*s>47&*s<58?*s=s[47-*s]:0;}

Chỉnh sửa chuỗi đầu vào trực tiếp.

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

Phiên bản 50 byte thay thế:

f(char*s){for(;*s++;)*s=abs(*s-57)>9?*s:s[47-*s];}

Phiên bản đệ quy, 48 byte:

f(char*s){*s>47&*s<58?*s=s[47-*s]:0;*s++&&f(s);}

9

05AB1E , 11 byte

vydiÂyèëy}J

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

Giải trình

v            # for each character y in input
 ydi         # if y is a digit
    Â        #    push a reversed copy of the string we've built up so far
     yè      #    push the character at index y in the reversed string
       ë     # else
        y    #    push y
         }   # end if
          J  # join stack to a single string
             # output top of the stack at the end of the loop

Tôi thực sự cần kiểm tra xem bạn đã trả lời thường xuyên hơn trước khi bắt đầu chưa.
Bạch tuộc ma thuật Urn

@carusocomputing: Bạn vẫn có thể nghĩ ra một số mẹo hay hơn tôi đã sử dụng;)
Emigna

7

JavaScript (ES6), 59 53 byte

f=x=>/\d/.test(x)?f(x.replace(/\d/,(m,o)=>x[o+~m])):x

Đã lưu 7 byte nhờ fəˈnɛtɪk.

f=x=>/\d/.test(x)?f(x.replace(/\d/,(m,o)=>x[o+~m])):x

console.log(f("Prog2am0in6"));
console.log(f("abcd"));
console.log(f("a000"));
console.log(f("ban111"));
console.log(f("Hel0o W2r5d!"));
console.log(f("this 222a19e52"));
console.log(f("golfin5 3s24o0d4f3r3y3u"));
console.log(f("Prog2am0in6 Puz0les7&1Cod74G4lf"));
console.log(f("Replicants 4re3lik448ny3oth8r5mac6in8.8T64y'r371it9376a1b5n1fit7or2a1h2z17d."));


.charAt (...) có thể được thay thế bằng [...] để tiết kiệm 7 byte
fəˈnɛtɪk

x.charAt (...) tương đương với x [...]
fəˈnɛtɪk

@ fəˈnɛtɪk Yep, tôi nghĩ rằng tôi đã thử điều đó trước đây nhưng nó đã gây ra lỗi. Cảm ơn!
Tom

1
o-m-1có thể được thay thế bằng o+~m.
Neil

2
Vì f được gọi đệ quy, nên số ký tự của chương trình phải bao gồm f=một phần, vì vậy đây là 54 byte, không phải 52.
user5090812

5

Võng mạc , 37 byte

Số lượng byte giả định mã hóa ISO 8859-1.

\d
$*«»
r1+`(?<=(.)(?<-2>.)*)(«)*»
$1

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

Giải trình

\d
$*«»

Thay thế mỗi chữ số d bằng d « s, theo sau là một ». Chúng ta cần a) sau để có thể nhận ra các vị trí trong đó d = 0 và b) làm dấu phân cách giữa các chữ số liền kề.

r1+`(?<=(.)(?<-2>.)*)(«)*»
$1

Lặp đi lặp lại ( +) khớp với biểu thức chính trên dòng đầu tiên từ phải sang trái ( r) và sau đó thay thế khớp bên trái nhất ( 1) bằng thay thế trên dòng thứ hai.

Bản thân regex khớp với một trong các chữ số đơn nhất hiện tại của chúng tôi và đếm số «s trong nhóm 2. Nhìn sau đó khớp với các ký tự d(?<-2>.)* trước khi bắt ký tự được gọi trong nhóm 1. Chuỗi của «s và »sau đó được thay thế bằng ký tự bị bắt .


5

MATL , 21 19 17 16 byte

"@t4Y2m?UQ$y]]&h

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

Giải trình

        % Implicitly grab input as a string
"       % For each character in the input
  @     % Push that character to the stack
  t     % Make a copy of it
  4Y2   % Push the pre-defined array '0123456789' to the stack
  m     % Check if the current character is part of this array (a digit)
  ?     % If it is
    UQ  % Convert it to a number and add 1 (N)
    $y  % Make a copy of the element N-deep in the stack. MATL uses one-based indexing
        % So 1$y is the element at the top of the stack, 2$y is the next one down, etc.
  ]     % End of if statement
        % Non-digit characters remain on the stack as-is
]       % End of for loop
&h      % Horizontally concatenate the entire stack to form a string
        % Implicitly display the result

Sử dụng tốt $ytrong phiên bản mới!
Luis Mendo

@LuisMendo Cảm ơn! Các ngôn ngữ dựa trên ngăn xếp của Yea rất phù hợp cho thử thách này
Suever

@LuisMendo Thật không may, điều này có thể đã được rút ngắn hơn nữa nếu Uchỉ làm việc cho các chữ số. Thật không may 'e'Umang lại lợi nhuận exp(1)nếu không tôi có thể đã thoát khỏi những 4Y2thứ
Suever

Một trong những điều khác của Octave ...
Luis Mendo

4

JavaScript (ES6), 51 byte

f=
s=>s.replace(/\d/g,(c,i)=>a[i]=a[i+=~c]||s[i],a=[])
<input oninput=o.textContent=f(this.value)><pre id=o>

a được sử dụng để lưu trữ các chữ số thay thế để xử lý các chữ số tham chiếu đến các chữ số khác.


`` `s => s.replace (a = / \ d / g, (c, i) => a [i] = a [i + = ~ c] || s [i])` ``
l4m2

3

Perl 5 , 34 byte

33 byte mã + -pcờ.

s/\d/substr$_,-$&-1+pos,1/e&&redo

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

s/\d/.../ethay thế chữ số đầu tiên bằng cách ...đánh giá là mã Perl. (với ...substr$_,-$&-1+pos,1trong trường hợp đó. substr$_,-$&-1+pos,1trả về chuỗi con của $_chiều dài 1ở index -$&-1+pos, nơi $&là số chỉ phù hợp, và poslà chỉ số của trận đấu bắt đầu. Chúng ta chỉ cần redonếu thay thế đã thành công để thay thế mỗi chữ số. (và kết quả được in ngầm nhờ -pcờ).


Cách tiếp cận cũ, 47 byte:

44 byte mã + -Fcờ.

map{$F[$i]=$F[$i-$_-1]if/\d/;++$i}@F;print@F

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

Khá thẳng về phía trước thực sự. -Fcờ chia các đầu vào trên mỗi ký tự thành @F. map{...}@Flặp qua @F(tức là mỗi ký tự của đầu vào). Nếu ký tự nếu một chữ số ( /\d/), thì chúng ta thay thế nó bằng ký tự tại chỉ mục $i-$_-1. Các $ilà biến chỉ số hiện tại (mà chúng tôi duy trì bằng cách tăng ở mỗi nhân vật nhìn thấy).


3

JavaScript ES6, 61 59 byte

Cảm ơn @Luke vì đã chơi golf 8 byte

x=>[...x].map((p,i,a)=>a[i]=/\d/.test(p)?a[i-1-p]:p).join``

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


x.split``cũng có thể [...x], [0-9]có thể \d, cùng nhau tiết kiệm 6B
Luke

Hiện tại có một lỗi ở đâu đó vì vậy sẽ sửa lỗi đó trước tiên
fnɛtɪk

x=>[...x].map((p,i,a)=>+p+1?a[i-1-p]:p).join``cho 46 byte
Luke

Thất bại cho dấu cách + "" cho 0 khiến nó lấy ký tự trước
fəˈnɛtɪk

x=>[...x].map((p,i,a)=>a[i]=1+p>9?a[i-1-p]:p).join``
l4m2

3

05AB1E , 27 17 byte

vyDdiU)DRXèU`X}}J

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

vy             }  # For each character
  Dd              #   Push is_number
    i         }   #   If it is
     U            #     Save save it
      )DR         #     Wrap the (reversed) stack into an array
         Xè       #     Get the character at the saved index
           U`X    #     Flatten the whole stack
                J # Join 

2

CJam, 13 byte

q{_A,s#)$\;}/

Bản demo trực tuyến.

Giải pháp này sử dụng toán tử "sao chép mục thứ n trên ngăn xếp" của CJam $để thực hiện giải mã. Nó bắt đầu bằng cách đọc đầu vào (với q) và sau đó lặp qua các ký tự từ chuỗi đầu vào và đổ chúng vào ngăn xếp (với {}/). Tuy nhiên, bên trong thân vòng lặp, nó cũng sao chép từng ký tự sau khi được đặt vào ngăn xếp (với _) và kiểm tra xem đó có phải là một chữ số hay không bằng cách tra cứu vị trí của nó với #chuỗi "0123456789", được biểu diễn thuận tiện như A,s.

Kết quả của việc tra cứu này là giá trị số của chữ số hoặc, nếu ký tự không phải là chữ số, -1. Sau )đó, toán tử tăng giá trị đó lên một và $thay thế nó bằng dòng ký tự ở nhiều vị trí bên dưới đỉnh của ngăn xếp. Cuối cùng, \;chỉ cần loại bỏ bản sao của ký tự đầu vào hiện tại mà chúng ta đã tạo _từ ngăn xếp, vì nó không còn cần thiết nữa.


2

Befunge-98 , 45 43 byte

::::#@~\1p:1g::'9`!\'/`*j;'/--1g\1p\1g#;,1+

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

Ý tưởng:

  1. Đối với mỗi char trong chuỗi đầu vào,
    1. Viết nó vào dòng 2
    2. Nếu nó không phải là một số, chỉ cần xuất nó
    3. Nếu không, tìm giá trị chính xác, viết lại, sau đó xuất nó
::::            ; There's a counter on the stack, duplicate it 4 times  ;
    #@~         ; Get the next char of input, exiting if there is none  ;
       \1p      ; At the location (counter, 1), write the input char    ;
          :1g   ; Re-obtain the char. Stack is now [counter * 4, input] ;

::                ; Stack: [counter * 4, input * 3]      ;
  '9`!\'/`*       ; If !(input > '9') and (input > '/')  ;
                  ; IE If ('0' <= input && input <= '9') ;
           j;...; ; Then execute the ...                 ;

; Stack: [counter * 4, input] ;
; The ... branch:             ;

'/-             ; input -> int. (input -= '/')             ;
   -            ; counter - int(input) - 1                 ;
                ; Stack: [counter * 3, lookupPosition ]    ;
    1g          ; Get the char that we want to find        ;
      \1p\1g#   ; Overwrite the current char (not the old) ;

; Both branches: ;
,1+             ; Print the number and increment the counter ;

Tôi không thể rút ngắn phiên bản này, nhưng phiên bản này có 44 byte:

s #@~\3p:3g::'9`!\'/`*j;'/--3g#;:10g3p,1+:::

Tôi nghĩ rằng tôi sẽ chia sẻ nó vì thủ thuật gọn gàng với s- nhưng việc lưu trữ bộ đếm trên ngăn xếp dẫn đến cải tiến 1 char đó



2

Python 2, 75 71 byte

s='';j=-1
for i in input():s+=s[j-int(i)]if'/'<i<':'else i;j+=1
print s

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

Chỉnh sửa: Đã sửa lỗi cho các giá trị ascii trong khoảng từ 32-47 ; Đã sửa lỗi giải mã kép (ví dụ: "alp2c1" thành "alpaca")


1
@Arnauld Không. Xin lỗi, tôi đã không đọc thông số kỹ thuật đủ chặt chẽ. Sẽ sớm sửa đổi
nghiện toán học

Có vẻ như có một lỗi. cho 'Prog2am0in6 Puz0les7&1Cod74G4lf'chương trình in của bạn Programming Puzzles &7Code1Golf! Tôi đã thử với cả hai liên kết TIO được chia sẻ!
Keerthana Mitchhakaran

@KeerthanaPrabhakaran Cảm ơn! Đã sửa với giá 0 byte! (Giải pháp thay thế của tôi đã không thực hiện việc cắt giảm)
nghiện toán học

Đó là một cách tiếp cận tuyệt vời!
Keerthana Mitchhakaran

Bạn có thể giải thích '/' <i <':'. Tôi biết đó là thử nghiệm nếu đó là một con số nhưng nó hoạt động như thế nào?
Matias K

2

PHP 7.1 67 59 byte

while(_&$c=$argn[$i++])$t.=($c^"0")<"
"?$t[~+$c]:$c;echo$t;

Lấy đầu vào từ STDIN; chạy như ống với -nRhoặc thử trực tuyến .

  • _&$c=$s[$i++]lặp qua chuỗi ( _&$csẽ dẫn đến kết quả là không phải "0"; vì vậy ký tự duy nhất có thể phá vỡ vòng lặp là chuỗi rỗng = kết thúc đầu vào)
  • $c^"0" chuyển các bit 5 và 6 trong mã ascii
  • <"\n" kiểm tra xem kết quả là <chr (10)
  • nếu vậy, nó là một chữ số: in ký tự trước theo chỉ mục (và sao chép vào chỉ mục hiện tại)
  • khác in nhân vật này

Cảm ơn @Christoph đã tiết kiệm 12%


1
Tôi biết đây là một câu trả lời cũ nhưng: bù đắp chuỗi âm! (và đó $s=$argn...?)for(;_&$c=$argn[$i++];)$t.=($c^"0")<"\n"?$t[~+$c]:$c;echo$t;
Christoph

2

Vim macro / tổ hợp phím, 49 byte

^M đại diện cho ký tự trả về (0x0A, 1 byte).

qqqqq/[0-9]^Myl:exe 'norm '.(@"+1).'h'^Mylnphx@qq@q

Giải trình

qqq                                                     clear register q
   qq                                                   record into q
     /[0-9]^M                                           move the cursor to the next digit
             yl                                         yank the digit
               :exe 'norm '.(@"+1).'h'^M                move the cursor left that number of characters plus one
                                        yl              yank the char
                                          n             go back to the digit
                                           p            paste the char 
                                            hx          delete the digit
                                              @q        recursive call
                                                q       stop recording
                                                 @q     run the macro

2

APL (Dyalog Classic) , 25 23 byte

-2 byte nhờ @FrownyFrog

((⊂⌷⊢)⍣≡⍳∘≢-11|⎕d∘⍳)⊃¨⊂

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

sử dụng ⎕io←1

( bên dưới là viết tắt của một giá trị trung gian trong đánh giá)

⎕d là chuỗi '0123456789'

⎕d⍳⍵tìm thấy các chỉ số (dựa trên 1 trong trường hợp này) của các ký tự trong ⎕d; đối với một chữ số không chỉ số là 11

11|⍵ là modulo - số 11 trở thành số 0

≢⍵ là chiều dài của

⍳≢⍵1 2 ...đến≢⍵

vì vậy, (⍳≢⍵)-11|⎕d⍳⍵cung cấp cho chúng ta một vectơ i của các chỉ số nơi chúng ta nên tìm để có được các ký tự kết quả; tuy nhiên một số chỉ số có thể chuyển hướng đến các chỉ số khác (nhỏ hơn). Để tính toán đóng cửa bắc cầu (tức là các chỉ số hiệu dụng), chúng ta lập chỉ mục vectơ thành chính nó ( ⊂⌷⊢, một chuyến tàu tương đương (⊂i)⌷ihoặc i[i]) và lặp lại điều đó cho đến khi nó ổn định ( ⍣≡được gọi là toán tử điểm cố định ).

cuối cùng chúng tôi lập chỉ mục vào chuỗi gốc: (...)⊃¨⊂


Làm thế nào nó sẽ trông giống như một chuyến tàu?
FrownyFrog

@FrownyFrog thực sự, ngắn hơn
ngn


1

Japt , 24 byte

£Xn >J?U=UhYUgJ+Y-X):PÃU

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

Giải trình:

£Xn >J?U=UhYUgJ+Y-X):PÃU
£                     Ã    Iterate through the input (implicit U) 
                             X becomes the iterative item, Y becomes the index
 Xn                          Try parseInt(X)
    >J                       > -1
                               In this case, this checks if X is a digit
      ?                      If true:
       U=                      Set U to 
         UhY                     U with the char at index Y set to:     
            UgJ+Y-X               The index at -1+Y-X
                   ):        Else:
                     P         variable P (just a no-op in this case)
                       U   Finally, return U


1

Python 2 , 58 byte

lambda s:reduce(lambda t,c:t+(c+t)['/'<c<':'and~int(c)],s)

Đây thực chất là một cổng của câu trả lời Jelly của tôi, cộng với kiểm tra chữ số từ câu trả lời Python của @ xnor.

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



1

JavaScript ES6, 54 byte

f=r=>[...r].reduce((a,s,i)=>a+(/\d/.test(s)?a[i+~s]:s))

f=r=>[...r].reduce((a,s,i)=>a+(/\d/.test(s)?a[i+~s]:s))

console.log(f("Prog2am0in6"));
console.log(f("abcd"));
console.log(f("a000"));
console.log(f("ban111"));
console.log(f("Hel0o W2r5d!"));
console.log(f("this 222a19e52"));
console.log(f("golfin5 3s24o0d4f3r3y3u"));
console.log(f("Prog2am0in6 Puz0les7&1Cod74G4lf"));
console.log(f("Replicants 4re3lik448ny3oth8r5mac6in8.8T64y'r371it9376a1b5n1fit7or2a1h2z17d."));


1
Chào mừng đến với PPCG! Nếu bạn không cần tên hàm của mình cho các cuộc gọi đệ quy, các hàm không tên là hợp lệ, vì vậy bạn có thể lưu hai byte trên f=.
Martin Ender

1

> <> (Cá), 108 byte (= 9 x 12 lưới)

01-r>:0(\
"/"&::;?/
)?\v    \
":/v!?(":
")\ :>:"0
 !?\
${/  \ -1
&>\ ~{:&$
\ \ :"0"=
/\- 1}$/?
:v&//}~/~
 \o}\&$/ 

Hãy thử nó ở đây để xem cá bơi xung quanh.

  • Nối -1 vào ngăn xếp đầu vào sau đó đảo ngược ngăn xếp.
  • Vòng lặp: Nếu giá trị hàng đầu là -1 thì kết thúc (chúng tôi đã đạp xe qua tất cả các ký tự). Nếu không thì:
  • Đặt nhân vật hàng đầu trong sổ đăng ký; kiểm tra xem liệu nó có nằm trong phạm vi "0" đến "9" không. Nếu vậy:
    • xoay ngăn xếp số lượng thích hợp của địa điểm
    • làm cho nhân vật được chỉ vào
    • quay lại và thay thế số bằng ký tự từ thanh ghi
  • Đầu ra; tiếp tục vòng lặp.

1

Mã máy 8086, 35 byte

00000000  be 82 00 ac 98 50 2c 30  3c 09 77 0c 4e 89 f7 4e  |.....P,0<.w.N..N|
00000010  29 c6 58 ac aa 89 fe 50  5a b4 02 cd 21 80 fa 0d  |).X....PZ...!...|
00000020  75 e1 c3                                          |u..|
00000023


1

Japt v2.0a0, 16 byte

r\d@=hYUgY-°X¹gY

Thử nó


Giải trình

                     :Implicit input of string U
r                    :Replace
 \d                  :  RegEx /\d/g
   @                 :  Pass each match X at index Y through a function
     hY              :    Set the character at index Y in U
       UgY-°X        :    To the character at index Y-++X
    =        ¹       :    Reassign to U
              gY     :    Get the character at index Y

1

J , 20 byte

{~[:{~^:_#\-2+_1".,.

Dùng thử trực tuyến

                  ,.  Each character on a separate row
              _1".    Convert to numbers, replacing non-numbers with -1
                         (it becomes one row again)
            2+        Add 2.
         #\           Prefix lengths (range 1..length)
           -          Subtract
  [:{~^:_             Index into itself as long as it changes the result
{~                    Index into the original string

Tín dụng cho ngn cho cảm hứng.

22 byte

(],,{~1{._1-_1".[)/@|.

Đây là một cổng của câu trả lời Jelly.

                    |. The string backwards, because reduce is right-to-left.
            _1".[      The next character as a number (d), -1 if it's not a number,
                          and a space character produces an empty array.
         _1-           -1-d
      1{.              Take 1. If we have a nothing
                          at this point, that makes it a 0.
   ,                   Prepend the next character to the result of the previous call.
    {~                 Select the character. 0 is the first, _2 is second to last.
 ],                    Append the result.

Trong cả hai giải pháp, phiên bản mà TIO sử dụng đều diễn giải một .số là số 0, do đó thử nghiệm cuối cùng không thành công. Các phiên bản cũ hơn (≤7) dường như hoạt động chính xác.

Hãy thử trực tuyế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.