พูดในสิ่งที่คุณเห็น


30

ลำดับ "ดูแล้วพูด" หรือ "พูดในสิ่งที่คุณเห็น" เป็นชุดของตัวเลขที่แต่ละตัวอธิบายล่าสุด

1
11 (one one)
21 (two ones)
1211 (one two, one one)
111221 (one one, one two, two ones)
312211 (three ones, two twos, one one)

และบนและบน ... https://oeis.org/A005150

อย่างไรก็ตามนี่เป็นความท้าทายของการเล่นกอล์ฟแบบปกติ (นับจำนวนไบต์น้อยที่สุด) ในการสร้างโปรแกรมที่รับสองอาร์กิวเมนต์หมายเลขเริ่มต้นและจำนวนการวนซ้ำ ตัวอย่างเช่นหากคุณเสียบ "1" และ "2" ผลลัพธ์จะเป็น "21" หากคุณเสียบ "2" และ "4" ผลลัพธ์จะเป็น "132112" มีความสุข!


2
เราสามารถรับ / ส่งคืนรายการตัวเลขได้หรือไม่?
LegionMammal978

5
ฉันจะปิดคำถามที่เก่ากว่าเป็นแบบคู่หากจำเป็น สิ่งนี้ไม่มีข้อ จำกัด
lirtosiast

4
ฉันไม่เห็นสิ่งนี้ซ้ำซ้อน ทั้งความท้าทายในการค้นหาและพูดก่อนหน้านั้นมีข้อ จำกัด อย่างมาก (อย่างใดอย่างหนึ่งที่ไม่มีตัวเลขในซอร์สโค้ดส่วนที่ไม่มีตัวแปรที่มีชื่อฟังก์ชันที่มีชื่อหรืออาร์กิวเมนต์ที่มีชื่อ) มีเพียงไม่กี่ภาษาที่จะให้คำตอบสำหรับความท้าทายที่ผ่านมาซึ่งแข่งขันกันที่นี่
trichoplax

3
เราได้รับอนุญาตให้ส่งออกเป็นรายการตัวเลขหรือไม่
lirtosiast

คำตอบ:


9

Pyth, 10 8 ไบต์

-2 ไบต์โดย @FryAmTheEggman

ussrG8Qz

คำอธิบาย:

            Implicit: z=first line as string, Q=second line
u         the result of reducing lambda G:
  s s rG8   flattened run-length-encoded G
  Q       Q times
  z     starting with z

ลองมันนี่


แต่อย่างน้อยฉันก็ไม่เอาขาออกและเครื่องหมายจุลภาค ช่องว่างระหว่างตัวเลข :-P
Luis Mendo

2
ในโซเวียตรัสเซียussrG8Qz
mbomb007

8

CJam, 8 ไบต์

q~{se`}*

รูปแบบการป้อนข้อมูลเป็นตัวเลขเริ่มต้นก่อนการทำซ้ำที่สองคั่นด้วยช่องว่างบางส่วน

ทดสอบที่นี่

คำอธิบาย

q~   e# Read and evaluate input, dumping both numbers on the stack.
{    e# Run this block once for each iteration...
  s  e#   Convert to string... in the first iteration this just stringifies the input
     e#   number again. In subsequent iterations it flattens and then stringifies the
     e#   array we get from the run-length encoding.
  e` e#   Run-length encode.
}*

อาเรย์จะถูกปรับให้เรียบก่อนที่จะพิมพ์ดังนั้นผลลัพธ์จึงเป็นจำนวนที่ต้องการ


6

JavaScript, 57 ไบต์

F=(a,b)=>b?F(a.replace(/(.)\1*/g,c=>c.length+c[0]),b-1):a

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


คุณสามารถบันทึกสามไบต์ด้วยแกงกะหรี่แปลก ๆ : b=>F=a=>b--?F(a.replace(/(.)\1*/g,c=>c.length+c[0])):aพบว่าในขณะที่เล่นกอล์ฟคำตอบของฉันก่อนที่ฉันจะรู้ว่ามันค่อนข้างเหมือนกับคุณ;)
ETHproductions

4

MATL , 9 ไบต์

:"Y'wvX:!

อินพุตคือ: จำนวนการวนซ้ำ, จำนวนเริ่มต้น

ลองออนไลน์!

:      % implicit input: number of iterations. Create vector with that size
"      % for loop
  Y'   %   RLE. Pushes two arrays: elements and numbers of repetitions.
       %   First time implicitly asks for input: initial number
  w    %   swap
  v    %   concatenate vertically
  X:   %   linearize to column array
  !    %   transpose to row array
       % implicitly end loop
       % implicitly display

หากคุณสามารถส่งออกเป็นอาร์เรย์แล้ว
Pyth

@ThomasKwa จุดดี ฉันคิดว่ามันเป็นไปได้
หลุยส์เมนโด

4

R, 87 ไบต์

function(a,n){for(i in 1:n){r=rle(el(strsplit(a,"")));a=paste0(r$l,r$v,collapse="")};a}

Ungolfed & อธิบาย

f=function(a,n){
    for(i in 1:n){                      # For 1...n
        r=rle(el(strsplit(a,"")))       # Run length encoding
        a=paste0(r$l,r$v,collapse="")   # concatenate length vector and values vector and collapse
    };
    a                                   # print final result
}

3

Perl 6, 63 ไบต์

say (@*ARGS[0],*.trans(/(.)$0*/=>{$/.chars~$0})…*)[@*ARGS[1]]

นี่เป็นระยะสั้นที่สุดเท่าที่ฉันจะหามาได้ตอนนี้อาจมีธงหากินที่สามารถลดได้ฉันไม่แน่ใจ


3

ทับทิม, 63 ไบต์

โปรแกรมเต็มรูปแบบเนื่องจากคำถามดูเหมือนจะถามว่า รับอินพุตเป็นอาร์กิวเมนต์บรรทัดคำสั่ง

i,n=$*
n.to_i.times{i=i.gsub(/(.)\1*/){"#{$&.size}#$1"}}
puts i

ไม่ไม่gsub!สามารถใช้งานได้เนื่องจาก$*มีการตรึงสตริงใน: /


คุณสามารถใช้การ-pตั้งค่าสถานะเพื่อบันทึกไบต์ หากคุณใช้มันgsubทำงานในสายของ STDIN $_.gsub!ราวกับว่ามันเป็น จากนั้นอาร์กิวเมนต์บรรทัดคำสั่งคือการวนซ้ำดังนั้นn,=$*และอินพุตอื่นจะถูกอ่านจาก STDIN
Value Ink

3

Retina , 46 45 27 ไบต์

มาร์ตินทำอะไรมากมายเพื่อช่วยกอล์ฟนี้

+`(\d)(\1?)*(?=.*_)_?
$#2$1

ลองออนไลน์

ใช้อินพุตในรูปแบบ:

<start><count>

<start> เป็นหมายเลขเริ่มต้น

<count> อยู่ในสภาวะเดียวกันขีดเส้นใต้ทั้งหมดและมีการดำเนินการซ้ำหลายครั้ง

การทำซ้ำครั้งเดียว20 16 ไบต์:

(\d)(\1?)*
$#2$1


2

JavaScript ES6, 71 ไบต์

(m,n)=>[...Array(n)].map(_=>m=m.replace(/(.)\1*/g,x=>x.length+x[0]))&&m

รับอินพุตเป็นสตริงและตัวเลข


('1',2)ให้ฉันเมื่อมันควรจะเป็น12 21ความยาวของคุณควรมาก่อนตัวละครในการแทนที่
Mwr247

@ Mwr247 อ๊ะขอโทษ
ETHproductions

2

Perl 5, 50 ไบต์

$_=pop;for$i(1..pop){s/(.)\1*/length($&).$1/ge}say

อาร์กิวเมนต์อยู่ในลำดับย้อนกลับ (จำนวนการวนซ้ำตามด้วย seed) ตัวอย่าง:

> perl -E'$_=pop;for$i(1..pop){s/(.)\1*/length($&).$1/ge}say' 4 2
132112
> perl -E'$_=pop;for$i(1..pop){s/(.)\1*/length($&).$1/ge}say' 0 2
2
> perl -E'$_=pop;for$i(1..pop){s/(.)\1*/length($&).$1/ge}say' 2 0
1110
> perl -E'$_=pop;for$i(1..pop){s/(.)\1*/length($&).$1/ge}say' 1 10
1110
> perl -E'$_=pop;for$i(1..pop){s/(.)\1*/length($&).$1/ge}say' 11 1
3113112221232112111312211312113211

ในฐานะที่เป็นรูทีนย่อยฉันสามารถโกนไบต์ด้วยการจบด้วย$_แทนที่จะsayคิดว่าฉัน แต่ฉันยังไม่ได้ทดสอบ ทางออกปัจจุบันคือโปรแกรม
msh210

2

05AB1E , 9 ไบต์ (ไม่แข่งขัน)

แก้ไขเนื่องจากความเห็นของ Emigna ดูด้านล่าง / การแก้ไข

F.¡vygyÙJ

ลองออนไลน์!


1
ฉันคิดว่าคุณพลาดส่วนหนึ่งเกี่ยวกับการโต้แย้ง 2 ครั้ง (จำนวนเริ่มต้นและจำนวนการวนซ้ำ) โชคดีที่คุณสามารถเพิ่มFที่จุดเริ่มต้นและใช้อาร์กิวเมนต์เป็นiterations,initialNo
Emigna

1
และไบต์หายไปโดยที่อาจจะกลับมาโดยการแทนที่ด้วยDgs gy
Emigna

@Emigna yในบริบทนั้นมีอะไรบ้าง
Magic Octopus Urn

1
เหมือนกับ y ตัวแรกกดค่าปัจจุบันในลูป ดังนั้นแทนที่จะทำซ้ำ y และสลับไปด้านบนคุณแค่กดอีกครั้งเมื่อคุณต้องการ
Emigna

@Emigna ดูเหมือนว่าฉันยังมีอะไรอีกมากให้เรียนรู้ฮ่าฮ่า
Magic Octopus Urn

2

R , 61 57 ไบต์

-4 ขอบคุณ @JayCe เพียงเมื่อฉันแน่ใจว่ามันไม่สามารถทำได้ง่ายกว่านี้อีกแล้ว!

f=function(a,n)`if`(n,f(t(sapply(rle(c(a)),c)),n-1),c(a))

ลองออนไลน์!


1
เล่นกอล์ฟเล็กน้อย: TIO
JayCe

การt(sapply(z,c))โทรนั้นฉลาด
J.Doe

1

Mathematica, 81 73 ไบต์

FromDigits@Nest[Flatten[(Tally/@Split@#)~Reverse~3]&,IntegerDigits@#,#2]&

ย่อหน้ารหัสของคุณที่มีสี่ช่องว่างที่จะได้รับมันแสดงขึ้นเป็นรหัส :)
Ogaday


1

Stax , 10 ไบต์

Çα▲ì4↔┌j█♀

เรียกใช้และแก้ไขข้อบกพร่องออนไลน์!

ใช้ไบต์มากเกินไปในรูปแบบ IO ที่เหมาะสม ...

คำอธิบาย

ใช้เวอร์ชันที่คลายการแพคเพื่ออธิบาย

DE|R{rm:f$e
D              Do `2nd parameter` times
 E             Convert number to digits
                   Starting from the `1st parmeter`
  |R           Convert to [element, count] pairs for each run
    {rm        Revert each pair
       :f      Flatten the array
         $     Convert array to string of digits
          e    Convert string of digits to integer

ส่วนที่สำคัญคือD|R{rm:f(8 ไบต์)

หากอินพุตแรกสามารถใช้เป็นอาร์เรย์ของตัวเลขโปรแกรมทั้งหมดสามารถเขียนเป็น 9 ไบต์: รันและดีบักออนไลน์!


0

Python 3, 138 ไบต์

ฉันใช้วิธีเรียกซ้ำ

def g(a,b):
 if b<1:return a
 else:
  c,n=1,'';f,*a=str(a)+'_'
  for i in a:
   if i==f:c+=1
   else:n+=str(c)+f;f,c=i,1
  return g(n,b-1)

ฟังก์ชั่นยอมรับสอง ints aและbตามที่อธิบายไว้

ฉันประหลาดใจที่ว่าข้อความเหล่านี้สั้นเพียงใด! บางทีบางคนอาจจะมาพร้อมกับวิธี Python ที่ดีกว่า


0

Perl, 38 + 2 ไบต์

for$i(1..<>){s/(.)\1*/(length$&).$1/ge}

ต้องการ-pธง:

$ perl -pe'for$i(1..<>){s/(.)\1*/(length$&).$1/ge}' <<< $'1\n5'
312211

อินพุตเป็นสตริงหลายบรรทัด:

input number
numbers of iterations

หากจำเป็นต้องใช้ขั้นตอนทั้งหมดเช่นกันเราสามารถเปลี่ยนเป็นดังต่อไปนี้ซึ่งคือ 44 + 2 ไบต์:

$ perl -nE'for$i(1..<>){s/(.)\1*/(length$&).$1/ge,print}' <<< $'1\n5'
11
21
1211
111221
312211

0

เสาใหญ่ , 11

i:At,{n,A}j

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

i      # Get input from command line.
:A     # Initialize A
  t    # Set A to the top of the stack.
,      # Pop the top of the stack.
{      # Start a for loop.
 n     # Run length encode the stack.
  ,    # Seperate command and iteration
   A   # Repeat A times.
    }  # End for loop.
j      # Join the stack with '' and print it and then exit. 

0

SmileBASIC ขนาด 100 98 ไบต์

DEF S N,T?N
WHILE""<N
C=C+1C$=SHIFT(N)IF C$!=(N+@L)[0]THEN O$=O$+STR$(C)+C$C=0
WEND
S O$,T-T/T
END

พิมพ์ขั้นตอนทั้งหมด T/Tจะมีการสิ้นสุดโปรแกรมเมื่อ T เป็น 0





0

Python 3.6, 100 98 93 ไบต์

import re
f=lambda s,n:n and eval("f'"+re.sub(r'((.)\2*)',r'{len("\1")}\2',f(s,n-1))+"'")or s

ลองออนไลน์!

หมายเหตุสิ่งนี้สร้างแลมบ์ดาที่รับค่าสตริงและจำนวนเต็มและส่งคืนสตริง ตัวอย่าง:f('1', 5) == '312211'

ค้นหาอักขระที่ซ้ำกันทั้งหมด ( ((.)\2*)regex) ทำให้ f-string มีความยาวและอักขระของตัวเอง ( r'{len("\1")}\2') จากนั้นประเมินค่า ใช้การเรียกซ้ำบนตัวนับ ( n and ...f(s,n-1)... or s) เพื่อหลีกเลี่ยงการกำหนดฟังก์ชันที่เหมาะสมและการวนซ้ำ

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