Katakan Apa yang Kamu Lihat


30

Urutan "Lihat dan katakan" atau "Katakan apa yang Anda lihat" adalah serangkaian angka di mana masing-masing menggambarkan yang terakhir.

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)

dan terus dan terus ... https://oeis.org/A005150

Bagaimanapun, ini adalah tantangan golf kode biasa (paling tidak jumlah byte yang menang) untuk membuat program yang membutuhkan dua argumen, angka awal dan jumlah iterasi. Misalnya, jika Anda memasang "1" dan "2" hasilnya adalah "21". Jika Anda memasang "2" dan "4" hasilnya adalah "132112". Selamat bersenang-senang!


2
Bisakah kita menerima / mengembalikan daftar angka?
LegionMammal978

5
Saya akan menutup pertanyaan lama sebagai dupes jika perlu; ini tidak memiliki batasan.
lirtosiast

4
Saya tidak melihat ini sebagai duplikat. Baik tampilan sebelumnya dan mengatakan tantangan sangat terbatas (satu tanpa nomor dalam kode sumber, yang lain tanpa variabel bernama, fungsi yang dinamai atau argumen bernama). Sangat sedikit bahasa yang memungkinkan jawaban atas tantangan sebelumnya yang juga kompetitif di sini.
trichoplax

3
Apakah kita diizinkan untuk menampilkan sebagai daftar angka?
lirtosiast

Jawaban:


9

Pyth, 10 8 byte

-2 byte oleh @FryAmTheEggman

ussrG8Qz

Penjelasan:

            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

Coba di sini .


Tapi setidaknya saya tidak menampilkan tanda kurung dan koma; hanya spasi di antara angka-angka :-P
Luis Mendo

2
Di Soviet Rusia,ussrG8Qz
mbomb007

8

CJam, 8 byte

q~{se`}*

Format input adalah angka awal pertama, iterasi kedua, dipisahkan oleh spasi putih.

Uji di sini.

Penjelasan

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

Array juga diratakan sebelum dicetak sehingga hasilnya hanya angka yang diperlukan.


6

JavaScript, 57 byte

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

Rekursi bekerja dengan baik untuk masalah ini. Parameter pertama adalah angka awal sebagai string, dan yang kedua adalah jumlah iterasi.


Anda dapat menyimpan tiga byte dengan kari rekursif yang aneh: b=>F=a=>b--?F(a.replace(/(.)\1*/g,c=>c.length+c[0])):aMenemukan itu saat bermain golf jawaban saya sebelum saya menyadari itu hampir identik dengan Anda;)
ETHproduksi

4

MATL , 9 byte

:"Y'wvX:!

Input adalah: jumlah iterasi, angka awal.

Cobalah online!

:      % 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

Jika Anda dapat menampilkan sebagai array maka Pyth memiliki 8.
lirtosiast

@ThomasKwa Poin bagus. Saya berasumsi itu mungkin
Luis Mendo

4

R, 87 byte

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

Tidak digabungkan & dijelaskan

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 byte

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

Ini sesingkat yang saya bisa dapatkan untuk saat ini, mungkin ada beberapa bendera rumit yang dapat menguranginya, saya tidak yakin


3

Ruby, 63 byte

Program penuh, karena pertanyaannya sepertinya menanyakan hal itu. Mengambil input sebagai argumen baris perintah.

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

Tidak, gsub!tidak dapat digunakan, karena string $*dibekukan: /


Bisakah Anda menggunakan -pflag untuk menyimpan byte? Jika Anda menggunakannya, gsubberoperasi pada garis STDIN seolah-olah itu $_.gsub!. Kemudian argumen baris perintah adalah iterasi, jadi n,=$*, dan input lainnya dibaca dari STDIN.
Value Ink

3

Retina , 46 45 27 byte

Martin melakukan banyak hal untuk membantu golf ini.

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

Cobalah online

Mengambil input dalam format:

<start><count>

<start> adalah angka awal.

<count> berada di unary, semua garis bawah, dan berapa banyak iterasi yang dilakukan.

Iterasi tunggal, 20 16 byte:

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


2

JavaScript ES6, 71 byte

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

Mengambil input sebagai string dan angka.


('1',2)memberi saya 12, padahal seharusnya 21. Panjang Anda harus ada sebelum karakter di ganti.
Mwr247

@ Mwr247 Ups, maaf.
ETHproduk

2

Perl 5, 50 byte

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

Argumen dalam urutan terbalik (jumlah iterasi kemudian seed). Contoh:

> 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

Sebagai subrutin, saya bisa mencukur byte dengan mengakhirinya $_bukan say, saya kira, tapi saya belum mengujinya. Solusi saat ini adalah sebuah program.
msh210

2

05AB1E , 9 byte (Tidak bersaing)

Diperbaiki karena komentar Emigna, lihat di bawah / suntingan.

F.¡vygyÙJ

Cobalah online!


1
Saya pikir Anda melewatkan bagian tentang mengambil 2 argumen (angka awal dan jumlah iterasi). Untungnya Anda bisa menambahkan Fdi awal dan mengambil argumen sebagaiiterations,initialNo
Emigna

1
Dan byte yang hilang karena itu bisa diperoleh kembali dengan menggantinya Dgsdengan gy.
Emigna

@ Emigna apa yang ydilakukan dalam konteks itu?
Magic Octopus Mm

1
Sama seperti y pertama, dorong nilai saat ini dalam loop. Jadi, alih-alih menduplikasi dan menukar ke atas, Anda hanya mendorongnya lagi saat Anda membutuhkannya.
Emigna

@Emigna sepertinya saya masih harus banyak belajar haha.
Magic Octopus Mm

2

R , 61 57 byte

-4 Terima kasih kepada @JayCe, tepat ketika saya yakin itu tidak bisa dilakukan dengan mudah!

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

Cobalah online!


1
Sedikit
bermain golf

Itu t(sapply(z,c))panggilan pintar.
J.

1

Mathematica, 81 73 byte

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

Tambahkan kode Anda dengan empat spasi untuk menampilkannya sebagai kode :)
Ogaday

1

Jelly , 6 byte (tidak bersaing)

ŒrUFµ¡

Cobalah online!

           Implicit input: first argument.
     µ¡    Do this to it <second argument> times:
Œr            Run-length encode into [value, times] pairs
  U           Flip them
   F          Flatten list

1

Stax , 10 byte

Çα▲ì4↔┌j█♀

Jalankan dan debug online!

Terlalu banyak byte pada format IO yang tepat ...

Penjelasan

Gunakan versi yang belum dibongkar untuk menjelaskan.

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

Bagian yang penting adalah D|R{rm:f(8 byte).

Jika input pertama dapat diambil sebagai array angka, seluruh program dapat ditulis dalam 9 byte: Jalankan dan debug online!


0

Python 3, 138 byte

Saya menggunakan pendekatan rekursif.

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)

Fungsi menerima dua int, adan bseperti yang dijelaskan.

Saya kagum dengan betapa singkat entri di sini! Mungkin seseorang akan datang dengan metode Python yang lebih baik juga.


0

Perl, 38 + 2 byte

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

Membutuhkan -pbendera:

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

Input adalah string multi baris:

input number
numbers of iterations

Jika semua langkah diperlukan juga maka kita bisa mengubahnya menjadi yang berikut, yaitu 44 + 2 byte:

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

0

Pylons , 11

i:At,{n,A}j

Bagaimana itu bekerja:

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 byte

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

Mencetak semua langkah. T/Tada di sana untuk mengakhiri program ketika T adalah 0.





0

Python 3.6, 100 98 93 byte

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

Cobalah online!

Catatan ini menciptakan lambda yang mengambil string dan integer, dan mengembalikan string. Contoh:f('1', 5) == '312211'

Temukan semua karakter yang berulang ( ((.)\2*)regex), buat f-string dari panjangnya dan karakter itu sendiri ( r'{len("\1")}\2'), lalu evaluasi. Menggunakan rekursi pada penghitung ( n and ...f(s,n-1)... or s) untuk menghindari keharusan mendefinisikan fungsi dan loop yang tepat.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.