ภาษา RLE Brainfuck


14

RLE Brainfuck

(เกี่ยวข้องกับBF-RLE )

สมมติฐาน RLE ( Run-Length Encoding ) ของ Brainfuck ยอมรับสัญลักษณ์สำหรับ 8 คำสั่งและยอมรับตัวเลข ตัวเลขถูกใช้เพื่อแสดงจำนวนการทำซ้ำที่ต่อเนื่องของคำสั่งดังนั้นการอนุญาตให้เข้ารหัสแบบ run-length ของซอร์สโค้ด

8>>>>>>>>>จะมีค่าเท่ากับ

ความยาวอยู่ที่ด้านซ้ายของคำสั่งเสมอ

งานของคุณคือการเขียนโปรแกรม / ฟังก์ชั่นที่สั้นที่สุดซึ่งแปลสตริงอินพุต (RLE Brainfuck ส่วน) เป็นโปรแกรม Brainfuck ปกติ

ตัวอย่างเช่น:

การป้อนข้อมูล:

10+[>+>3+>7+>10+4<-]3>2+.>+.7+2.3+.2<2+.>15+.>.3+.6-.8-.2<+.<.

Ouptut:

++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>++.>+.+++++++..+++.<<++.>+++++++++++++++.>.+++.------.--------.<<+.<.

รหัสที่สั้นที่สุดในจำนวนไบต์ในแต่ละภาษาจะเป็นผู้ชนะ


10
สวัสดีฉันลงคะแนนคำถามนี้เพราะฉันรู้สึกว่ามันจะถูกครอบงำโดยหนึ่งหรือสองขั้นตอนวิธี regex ตาม RLE ที่เพิ่งคัดลอกไปยังการจัดรูปแบบ regex แต่ละภาษาของแต่ละภาษา มีห้องเล็ก ๆ สำหรับเล่นกอล์ฟอะไรที่นี่
AdmBorkBork

13
ลักษณะนี้จำนวนมากเช่นทั่วไปถอดรหัสความท้าทายระยะยาว ความแตกต่างตรงนี้คือรองรับตัวเลขหลายหลัก ฉันคิดว่ามันยังคงเป็นล่อลวง แต่ฉันจะไม่ทุบมัน
xnor

4
@xnor ความแตกต่างอื่น ๆ คือตัวเลขไม่ได้อยู่เสมอ - รูปแบบของ RLE นี้รับประกันโครงสร้างที่น้อยกว่าและ IMO สามารถนำไปสู่เทคนิคที่น่าสนใจ (เปรียบเทียบคำตอบของ Python ที่นี่กับความท้าทายที่เชื่อมโยง!)
Lynn

1
@ ลินน์ฉันไม่ได้อธิบายอย่างชัดเจน แต่อย่างที่เห็นในตัวอย่าง 1 คือ ommited; การเพิ่ม 0 ไม่ทำให้สตริงสั้นลงดังนั้นคำตอบคือไม่เลขศูนย์ไม่สามารถเติมคำสั่งล่วงหน้าได้
Galen Ivanov

6
ฉันคิดว่าอีกทิศทางหนึ่งน่าสนใจกว่า (เช่นเปลี่ยนโปรแกรม brainfuck ในโปรแกรม RLE brainfuck ที่สั้นที่สุดที่เทียบเท่ากัน)
Paŭlo Ebermann

คำตอบ:


24

Python 2 , 62 61 ไบต์

lambda s:eval(re.sub('(\d*)(.)',r'+1*\1*1*"\2"',s))
import re

ลองออนไลน์!

การทดแทน regex ขยาย3<2+-เข้าไปในสตริง:

+1*3*1*"<"+1*2*1*"+"+1**1*"-"

ซึ่งก็คือevalเอ็ด (สังเกตว่าเมื่อไหร่ที่\1ว่างเราจะได้รับ1**1 = 1) อันแรก+คือโอเปอเรเตอร์ unary ซึ่งผูกกับหมายเลขแรกและอีกอัน+คือการต่อสตริง สิ่งนี้เต้นได้ชัดเจนยิ่งขึ้น

lambda s:re.sub('(\d+)(.)',lambda m:int(m.group(1))*m.group(2),s)
import re

14 ไบต์ ปกติแล้ว"\2"จะไม่ได้ผลเสมอไป แต่ต้องขอบคุณ\และ"ไม่ใช่คำสั่ง brainfuck


xnorบันทึกไบต์โดยส่ง1*\1*1เคล็ดลับ ก่อนหน้านี้ฉันมี\1Lใน regex และกำหนดL=1เป็นอาร์กิวเมนต์แลมบ์ดาซึ่งค่อนข้างเจ๋ง: 3Lเป็นตัวอักษร int ที่ยาวและLเป็นตัวแปร


1
นั่นเป็นวิธีที่ลื่นไหลในLการจัดการกับสตริงว่าง มีวิธีที่สั้นกว่านี้, r'+1*\1*1*"\2"'.
xnor

3
... ทำไมimport reแลมบ์ดาต่ำกว่า
คดีกองทุนของโมนิกา

1
การใส่แลมบ์ดาก่อนหมายความว่าฉันสามารถใช้คุณลักษณะ Header / Footer ของ tio.run เพื่ออวดว่าจะเรียกใช้โค้ดได้อย่างไร (ฉันใส่f=\ Header - ตอนนี้แลมบ์ดามีชื่อ!)
Lynn

18

Pyth , 2 ไบต์

r9

ลองที่นี่!

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

r9 - โปรแกรมทั้งหมดที่ได้รับ String จาก STDIN

r - ชุดการดำเนินการของสตริงแบบขยายของ Pyth
 9 - คำสั่งที่เก้าของชุดนั้น (ถอดรหัสความยาวรัน) รองรับตัวเลขหลายหลัก

31
การเตือนที่จำเป็น: หยุดการแก้ปัญหาเรื่องไม่สำคัญ (เช่นนี้)
Mr. Xcoder

4
มันไม่สำคัญเลยที่จะรู้เกี่ยวกับคำสั่งนั้นและจะรู้ว่ามันทำงานได้เมื่อตัวเลขหายไป
Luis Mendo

1
@ Mr.Xcoder เดี๋ยวก่อนอะไรนะ? จุดรวมของการเล่นกอล์ฟนั้นมีจำนวนไบต์น้อยที่สุดไม่ใช่หรือ?
ผู้ดูแลวัดประจำ

4
@Deacon ใช่ แต่คำตอบของ Python ที่เล่นกอล์ฟมักจะยากกว่ามากในการสร้างและน่าสนใจกว่าคำตอบของ 2-byte golflang
สตีเฟ่น

8
@Deacon การถอนไม่ได้เป็นเพียงแค่โซลูชันระยะสั้นเท่านั้น โดยทั่วไปผู้ใช้จะได้รับการสนับสนุนให้แก้ปัญหา upvote ที่น่าสนใจและสร้างสรรค์แทนที่จะเป็นคำตอบสั้น ๆ ในภาษากอล์ฟ
LyricLy

17

Lua, 65 64 63 ไบต์

เยี่ยมมาก! หลัวเต้นหลามทันที!

แก้ไข: บันทึกหนึ่งไบต์ด้วย @Jarhmander ต้องขอบคุณเขาสำหรับเคล็ดลับที่มีประโยชน์ในการบังคับผลลัพธ์เดียว

print(((...):gsub("(%d+)(.)",function(a,b)return b:rep(a)end)))

ลองออนไลน์!

คำอธิบาย

print)((...):gsub(             -- iterate over the argument and replace the strings
            "(%d+)(.)",       -- matching this pattern (at least one digit and a non-digit)
            function(a,b)     -- capture the digit and non-digit parts in separate variables
              return b:rep(a) -- repeat the non-digit a times, a being the digit part
            end)))                    


@ ลินน์หนึ่งไบต์ลงอีก 3 ไป!
Katenkyo

คุณสามารถบันทึกไบต์โดยการลบ,""และล้อมรอบใน parens อาร์กิวเมนต์การพิมพ์ทั้งหมด นิพจน์ที่อยู่ใน parens ถูกปรับเป็นหนึ่งค่าใน Lua (ดูlua.org/manual/5.3/manual.html#3.4 )
Jarhmander



8

เป็นกลุ่ม, 29 25 23 22 16 ไบต์

:s/\D/a&<C-v><ESC>/g
D@"

<C-V> คือ 0x16 <ESC>คือ 0x1b

มันทำงานได้โดยการแทนที่แต่ละที่ไม่ใช่ตัวเลขด้วยคำสั่งที่ผนวกอักขระนั้นไปยังบัฟเฟอร์ จำนวนจะถูกทิ้งไว้ตามลำพังและแก้ไขคำสั่งเหล่านั้น ณ จุดนี้บัฟเฟอร์เป็นโปรแกรม vimscript ที่สร้างโปรแกรม Brainfuck ที่ต้องการดังนั้นเราจึงดึงมันลงทะเบียนและเรียกใช้

ลองออนไลน์!

แก้ไข: การลดขนาดด้วยคำแนะนำ: H.PWiz: 5, TheFamilyFroot: 5, DJMcMayhem: 1


TheFamilyFrootมีเคล็ดลับการเล่นกอล์ฟที่ดี: คุณไม่จำเป็นต้องใช้กลุ่มจับภาพคุณสามารถใช้กลุ่ม 0 (&หรือ\0) แทนโดยไม่มีวงเล็บ นอกจากนี้ยังมีเคล็ดลับจากฉันไม่ TheFamilyFrootคือการที่คุณสามารถใช้Dแทนddสำหรับ-1ไบต์
James

1
ขอบคุณสำหรับคำแนะนำทั้งหมด H.PWiz, TheFamilyFroot และ DJMcMayhem ที่นำมาไว้ด้านล่างโซลูชัน 18 ไบต์ Perl และเป็นที่สอง ตอนนี้เราแค่ต้องการค้นหาอีก 15 ไบต์ที่เราสามารถกำจัดได้และมันจะเอาชนะ Pyth builtin :-)
เรย์

8

RLE Brainfuck, 204 ไบต์

-3>,[[->+>+<<]>>47-3<10+<->[-<+4>->+<[>-]>[3<+<[-]4>->]5<]3>57+[-]+<<[>>-<<[3>+3<-]]3>[3<+3>-]<[>>+7<+[->11-<+[-<+]->>+[-<[->10+<]>>+]<[-4>.4<]4>[-]-3<-<+7>-7<[8>+8<-]]8>[8<+8>-]<[3<.3<[-]-6>-]7<--5>-]<,]

ตามที่ฉันเข้าใจรายละเอียดสำหรับสภาพแวดล้อม brainfuck ไม่ได้กำหนดไว้อย่างดี โปรแกรมนี้อนุมานว่าเซลล์ในเทปอนุญาตให้มีจำนวนเต็มบวกและลบจำนวนมากโดยไม่มีการล้น รหัสนี้จะถ่ายทอดความคิดเห็นที่ไม่ใช่คำสั่งเช่นกัน แต่จะขยายการเข้ารหัสความคิดเห็นในระยะยาว (เช่น "เห็น 3b" → "ดู bbb") โปรแกรมผลลัพธ์ควรรันเหมือนกันดังนั้นฉันจึงไม่กังวลเกินไป

ฉันค่อนข้างมั่นใจว่าฉันยังคงสามารถเล่นกอล์ฟได้สองสามไบต์ แต่ฉันเหนื่อยจากการทำงานกับมัน

นี่คือล่ามที่กำหนดเอง + การทดสอบที่ฉันใช้ในการทดสอบ หากคุณผ่านการป้อนข้อมูลลงในกล่องอินพุตมาตรฐานควรทำงานกับอินพุตนั้นแทนที่จะทำการทดสอบ

แผ่นงานที่ไม่สกปรกของฉัน:

->>>,
[
  [->+>+<<]>>  clone 2 into 3 and 4
  if read char is between zero and nine
  (num buffer | max | is_digit | original char | read | temp0 | temp1)
                                                   ^
  47-
  <<<10+  set max
  <->  handle gross 0 case
  [  while max
    -  max minus one
    <+  buffer plus one
    >>>>-  read minus one
    IF STATEMENT : if read is 0
    >+<
    [>-]>[<
      <<+  is_digit = 1
      <[-]>>>  max = 0
    >->]<<  back to read
    <<<     back to max
  ]

  >>>57+[-]  reset `read` (need to add first to avoid infinite negative)

  +<<  check is_digit flag
  ( end marker | 0 | is_digit | original char | temp0 | temp1 | temp2 | temp3)
  x[  IF READ WAS DIGIT
    CODE 1a
    >>temp0 -<<x
    [>>>temp1 +<<<x-]
  ]
  >>>temp1 [<<<x+>>>temp1 -]
  <temp0 [
    START CODE 2a
    >>temp2 +
    7<y+[  IF THERE IS A NUMBER PREFIX
      -
      START CODE 1b
      >11-  end marker is negativeone
      <   on smallest digit
      +[-<+]->  find largest digit
      >+[  sum digits until we hit the end marker negativeone
        -
        <[->10+<]>  h1 = ten * h0; h0 = 0
        >
        +
      ]  leave the negativeone at zero though
      num | 0 | 0 | 0 | original char
            ^
      <num
      [->>>>.<<<<]  print `original char` `num` times
      >>>>[-]-  set `char` to negativeone
      <<<- last ditch guess
      END CODE 1b
      <y+
      7>temp2 -
      7<y[8>temp3 +8<y-]
    ]
    8>temp3 [8<y+8>temp3 -]
    <temp2 [
      CODE 2b
      <<<.  print original char
      <<<[-]-  set num buffer to new left edge
      >>>>>>temp2 -
    ]
    7<y--

    END CODE 2a
    5>temp0 -
  ]
  <
  ,
]

ไม่ขั้นต้น 0 กรณีที่อ้างถึงเฉพาะที่เกิดขึ้นจริงเป็นศูนย์นับหรือไม่ก็ยังเกิดขึ้นเมื่อแยกเช่น10+? OP ชี้แจงในความคิดเห็นที่นับจะมากกว่า 0 เสมอดังนั้นคุณอาจจะสามารถที่จะโกนบางไบต์ถ้ามันเป็นอดีต
เรย์

Gross 0 case สำหรับการวิเคราะห์ 0 ใด ๆ เนื่องจากการwhile maxวนซ้ำจะทำงานอย่างน้อยหนึ่งครั้งและฉันไม่ใส่บัฟเฟอร์ในตำแหน่งที่ฉันเก็บค่าของตัวเลขในลูปนั้นฉันก็ต้องเริ่มบัฟเฟอร์ที่ -1 ฉันสงสัยว่าฉันสามารถบันทึกจำนวนไบต์ได้หรือไม่โดยปล่อยบัฟเฟอร์นั้นอย่างมีเหตุมีผลvalue+1แม้ว่า🤔
Orez


5

TeX, 124 ไบต์

\newcount\n\def\b{\afterassignment\r\n0}\def\r#1{\ifx;#1\else\p#1\expandafter\b\fi
}\def\p#1{#1\ifnum\n>1\advance\n-1\p#1\fi}

(เขียนเป็นสองบรรทัดเพื่อให้มองเห็นได้ แต่สามารถเขียนโค้ดในหนึ่งบรรทัด)

สิ่งนี้กำหนดแมโคร\bที่รับอินพุตในฟอร์ม\b<input>;และพิมพ์เอาต์พุตที่ต้องการให้กับเอกสาร



4

Pyon , 66 ไบต์

print(re.sub("\d+.",lambda k:(int(k.group()[:-1])*k.group()[-1]),a

ลองออนไลน์!

Pyon นั้นค่อนข้างไพ ธ อน แต่มันสั้นกว่าเพราะreจะถูกนำเข้าโดยอัตโนมัติเมื่อคุณใช้และaถูกตั้งค่าเป็นอาร์กิวเมนต์หรืออินพุตโดยอัตโนมัติ

-4 ไบต์ขอบคุณ Mr. Xcoder


คุณควรเปลี่ยนg[0]เป็นg[:-1](ล้มเหลวสำหรับกรณีทดสอบหรือจำนวนที่สูงกว่า 9)
Mr. Xcoder

อย่างไรก็ตามทำไมคุณถึงต้องใช้ตัวlambdaที่เสียไบท์จริงๆ เล่นกอล์ฟและแก้ไขเป็น66 ไบต์
Mr. Xcoder

@ Mr.Xcoder อ่าไม่แน่ใจว่าฉันคิดอะไรอยู่ ... ขอบคุณ
HyperNeutrino

@ Mr.Xcoder โอ้ใช่ฉันพยายามที่จะเล่นกอล์ฟสิ่งต่าง ๆ มากมายที่จบลงด้วยการเป็นคนเลว xD
HyperNeutrino



3

R , 121 106 90 ไบต์

function(s,a=strsplit)cat(rep(el(a(gsub("\\d","",s),"")),pmax(el(a(s,"\\D")),"1")),sep="")

ลองออนไลน์!

บันทึก 15 ไบต์ด้วยการตระหนักว่าrep()จะบังคับให้เป็นตัวเลข บันทึกอีก 16 ด้วย Giuseppe ส่วนใหญ่มาจากการใช้pmaxเพื่อแทนที่สตริงว่างด้วย1

function(s) {
  x <- el(strsplit(s,"\\D")) # Split the string on anything that is not a digit...
  x <- pmax(x, "1")          # ... and replace any empty strings with 1. This gets us the numbers of repeats
  y <- gsub("\\d","",s)      # Remove all digits from the original string...
  y <- el(strsplit(y))       # ... and split into individual units. This gets us the symbols to repeat
  z <- rep(y, x)             # Implement the repeats. x is coerced to numeric
  cat(z, sep = "")           # Print without separators
}

ดีมาก! ผมเชื่อว่าifelse(x>"",x,1)เป็นไบต์สั้นและ\\Dเทียบเท่ากับ[^\\d] และดีที่สุดของทั้งหมดที่คุณไม่จำเป็นperl=Tดังนั้นนี้เป็นหวาน99 ไบต์ ฉันไม่คิดว่ามันจะน้อยกว่า 100 ไบต์!
Giuseppe


@Giuseppe การใช้งานที่pmaxยอดเยี่ยมเพื่อการปรับปรุงครั้งใหญ่ที่ยอดเยี่ยม - ขอบคุณ!
user2390246

แทนที่"1"ด้วย1ขณะที่pmaxจะบีบบังคับเพื่อcharacterสำหรับการเปรียบเทียบ
Giuseppe

85 ไบต์โดยการเปลี่ยนนามแฝง
จูเซปเป้

2

PowerShell , 66 62 ไบต์

-join("$args"-split'\b'|%{(,$(,$_[0]*$n+$_))[!!($n=$($_-1))]})

ลองออนไลน์!

ชำรุด

ช่างเป็นระเบียบ!

เริ่มจาก$argsซึ่งเป็นอาร์เรย์องค์ประกอบเดียวที่มีสตริง RLE ฉันบังคับให้เป็นสตริงจริงโดยการตัดคำพูด

จากนั้นแบ่งตามขอบเขตของคำ (เป็น\bregex) นั่นจะทำให้ฉันมีสตริงที่แต่ละองค์ประกอบเป็นจำนวนหรือโทเค็น BF ที่มาหลังจากจำนวน ดังนั้นในตัวอย่างที่ 4 องค์ประกอบแรกของอาร์เรย์แยกนี้10, +]>+>, 3,+> (ทั้งหมดเป็นสตริง)

ต่อไปฉันไปป์นั้นเข้าสู่ForEach-Object( %) เพื่อจัดการกับแต่ละองค์ประกอบองค์ประกอบ

ตรงกลางเป็นที่นิยมเล่นกอล์ฟ PowerShell ด้วยการบิด; โดยพื้นฐานแล้วมันเป็นตัวดำเนินการประกอบไปด้วย DIY ซึ่งคุณสร้างอาร์เรย์ 2 องค์ประกอบจากนั้นสร้างดัชนีโดยใช้นิพจน์บูลีนที่คุณต้องการทดสอบโดยที่ผลลัพธ์เท็จให้องค์ประกอบ 0 และผลลัพธ์จริงให้องค์ประกอบที่ 1

ในกรณีนี้ฉันสร้างอาร์เรย์องค์ประกอบเดียวด้วยตัวดำเนินการคอมม่า unary ,เพราะฉันไม่ต้องการผลลัพธ์ในกรณีจริง

ก่อนอื่นให้ดูที่ตัวทำดัชนีแม้ว่ามันจะถูกเรียกใช้ในภายหลัง

แนวคิดนี้คือ$_(องค์ประกอบปัจจุบัน) อาจเป็นหมายเลขที่ถูกต้องหรือสตริงอื่น ๆ หากเป็นตัวเลขฉันต้องการ$nเป็นค่าของจำนวนนั้นลบ 1 (เป็นตัวเลขไม่ใช่สตริง) ถ้าไม่ฉันต้องการ$nจะเท็จ -y

PowerShell มักจะพยายามบังคับค่าทางขวาให้กับประเภทของด้านซ้าย แต่ก็สามารถขึ้นอยู่กับการดำเนินการ นอกจากนี้"10"+5จะให้สตริงใหม่กับคุณ"105"ในขณะที่10+"5"จะให้จำนวนเต็ม (15 )

แต่สายไม่สามารถลบออกดังนั้นแทนที่จะ PowerShell สามารถอนุมานค่าตัวเลขโดยอัตโนมัติด้วยเชือกที่ด้านซ้ายของลบจึงจะช่วยให้"10"-55

ดังนั้นฉันจะเริ่มต้นด้วย$_-1ซึ่งจะให้ตัวเลขที่ฉันต้องการเมื่อ$_เป็นจำนวนจริง แต่เมื่อมันไม่ใช่ฉันจะไม่ได้อะไรเลย บนพื้นผิว "ไม่มีอะไร" เป็นเท็จ แต่ปัญหาคือว่าจะหยุดการทำงานของการมอบหมายนั้นดังนั้น$nจะรักษาค่าก่อนหน้านี้ ไม่ใช่สิ่งที่ฉันต้องการ!

ถ้าฉันห่อมันด้วย subexpression แล้วเมื่อมันล้มเหลวฉันก็จะได้ค่าที่$($_-1)ไม่แน่นอน:

สิ่งที่ได้รับมอบหมาย$nและเนื่องจากการกำหนดนั้นถูกห่อด้วยวงเล็บเองค่าที่ได้รับมอบหมายจะ$nถูกส่งผ่านไปยังไปป์ไลน์ด้วย

เนื่องจากฉันใช้มันในตัวสร้างดัชนีและฉันต้องการ1ถ้าการแปลงสำเร็จฉันจึงใช้สองบูลีน - notนิพจน์!!เพื่อแปลงค่านี้เป็นบูลีน การแปลงตัวเลขที่ประสบความสำเร็จกลายเป็นจริงในขณะที่ความว่างเปล่าไร้สาระทำให้เราหวานหวาน0ที่อนุญาตให้ส่งคืนองค์ประกอบเดียวในอาร์เรย์ประกอบไปด้วยของปลอม

กลับไปที่อาร์เรย์นั้นองค์ประกอบคือ: $("$($_[0])"*$n*$_) $(,$_[0]*$n+$_)

"$($_[0])"- นี่เป็นวิธีที่น่ารำคาญที่จะได้รับตัวอักษรตัวแรกขององค์ประกอบปัจจุบัน (สมมติว่ารับ+มาจาก+[>+) แต่เป็นสตริงและไม่ใช่[char]วัตถุ ฉันต้องการให้เป็นสตริงเพราะฉันสามารถคูณสตริงด้วยตัวเลขเพื่อทำซ้ำ แต่ฉันไม่สามารถทำได้ด้วยอักขระ

จริงๆแล้วฉันจัดการเพื่อบันทึกตัวละคร 4 ตัวโดยใช้[char]อาเรย์แทนสตริง (โดยใช้คอมม่า unary อื่น,) ดังนั้นฉันสามารถลบเครื่องหมายคำพูดและนิพจน์ย่อยพิเศษได้ ฉันสามารถคูณอาร์เรย์เพื่อทำซ้ำองค์ประกอบ และเนื่องจากผลลัพธ์ทั้งหมดของการทำซ้ำนี้กลายเป็นอาร์เรย์ต่อไปและจำเป็นต้องมี-joinแก้ไขการใช้อาร์เรย์ที่นี่ไม่มีค่าใช้จ่ายเพิ่มเติม

แล้วฉันคูณว่าสตริงอาร์เรย์โดย$nจะซ้ำ$nครั้ง จำได้ว่า$nอาจจะเป็น$nullหรืออาจเป็นค่าของตัวเลขก่อนหน้าลบหนึ่ง

จากนั้น+$_เพิ่มองค์ประกอบปัจจุบันลงที่ส่วนท้ายของอักขระตัวแรกที่ซ้ำกันขององค์ประกอบนั้น นั่นคือสาเหตุที่$nเป็นลบ

วิธีนี้10+[>+ลงท้ายด้วย$n9 เท่ากับจากนั้นเราสร้าง 9 +และเพิ่มกลับเข้าไปใน+[>+สตริงเพื่อรับ 10 สิ่งที่ต้องการบวกองค์ประกอบอื่น ๆ พร้อมสำหรับการขี่

องค์ประกอบถูกห่อใน subexpression $()เพราะเมื่อ$nใด$nullนิพจน์ทั้งหมดจึงล้มเหลวดังนั้นการสร้างอาร์เรย์จึงล้มเหลวดังนั้นตัวสร้างดัชนีจะไม่ทำงานดังนั้น$nไม่ได้รับมอบหมาย

เหตุผลที่ฉันใช้เคล็ดลับแบบไตรภาคนี้เป็นเพราะหนึ่งในลักษณะเฉพาะของมัน: ซึ่งแตกต่างจากผู้ประกอบการไตรภาคที่แท้จริงการแสดงออกที่กำหนดองค์ประกอบที่ทำได้รับการประเมินว่าพวกเขาเป็น "เลือก" หรือไม่และเป็นอันดับแรกสำหรับเรื่องนั้น

เนื่องจากฉันจำเป็นต้องกำหนดและใช้$nในการทำซ้ำที่แยกต่างหากจึงมีประโยชน์ ค่าองค์ประกอบอาร์เรย์ที่ประกอบไปด้วยสามส่วนได้รับการประเมินด้วย$nค่าของการวนซ้ำก่อนหน้านี้จากนั้นตัวทำดัชนีจะกำหนดใหม่$nสำหรับการวนซ้ำปัจจุบัน

ดังนั้นForEach-Objectลูปจะแสดงผลลัพธ์ทุกอย่างที่ควรจะเป็น (กลุ่มของข้อผิดพลาดที่เราไม่สนใจ) แต่เป็นอาร์เรย์ของสตริงใหม่

เพื่อให้สิ่งทั้งหมดถูกห่อในวงเล็บแล้วนำหน้าด้วย unary -joinเพื่อให้สตริงออก


1
คำอธิบายที่ดีเพียงอย่างเดียวรับประกันการขึ้นโหวตแล้ว
เสา

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

2

QuadR , 17 ไบต์

\d+.
¯1((⍎↓)⍴↑)⍵M

ลองออนไลน์!

ขอบคุณAdámที่ให้รหัสรุ่นที่ถูกต้อง

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

\d+.           Regex to match any sequence of digits followed by a character.
¯1((⍎↓)⍴↑)⍵M   Transformation line
¯1(      )⍵M   Arguments: -1 and the matching expression
   ( ↓)        'Drop' the last item (-1) from the match (⍵M), yielding a string which is a sequence of digits.
              Execute. In this case, it transforms a string into a number.
              'Take' the last item (-1) from the match (⍵M), yielding a character.
              Reshape it. That will take the character resulting from the 'Take' operation and repeat it n times,
               where n is the result from the 'Drop' and 'Execute' operations.

เทียบเท่ากับฟังก์ชั่น APL'\d+.'⎕R{¯1((⍎↓)⍴↑)⍵.Match}
อดัม


1

Java 8, 148 ไบต์

s->{for(s=s.format(s.replaceAll("(\\d+)","%1\\$0$1d"),0);!s.matches("\\D+");s=s.replaceAll("0(\\D)","$1$1"));return s.replaceAll("((.)+)\\2","$1");}

Gdamn regexes Java บางครั้งก็ไม่มีประโยชน์ดังนั้น .. เวลาที่ผ่านมามันคือการขาดการใช้กลุ่มจับ"$1"อะไรตอนนี้นี้ .. ฉันต้องการแทนที่3cด้วยcccหรือ000cกับการcccเป็นหนึ่งซับ แต่โชคร้าย Java มีวิธีการทำเช่นนี้โดยไม่มี ห่วง อ่า

คำอธิบาย:

ลองที่นี่

s->{                          // Method with String as both parameter and return-type
  for(s=s.format(s.replaceAll("(\\d+)","%1\\$0$1d"),0);
                              //  Replace every numbers of that many zeroes
                              //  (i.e. "3>2+" -> "000>00+")
      !s.matches("\\D+");     //  Loop as long as the String contains zeroes
    s=s.replaceAll("0(\\D)",  //   Replace every 0 followed by a non-0 character,
                   "$1$1")    //   with two times this captured non-0 character
  );                          //  End of loop
  return s.replaceAll("((.)+)\\2","$1");
                              //  Reduce every repeated character amount by 1,
                              //  and return this as result
}                             // End of method

1
สวัสดีเควินที่ดีที่จะเห็นคุณที่นี่, การจัดการกับปริศนาอื่น ๆ กว่าคดเคี้ยว :)
เลน Ivanov

@ GalenIvanov โอ้โห! ฉันไม่รู้ว่าคุณใช้งานบน PPCG เช่นกัน
Kevin Cruijssen

ฉันไม่ได้จนกระทั่งเมื่อเร็ว ๆ นี้ :) ฉันเรียนรู้ J และตัดสินใจว่านี่เป็นโอกาสที่ดีในการทดสอบทักษะของฉัน
Galen Ivanov

1

Haskell , 84 ไบต์

f s@(x:r)|(n:m,x:r)<-span(`elem`['0'..'9'])s=(x<$[1..read$n:m])++f r|1<3=x:f r
f e=e

ลองออนไลน์!

คำอธิบาย:

span(`elem`['0'..'9'])sแยกสตริงที่กำหนดsเป็นส่วนนำหน้าของตัวเลขและส่วนที่เหลือ จับคู่ผลในรูปแบบ(n:m,x:r)เพื่อให้แน่ใจว่าคำนำหน้าหลักไม่เป็นที่ว่างเปล่าและผูกตัวละครหลังจากที่ตัวเลขไปและส่วนที่เหลือจะx อ่านสตริงของตัวเลขเป็นตัวเลขและทำซ้ำหลายครั้ง ผลที่ได้คือการตัดแบ่งการรักษา recursive ของสตริงที่เหลือrx<$[1..read$n:m]n:mxr


1

R , 151 ไบต์

outgolfed โดยผู้ใช้ 2390246 ! ตอนนี้โดยทั่วไปแล้วเป็นวิธีขยะเมื่อเทียบกับวิธีนั้น แต่ฉันจะปรับปรุงต่อ

function(s,G=substr)for(i in el(strsplit(gsub("(\\d+.)","!\\1!",s),"!")))cat("if"(is.na(g<-as.double(G(i,1,(n=nchar(i))-1))),i,rep(G(i,n,n),g)),sep='')

ลองออนไลน์!

ยังส่งสัญญาณเตือนจำนวนมาก

function(s){
s <- gsub("(\\d+.)","!\\1!",s)               # surround groups with !
X <- el(strsplit(s,"!"))                   # split to groups
for( i in X ){                             # iterate over groups
 n <- nchar(i)                             # length of group
 r <- substr(i,1,n-1)                      # potential number (first n-1 chars)
 d <- substr(i,n,n)                        # last character
 if( is.na(as.double(r)) ){                # if it's not a number
   cat(i)                                  # print out the whole string
  } else {
   cat(rep(d,as.double(r)),sep="")         # repeat d r times, and print with no separator
  }
 }
}

ถัดไปดูว่าการใช้ a grepมีประสิทธิภาพมากกว่าหรือไม่substr



1

JavaScript (ES6), 46 ไบต์

a=>a.replace(/(\d+)(.)/g,(_,n,b)=>b.repeat(n))

คำอธิบายที่ตรงไปตรงมาสวย:

a=>a.replace(/(\d+)(.)/g,                      // Match globally the following: a number N followed by a character
                         (_,n,b)=>b.repeat(n)) // Replace each occurrence by the matched character repeated N times


1

แลมบ์ดาที่ยังไม่พิมพ์ของ 452 ไบต์

(λp.λq.(λb.λg.(λi.(λp.λq.λb.p q b)(q(λq.λj.λl.j((λq.λj.qλq.λl.(λu.g i j(λp.u)(g j(λq.λg.q(b(p(λp.λq.p q))(p(λp.λq.p(p q)))q g))(λp.u)(λu.u qλq.λu.g j i q(b l(p(λp.λq.p(p(p(p q)))))q u))))λp.p(λp.λb.q p((λp.λq.l(λp.l)(λp.λq.p q)(λq.p j q)q)p b))λp.λp.p)l q))(λp.p)(λp.p(λp.λp.p)λp.λp.p)(λp.λq.p)))(b(p(λp.λp.p))(p(λp.λq.p(p q)))))(λp.λq.λb.p(q b))λp.λq.q(λp.λq.λb.p(λp.λb.b(p q))(λp.b)λp.p)p)λp.λq.λb.q(q(q(q(q(q(p q b))))))

input และ output ประกอบด้วยขวาพับรายชื่อของคริสตจักรที่เข้ารหัสรหัสอักขระเช่นรหัสอักขระของบรรทัดใหม่คือ 10 λf.λx.f(f(f(f(f(f(f(f(f(f x)))))))))ดังนั้นการเข้ารหัสคริสตจักรจะเป็น การแปลง "ABCD" เป็นรายการดูเหมือนλf.λx.f 65 (f 66 (f 67 (f 68 x)))แต่มีตัวเลขที่เข้ารหัสด้วยคริสตจักร

การใช้สตริงที่เข้ารหัสกับโปรแกรมและลดมันลงไปจนสุดควรให้สตริงเอาต์พุตที่เข้ารหัสโดยใช้ RLE


1
สวัสดีและยินดีต้อนรับสู่เว็บไซต์! ดูเหมือนว่าจะเป็นทางออกที่น่าสนใจ แต่เราคาดหวังว่าภาษาจะมีล่ามที่ถูกต้องคุณมีหนึ่งในแลมบ์ดา Untyped แลมบ์ดาหรือไม่
โพสต์ Rock Garf Hunter

นอกจากนี้qλqสัญกรณ์หมายความว่าอย่างไร ฉันไม่เคยเห็นแบบนั้นมาก่อน
Zacharý


1

C ++, 239 235 ไบต์

-4 ไบต์ขอบคุณZacharý

#include<regex>
using s=std::string;std::regex m("[0-9]*[<>+.,\\[\\]-]");s t(s r){s d,h;std::sregex_iterator i(r.begin(),r.end(),m),e;while(i!=e){h=(*i)[0];int g=std::strtol(h.data(),NULL,10);g+=!g;d+=s(g,h[h.size()-1]);++i;}return d;}

1
คุณเปลี่ยนg=(g?g:1)เป็นg+=!gเหรอ หากยังไม่ได้ผลคุณไม่สามารถลบวงเล็บออกได้g?g:1
Zacharý

0

Dart, 78 ไบต์ (ที่มี regex), 102 ไบต์ (ไม่มี regex)

ด้วย Regex:

(i)=>i.splitMapJoin(new RegExp(r"(\d+)(.)"),onMatch:(m)=>m[2]*int.parse(m[1]))

ไม่มี Regex:

(i,[n=0,d=0])=>i.codeUnits.map((c)=>i[d++]*((c-=48)>=0&&c<10?0*(n=n*10+c):n<1?1:(n=0*(c=n))+c)).join()

ทั้งสองจะต้องถูกเรียกเช่น (<code here>)("input string")ทั้งสองจะต้องถูกเรียกเช่น

Regex one นั้นค่อนข้างมาตรฐาน แต่อันที่น้อยกว่า regex นั้นค่อนข้างพิเศษ

Regex-less ใช้พารามิเตอร์ที่ไม่เหมาะสมเพื่อจัดสรรตัวแปรท้องถิ่นในฟังก์ชั่น "การส่งคืนเดี่ยว" มิฉะนั้นคุณจะต้องสร้างบล็อกและมีคำหลักส่งคืน สำหรับหน่วยรหัสแต่ละหน่วยหากหน่วยรหัสอยู่ระหว่าง 0 ถึง 9 จะมีการสะสมnและส่งคืนสตริงว่าง มิฉะนั้นตัวละครจะถูกคูณด้วยค่าของn(พิเศษดาดถ้า n == 0 ในกรณีที่ว่ามันมักจะปล่อย 1 ตัวอักษร) และnถูกกำหนดเป็น 0 (n=0*(c=n))+cชุดอาร์กิวเมนต์รหัสถ่านค่าของnคูณn/ c0 ร้านค้า 0 ถึงแล้วเพิ่มn cสิ่งนี้จะรีเซ็ตของเราnโดยไม่ต้องอยู่ในบริบทของคำสั่ง


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