Nói những gì bạn thấy


30

Chuỗi "Nhìn và nói" hoặc "Nói những gì bạn thấy" là một chuỗi các số trong đó mỗi số mô tả cuối cùng.

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)

và trên và trên ... https://oeis.org/A005150

Dù sao, đây là một thử thách golf mã thông thường (chiến thắng số byte ít nhất) để tạo ra một chương trình có hai đối số, một số ban đầu và số lần lặp. Ví dụ: nếu bạn cắm "1" và "2" thì kết quả sẽ là "21". Nếu bạn cắm "2" và "4", kết quả sẽ là "132112". Chúc vui vẻ!


2
Chúng tôi có thể nhận / trả lại một danh sách các chữ số không?
LegionMammal978

5
Tôi sẽ đóng các câu hỏi cũ thành bản sao nếu cần thiết; Điều này không có những hạn chế.
lirtosiast

4
Tôi không thấy đây là một bản sao. Cả hai thử thách nhìn và nói trước đây đều rất hạn chế (một không có số trong mã nguồn, còn lại không có biến được đặt tên, hàm được đặt tên hoặc đối số được đặt tên). Rất ít ngôn ngữ sẽ cho phép câu trả lời cho những thách thức trước đây cũng cạnh tranh ở đây.
trichoplax

3
Chúng ta có được phép xuất ra dưới dạng một danh sách các số không?
lirtosiast

Câu trả lời:


9

Bình thường, 10 8 byte

-2 byte bởi @FryAmTheEggman

ussrG8Qz

Giải trình:

            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

Hãy thử nó ở đây .


Nhưng ít nhất tôi không xuất dấu ngoặc và dấu phẩy; chỉ khoảng cách giữa các số :-P
Luis Mendo

2
Tại Liên Xô Nga,ussrG8Qz
mbomb007

8

CJam, 8 byte

q~{se`}*

Định dạng đầu vào là số đầu tiên đầu tiên, lần lặp thứ hai, cách nhau bởi một số khoảng trắng.

Kiểm tra nó ở đây.

Giải trình

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

Mảng cũng được làm phẳng trước khi được in nên kết quả chỉ là số bắt buộc.


6

JavaScript, 57 byte

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

Đệ quy hoạt động tốt cho vấn đề này. Tham số đầu tiên là số ban đầu dưới dạng chuỗi và thứ hai là số lần lặp.


Bạn có thể lưu ba byte với một món cà ri đệ quy kỳ lạ: Nhận b=>F=a=>b--?F(a.replace(/(.)\1*/g,c=>c.length+c[0])):athấy rằng trong khi đánh golf câu trả lời của tôi trước khi tôi nhận ra nó khá giống với của bạn;)
ETHproductions

4

MATL , 9 byte

:"Y'wvX:!

Đầu vào là: số lần lặp, số ban đầu.

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

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

Nếu bạn có thể xuất ra dưới dạng một mảng thì Pyth có 8.
lirtosiast

@ThomasKwa Điểm tốt. Tôi cho rằng điều đó là có thể
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}

Ung dung & giải thích

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

Điều này ngắn như tôi có thể có được bây giờ, có thể có một số cờ khó khăn có thể làm giảm nó, tôi không chắc chắn


3

Ruby, 63 byte

Một chương trình đầy đủ, vì câu hỏi dường như yêu cầu điều đó. Đưa đầu vào làm đối số dòng lệnh.

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

Không, gsub!không thể được sử dụng, vì các chuỗi trong $*bị đóng băng: /


Có lẽ bạn có thể sử dụng -pcờ để lưu byte? Nếu bạn sử dụng nó, gsubhoạt động trên một dòng STDIN như thể nó là $_.gsub!. Sau đó, đối số dòng lệnh là các lần lặp, vì vậy n,=$*, và đầu vào khác được đọc từ STDIN.
Mực giá trị

3

Võng mạc , 46 45 27 byte

Martin đã làm rất nhiều để giúp chơi golf này.

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

Dùng thử trực tuyến

Đưa đầu vào theo định dạng:

<start><count>

<start> là số ban đầu.

<count> là đơn nhất, tất cả các dấu gạch dưới và là bao nhiêu lần lặp được thực hiện.

Lặp lại đơn, 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

Đưa đầu vào dưới dạng một chuỗi và một số.


('1',2)mang lại cho tôi 12, khi cần 21. Độ dài của bạn nên đến trước nhân vật trong thay thế.
Mwr247

@ Mwr247 Rất tiếc, xin lỗi.
Sản phẩm ETH

2

Perl 5, 50 byte

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

Các đối số theo thứ tự ngược lại (số lần lặp sau đó là hạt giống). Thí dụ:

> 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

Là một chương trình con, tôi có thể cạo một byte bằng cách kết thúc nó $_thay vì say, tôi cho rằng, nhưng tôi đã không kiểm tra nó. Giải pháp hiện tại là một chương trình.
msh210

2

05AB1E , 9 byte (Không cạnh tranh)

Đã sửa do nhận xét của Emigna, xem bên dưới / chỉnh sửa.

F.¡vygyÙJ

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


1
Tôi nghĩ rằng bạn đã bỏ lỡ phần về việc lấy 2 đối số (số lượng ban đầu và số lần lặp). May mắn thay, bạn chỉ có thể thêm Fvào lúc đầu và lấy các đối số làiterations,initialNo
Emigna

1
Và byte bị mất bởi điều đó có thể được lấy lại bằng cách thay thế Dgsbằng gy.
Emigna

@Emigna ylàm gì trong bối cảnh đó?
Bạch tuộc ma thuật Urn

1
Giống như y đầu tiên, đẩy giá trị hiện tại trong vòng lặp. Vì vậy, thay vì nhân đôi y và hoán đổi nó lên trên cùng, bạn chỉ cần đẩy nó một lần nữa khi bạn cần.
Emigna

@Emigna có vẻ như tôi vẫn còn nhiều điều phải học haha.
Bạch tuộc ma thuật Urn

2

R , 61 57 byte

-4 cảm ơn @JayCe, ngay khi tôi chắc chắn rằng nó không thể được thực hiện đơn giản hơn nữa!

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

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


1
Chơi gôn nhẹ: TIO
JayCe

Cuộc t(sapply(z,c))gọi đó thật thông minh.
J.Doe

1

Toán học, 81 73 byte

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

Chuẩn bị mã của bạn với bốn khoảng trắng để mã hiển thị dưới dạng mã :)
Ogaday

1

Jelly , 6 byte (không cạnh tranh)

ŒrUFµ¡

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

           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█♀

Chạy và gỡ lỗi trực tuyến!

Đã dành quá nhiều byte trên định dạng IO thích hợp ...

Giải trình

Sử dụng phiên bản giải nén để giải thích.

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

Phần thiết yếu là D|R{rm:f(8 byte).

Nếu đầu vào đầu tiên có thể được lấy dưới dạng một mảng các chữ số, toàn bộ chương trình có thể được viết bằng 9 byte: Chạy và gỡ lỗi trực tuyến!


0

Python 3, 138 byte

Tôi đã sử dụng một cách tiếp cận đệ quy.

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)

Hàm chấp nhận hai số nguyên abnhư được mô tả.

Tôi ngạc nhiên về sự tuyệt vời của các mục ở đây! Có lẽ ai đó cũng sẽ đi cùng với một phương thức Python tốt hơn.


0

Perl, 38 + 2 byte

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

Yêu cầu -pcờ:

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

Đầu vào là một chuỗi nhiều dòng:

input number
numbers of iterations

Nếu tất cả các bước cũng được yêu cầu thì chúng ta có thể thay đổi nó thành các bước sau, đó là 44 + 2 byte:

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

0

Giá treo , 11

i:At,{n,A}j

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

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

In ra tất cả các bước. T/Tcó kết thúc chương trình khi T bằng 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

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

Lưu ý điều này tạo ra lambda lấy một chuỗi và một số nguyên và trả về một chuỗi. Thí dụ:f('1', 5) == '312211'

Tìm tất cả các ký tự lặp lại ( ((.)\2*)regex), tạo một chuỗi f ngoài chiều dài của chúng và chính ký tự đó ( r'{len("\1")}\2'), sau đó đánh giá nó. Sử dụng đệ quy trên bộ đếm ( n and ...f(s,n-1)... or s) để tránh phải xác định hàm đúng và vòng lặp.

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.