ลองทำ“ deciph4r4ng”


58

ในความท้าทายนี้งานของคุณคือการถอดรหัสสตริง โชคดีที่อัลกอริทึมนั้นค่อนข้างง่าย: การอ่านจากซ้ายไปขวาแต่ละหลักที่พบN (0 ถึง 9) จะต้องถูกแทนที่ด้วยอักขระซึ่งเป็นตำแหน่งN + 1ก่อนหน้านี้

ตัวอย่าง

สตริงอินพุต"Prog2am0in6"จะถูกถอดรหัสด้วยวิธีนี้:

ตัวอย่าง

"Programming"ดังนั้นการส่งออกที่คาดว่าจะเป็น

คำอธิบายและกฎ

  • สตริงอินพุตจะมีอักขระ ASCII ในช่วง 32 - 126 เท่านั้น คุณสามารถสันนิษฐานได้ว่ามันจะไม่มีวันว่างเปล่า
  • สายอักขระถอดรหัสดั้งเดิมนั้นรับประกันว่าจะไม่มีตัวเลขใด ๆ
  • เมื่อตัวละครได้รับการถอดรหัสแล้วมันอาจจะถูกอ้างอิงโดยตัวเลขที่ตามมา ยกตัวอย่างเช่นควรจะถอดรหัสเป็น"alp2c1""alpaca"
  • การอ้างอิงจะไม่ล้อมรอบสตริง: สามารถอ้างอิงอักขระก่อนหน้าเท่านั้น
  • คุณสามารถเขียนโปรแกรมเต็มรูปแบบหรือฟังก์ชั่นซึ่งพิมพ์หรือส่งออกผลลัพธ์
  • นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุดเป็นไบต์ชนะ
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

กรณีทดสอบ

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.

เราสามารถรับอินพุตเป็นอาร์เรย์ของสตริงอักขระเดี่ยวได้หรือไม่? เราสามารถสมมติได้ว่าตัวเลขจะไม่มากกว่า 9 หรือไม่?
fəˈnɛtɪk

@ fəˈnɛtɪk เกี่ยวกับรูปแบบการป้อนข้อมูล: ฉันจะบอกว่าไม่เว้นแต่จะเป็นรูปแบบที่ยอมรับได้สำหรับภาษาของคุณเท่านั้น เรากำลังจัดการกับหลักเดียวมากกว่าตัวเลข ใช่แล้ว: รับประกันว่าจะเป็น <= 9 แต่คุณอาจพบตัวเลขหลายหลักติดต่อกัน
Arnauld

จะ1bbabเป็นอินพุตที่ถูกต้อง (พร้อมเอาต์พุตที่คาดไว้abbab) กล่าวอีกนัยหนึ่งการอ้างอิงสามารถล้อมรอบสตริงได้หรือไม่
ลุค

@ ลุคจุดดี ไม่1bbabไม่ถูกต้อง ฉันได้เพิ่มคำอธิบายเกี่ยวกับเรื่องนั้น
Arnauld

คำตอบ:


11

เยลลี่ , 9 7 ไบต์

~ịṭṭµ@/

ลองออนไลน์!

มันทำงานอย่างไร

~ịṭṭµ@/  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 ไบต์

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];}

ลองออนไลน์!

ที่บันทึกไว้ 1 ขอบคุณไบต์เด Tornblad อักขระตัวแรกไม่สามารถเป็นตัวเลขได้ดังนั้นจึงไม่จำเป็นต้องมีการตรวจสอบซึ่งหมายความว่าเราสามารถดำเนินการก่อนการตรวจสอบเงื่อนไขการยกเลิกของเรา


2
เนื่องจากอักขระตัวแรกไม่สามารถมีตัวเลขได้คุณจึงไม่ต้องตรวจสอบมัน ดังนั้นการวนซ้ำของคุณจึงสามารถfor(int i=0;++i<a.length;){ประหยัดได้หนึ่งอักขระ
Anders Tornblad

12

Haskell, 55 ไบต์

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

ตัวอย่างการใช้งาน: ->reverse.foldl(#)[] $ "Prog2am0in6 Puz0les7&1Cod74G4lf" ลองออนไลน์!"Programming Puzzles & Code Golf"

ลดสตริงเป็นสำเนาย้อนกลับของตัวเองด้วยตัวเลขที่ถูกแทนที่ด้วยตัวอักษรที่เกี่ยวข้อง "reverse" เนื่องจากวิธีนี้เราสามารถเข้าถึงสตริงได้ง่ายเมื่อทำการจัดทำดัชนีตัวเลข ย้อนกลับอีกครั้ง


1
ว้าวฉันได้เขียนคำตอบที่ถูกต้อง แต่ฉันช้าในการโพสต์ :) ดีอย่างน้อยตอนนี้ฉันรู้ว่ามันเป็นสิ่งที่ดี +1
Leo

11

C, 46 ไบต์

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

ลองออนไลน์!


C,  52   49  48 ไบต์

ขอบคุณ @ l4m2 สำหรับการบันทึกไบต์!

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

แก้ไขสตริงอินพุตโดยตรง

ลองออนไลน์!

ทางเลือกรุ่น 50- ไบต์:

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

เวอร์ชันแบบเรียกซ้ำ 48 ไบต์:

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

9

05AB1E , 11 ไบต์

vydiÂyèëy}J

ลองออนไลน์!

คำอธิบาย

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

ฉันต้องตรวจสอบเพื่อดูว่าคุณได้ตอบบ่อยกว่านี้ก่อนที่จะเริ่มหรือไม่
Magic Octopus Urn

@carusocomputing: คุณยังสามารถคิดเคล็ดลับที่ดีกว่าที่ฉันเคยใช้;)
Emigna

7

JavaScript (ES6), 59 53 ไบต์

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

บันทึกแล้ว 7 ไบต์ขอบคุณ 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 (... ) สามารถแทนที่ด้วย [... ] เพื่อการประหยัด 7 ไบต์
fəˈnɛtɪk

x.charAt (... ) เทียบเท่ากับ x [... ]
fəˈnɛtɪk

@ fəˈnɛtɪk ใช่ฉันคิดว่าฉันลองมาก่อน แต่มันก็มีข้อผิดพลาด ขอบคุณ!
ทอม

1
o-m-1o+~mสามารถถูกแทนที่ด้วย
Neil

2
เนื่องจาก f ถูกเรียกซ้ำแบบซ้ำการนับจำนวนตัวอักษรของโปรแกรมจะต้องรวมf=ส่วนไว้ด้วยดังนั้นจึงเป็น 54 ไบต์ไม่ใช่ 52
user5090812

5

เรติน่า 37 ไบต์

จำนวนไบต์ถือว่าการเข้ารหัส ISO 8859-1

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

ลองออนไลน์!

คำอธิบาย

\d
$*«»

แทนที่แต่ละหลักdกับd « s »ตามด้วยหนึ่ง เราต้องการหลัง) เพื่อให้สามารถจดจำตำแหน่งโดยที่d = 0และ b) เป็นตัวคั่นระหว่างตัวเลขที่อยู่ติดกัน

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

ซ้ำ ( +) จับคู่ regex ในบรรทัดแรกจากขวาไปซ้าย ( r) จากนั้นแทนที่การจับคู่ซ้ายสุด ( 1) ด้วยการทดแทนในบรรทัดที่สอง

Regex นั้นตรงกับหนึ่งในตัวเลขหลักของเราในขณะนี้และนับจำนวน«s ในกลุ่ม 2 จากนั้น lookbehind จะจับคู่อักขระd(?<-2>.)*ก่อนที่จะจับตัวละครที่อ้างถึงในกลุ่ม 1 สตริงของ«s และ»ถูกแทนที่ด้วยอักขระที่ถูกจับ .


5

MATL , 21 19 17 16 ไบต์

"@t4Y2m?UQ$y]]&h

ลองที่MATL Online!

คำอธิบาย

        % 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

ใช้งานได้ดี$yในเวอร์ชั่นใหม่!
Luis Mendo

@ LuisMendo ขอบคุณ! ใช่ภาษาที่ใช้สแต็กเหมาะสำหรับความท้าทายนี้
Suever

@LuisMendo น่าเสียดายที่สิ่งนี้อาจถูกทำให้สั้นลงไปอีกหากUทำงานกับตัวเลขเท่านั้น น่าเสียดายที่'e'Uผลตอบแทนเป็นexp(1)อย่างอื่นฉันสามารถกำจัด4Y2สิ่งต่าง ๆ ได้
Suever

อีกประการหนึ่งของผู้ที่คู่สิ่งที่ ...
หลุยส์ Mendo

4

JavaScript (ES6), 51 ไบต์

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 ใช้เพื่อจัดเก็บตัวเลขแทนที่เพื่อจัดการกับตัวเลขที่อ้างอิงถึงตัวเลขอื่น ๆ


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

3

Perl 5 , 34 ไบต์

33 ไบต์ของรหัส + -pธง

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

ลองออนไลน์!

s/\d/.../eแทนที่ตัวเลขแรกด้วยการ...ประเมินว่าเป็นรหัส Perl (ด้วย...การsubstr$_,-$&-1+pos,1อยู่ในกรณีนั้นsubstr$_,-$&-1+pos,1ส่งคืนซับสตริงของ$_ความยาว1ที่ดัชนี-$&-1+posโดยที่$&ตัวเลขเพิ่งจับคู่และposเป็นดัชนีของการเริ่มต้นของการแข่งขันเราเพียงแค่ต้องการredoถ้าการแทนที่ประสบความสำเร็จเพื่อแทนที่ทุกหลัก (และผลลัพธ์จะถูกพิมพ์โดยปริยายต้องขอบคุณ-pแฟล็ก)


วิธีเก่า 47 ไบต์:

44 รหัสไบต์ + -Fธง

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

ลองออนไลน์!

ค่อนข้างตรงไปตรงมาจริง ธงแยกปัจจัยการผลิตเกี่ยวกับตัวละครแต่ละตัวเข้าไป-F วนซ้ำผ่าน(เช่นอักขระทุกตัวของอินพุต) ถ้าตัวละครถ้าหลัก ( ) แล้วเราแทนที่ด้วยอักขระที่ดัชนี นี่คือตัวแปรดัชนีปัจจุบัน (ที่เรารักษาไว้โดยการเพิ่มที่แต่ละอักขระที่เห็น)@Fmap{...}@F@F/\d/$i-$_-1$i


3

JavaScript ES6, 61 59 ไบต์

ขอบคุณ @Luke สำหรับการเล่นกอล์ฟ 8 ไบต์

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

ลองออนไลน์!


x.split``ยังอาจเป็น[...x], [0-9]อาจจะ\dร่วมกันประหยัด 6B
ลุค

ขณะนี้มีข้อผิดพลาดอยู่ที่ไหน
ซัก

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

ล้มเหลวในการเว้นวรรค + "" ให้ 0 ซึ่งทำให้ตัวละครตัวก่อนหน้าคว้าได้
fəˈnɛtɪk

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


2

CJam, 13 ไบต์

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

การสาธิตออนไลน์

วิธีการแก้ปัญหานี้ใช้ตัวดำเนินการ "คัดลอกรายการที่nในลำดับที่" ของ CJam $เพื่อใช้การถอดรหัส มันเริ่มต้นด้วยการอ่านอินพุต (ด้วยq) จากนั้นวนตัวอักขระจากสตริงอินพุตและทิ้งลงในสแต็ก (ด้วย{}/) อย่างไรก็ตามภายในร่างกายของวงก็ยังซ้ำตัวละครแต่ละตัวหลังจากที่มันได้รับการใส่สแต็ค (กับ_) และการตรวจสอบว่าเป็นหลักโดยการมองหาตำแหน่งที่มี#ในสตริงตัวแทนสะดวก"0123456789"A,s

ผลลัพธ์ของการค้นหานี้คือค่าตัวเลขของหลักหรือหากอักขระไม่ใช่ตัวเลข -1 )ผู้ประกอบการแล้วเพิ่มค่าที่หนึ่งและ$แทนที่มันด้วยตัวละครในปัจจุบันที่หลายตำแหน่งด้านล่างด้านบนของสแต็ค ในที่สุด\;เพียงแค่ลบสำเนาของอักขระอินพุตปัจจุบันที่เราสร้างด้วย_จากสแต็กเนื่องจากไม่ต้องการอีกต่อไป


2

Befunge-98 , 45 43 bytes

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

ลองออนไลน์!

ความคิด:

  1. สำหรับอักขระแต่ละตัวในสตริงอินพุต
    1. เขียนไปที่บรรทัด 2
    2. หากไม่ใช่ตัวเลขให้เอาท์พุทออกมา
    3. มิฉะนั้นค้นหาค่าที่ถูกต้องเขียนมันใหม่จากนั้นส่งออก
::::            ; 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 ;

ฉันไม่สามารถทำให้เวอร์ชันนี้สั้นลง แต่อันนี้มีขนาด 44 ไบต์:

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

คิดว่าฉันจะแบ่งปันเพราะเคล็ดลับเรียบร้อยด้วยs- แต่การจัดเก็บตัวนับบนสแต็กจะนำไปสู่การปรับปรุง 1 ถ่าน



2

Python 2, 75 71 ไบต์

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

ลองออนไลน์!

แก้ไข:แก้ไขสำหรับค่า ascii ระหว่าง 32-47 ; แก้ไขสำหรับการถอดรหัสสองครั้ง (เช่น "alp2c1" ถึง "alpaca")


1
@Arnauld Nope ขออภัยฉันไม่ได้อ่านสเป็คอย่างใกล้ชิดพอ จะแก้ไขในไม่ช้า
คณิตศาสตร์ junkie

ดูเหมือนว่ามีข้อผิดพลาด สำหรับ'Prog2am0in6 Puz0les7&1Cod74G4lf'โปรแกรมของคุณพิมพ์Programming Puzzles &7Code1Golf! ฉันลองด้วยลิงก์ TIO ทั้งสองที่แบ่งปัน!
กีรนาปราการะรัน

@KeerthanaPrabhakaran ขอบคุณ! แก้ไขที่ราคา 0 ไบต์! (โซลูชันสำรองของฉันไม่ได้ทำการตัด)
คณิตศาสตร์ junkie

นั่นเป็นวิธีที่ยอดเยี่ยม!
กีรนาปราการะรัน

คุณช่วยอธิบาย '/' <i <':' ฉันรู้ว่ามันคือการทดสอบว่ามันเป็นตัวเลข แต่มันทำงานอย่างไร
Matias K

2

PHP 7.1 67 59 ไบต์

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

รับอินพุตจาก STDIN; ใช้เป็นท่อที่มี-nRหรือลองออนไลน์

  • _&$c=$s[$i++]วนรอบสตริง ( _&$cจะส่งผลให้บางสิ่งบางอย่างไม่เป็น"0"เช่นนั้นดังนั้นอักขระเดียวที่สามารถแยกลูปได้คือสตริงว่าง = จุดสิ้นสุดของอินพุต)
  • $c^"0" สลับบิต 5 และ 6 ในรหัส ascii
  • <"\n" ตรวจสอบว่าผลลัพธ์คือ <chr (10)
  • ถ้าเป็นเช่นนั้นจะเป็นตัวเลข: พิมพ์อักขระก่อนหน้าโดยดัชนี (และคัดลอกไปยังดัชนีปัจจุบัน)
  • อื่นพิมพ์ตัวละครนี้

ขอบคุณ @Christoph สำหรับการประหยัด 12%


1
ฉันรู้ว่านี่เป็นคำตอบเก่า แต่: ออฟเซ็ตสตริงเชิงลบ! (และนั่น$s=$argn... ?)for(;_&$c=$argn[$i++];)$t.=($c^"0")<"\n"?$t[~+$c]:$c;echo$t;
Christoph

2

Vim macro / keystrokes ขนาด 49 ไบต์

^M แสดงถึงอักขระที่ส่งคืน (0x0A, 1 ไบต์)

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

คำอธิบาย

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 ไบต์

-2 ไบต์ขอบคุณ @FrownyFrog

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

ลองออนไลน์!

การใช้งาน ⎕io←1

( ด้านล่างหมายถึงค่ากลางในการประเมินผล)

⎕d เป็นสตริง '0123456789'

⎕d⍳⍵พบว่า (1-based ในกรณีนี้) ดัชนีของตัวอักษรใน⎕d; สำหรับดัชนีที่ไม่ใช่ตัวเลขนั้นคือ 11

11|⍵ is modulo - 11s กลายเป็น 0

≢⍵ คือความยาวของ

⍳≢⍵เป็น1 2 ...จน≢⍵

ดังนั้น(⍳≢⍵)-11|⎕d⍳⍵ให้เวกเตอร์iของดัชนีที่เราควรมองหาเพื่อให้ได้ตัวอักษรที่ได้ อย่างไรก็ตามดัชนีเหล่านี้บางรายการอาจเปลี่ยนเส้นทางไปยังดัชนีอื่น ๆ (เล็กกว่า) การคำนวณปิดสกรรมกริยา (เช่นดัชนีที่มีประสิทธิภาพ) เราเวกเตอร์ดัชนีลงไปในตัวของมันเอง ( ⊂⌷⊢เทียบเท่ารถไฟไป(⊂i)⌷iหรือi[i]) และย้ำว่าจนกว่าจะมีการรักษา ( ⍣≡เรียกได้ว่าเป็นจุดคงดำเนินการ)

ในที่สุดเราก็จัดทำดัชนีเป็นสตริงดั้งเดิม: (...)⊃¨⊂


มันจะมีลักษณะเป็นรถไฟได้อย่างไร
FrownyFrog

@ FronyFrog แน่นอนสั้นกว่า
ngn


1

Japt , 24 ไบต์

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

ลองออนไลน์!

คำอธิบาย:

£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

JavaScript ES6, 54 ไบต์

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
ยินดีต้อนรับสู่ PPCG! หากคุณไม่ได้ต้องมีชื่อฟังก์ชั่นสำหรับการโทร recursive f=ฟังก์ชั่นที่ไม่มีชื่อที่ถูกต้องเพื่อให้คุณสามารถบันทึกไบต์ที่สองใน
Martin Ender

1

> <> (ปลา), 108 ไบต์ (= 9 x 12 ตาราง)

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

ลองที่นี่เพื่อดูปลาว่ายน้ำรอบ ๆ

  • ผนวก -1 กับอินพุตสแต็กจากนั้นสลับสแต็กกลับ
  • วนซ้ำ: ถ้าค่าสูงสุดคือ -1 ก็จะสิ้นสุด (เราวนเวียนทุกอักขระ) มิฉะนั้น:
  • ใส่ตัวอักษรบนลงทะเบียน; ตรวจสอบเพื่อดูว่าอยู่ในช่วง "0" ถึง "9" ถ้าเป็นเช่นนั้น:
    • หมุนสแต็กตามจำนวนที่เหมาะสม
    • รับตัวละครที่ถูกชี้ไปที่
    • หมุนกลับและแทนที่หมายเลขด้วยอักขระจากการลงทะเบียน
  • เอาท์พุท; วนรอบการทำงานต่อ

1

รหัสเครื่อง 8086, 35 ไบต์

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 ไบต์

r\d@=hYUgY-°X¹gY

ลองมัน


คำอธิบาย

                     :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 ไบต์

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

ลองออนไลน์

                  ,.  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

ให้เครดิตกับ ngn สำหรับแรงบันดาลใจ

22 ไบต์

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

นี่คือพอร์ตของคำตอบของเยลลี่

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

ในโซลูชันทั้งสองเวอร์ชันที่ TIO ใช้การตีความเดียว.เป็นหมายเลข 0 ดังนั้นการทดสอบครั้งสุดท้ายจึงล้มเหลว รุ่นที่เก่ากว่า (≤7) ดูเหมือนจะทำงานอย่างถูกต้อง

ลองออนไลน์!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.