Thu nhỏ chuỗi số


12

Cho một chuỗi 12thời lượng bất kỳ, hãy viết một số mã (không phải là một chức năng nữa, mọi thứ sẽ tốt) để tính toán có bao nhiêu bước hiện nó cần phải thu nhỏ các chuỗi mẫu cuối cùng, sau tiêu chí này:

Nếu chuỗi của bạn là 112112, điều này có nghĩa là bạn phải in 1, hai 1 và 2, như thế này : 1112. Khi bạn thực hiện lại thao tác, bạn sẽ phải in 1 và 2. Bạn nhận được 12. Sau đó, bạn in một 2, lấy 2. Đây là một hình thức cuối cùng, vì chuỗi này sẽ không thay đổi nữa. Mã của bạn sẽ xuất ra 3, vì bạn cần 3 bước để đến mẫu cuối cùng.

Các quy tắc khác

  • Nếu chuỗi có độ dài không đồng đều, số cuối cùng vẫn còn nguyên.

  • Mỗi chuỗi không thể thay đổi nữa (như 222222) được coi là một hình thức cuối cùng.

  • Bạn không thể sử dụng bất kỳ nguồn bên ngoài.

  • Mã của bạn phải hoạt động với mọi chuỗi 12.

  • Mã ngắn nhất sẽ thắng, vì nó là mã golf.

  • Mã của bạn nên in mỗi bước.

  • Mọi phương thức nhập liệu sẽ ổn.

Ví dụ

Input >> 122122122121212212

Your code has to print:
211222111111222
11222111222
122111222
2111222
111222
1222
222
Steps:7 (you can omit the "Steps")
---- ---- ---- ----
Input >> 22222221

Your code has to print:
22222211
2222221
2
---- ---- ---- ----
Input >> 2222

Your code has to print:
0

EDIT: Chỉnh sửa nặng nề. Thành thật xin lỗi về điều đó.


3
"Nếu chuỗi của bạn là 112112, điều này có nghĩa là bạn phải in 1, hai 1 và 2, như thế này: 1112." Tôi không hiểu.
Fabinout

7
Cố gắng đọc to. Đó là "một một", "hai một" và "một hai". Ý tôi là, "1 lần 1", "2 lần 1" và "1 lần 2".
Vereos

5
Nếu regexes "thậm chí không hữu ích", tại sao bạn lại cấm chúng?
JB

1
Regex hạn chế loại bỏ.
Vereos

1
@ProgramFOX "một 1, hai 1 và 2" : 1 11 2. Cứ hai số là một cặp: số thứ nhất của cặp cho biết số lần hiển thị số thứ hai trong cặp là bao nhiêu lần. Bất kỳ chữ số lẻ cuối cùng nào không có đối tác cặp được hiển thị nguyên trạng.
apsillers

Câu trả lời:


6

Ruby 1.9+, 73 ký tự

Tôi thấy quy tắc không regex là ngớ ngẩn và độc đoán, vì vậy đây là một giải pháp dựa trên regex khá khó chịu:

gets
($.+=1;puts$_.gsub!(/(.)(.)/){$2*$1.to_i})until~/^(22)*[12]?$/
p~-$.

Chạy thử nghiệm:

$ ruby 21.rb <<< 122122122121212212
211222111111222
11222111222
122111222
2111222
111222
1222
222
7

Dòng cuối cùng là số bước.

Chỉnh sửa: Hạn chế Regex đã được gỡ bỏ bởi Vereos.


3

C - 156 154

Mã golf đầu tiên của tôi ở đây!

f(char*s,c){puts(s);char*a=s,*b=s,m=50,x,y;while(*a){
x=*a++;y=*a++;if(y)m&=x&y;*b++=y?:x;x-49?*b++=y:(*b=0);}
*b=*a;return m/50?printf("%i",c),c:f(s,c+1);}

Kiểm tra:

char c[] = "12211122211222221";
f(c,0);

Đầu ra:

12211122211222221
21112211222221
111221222211
121122221
21222211
1122221
122221
22211
22111
2211
221
10

2

GolfScript: 69 ký tự

0\{\)\.p.[]\{~10base{.,1>{(\(@\{''+*}++~@\+\.}{~+0.}if}do;}~.@=!}do;(

Mỗi lần lặp của vòng lặp bên trong sẽ tìm thấy 2 số đầu tiên trong chuỗi và sử dụng chúng để tạo thành một khối của biểu mẫu {num1 num2 '' + *}. Khi khối này được ước tính, chúng ta sẽ có được số đọc mong muốn của những con số đó. Lặp lại điều này cho đến khi không còn nhân vật nữa. Sau đó, lặp lại vòng lặp đó trong khi theo dõi số lần lặp và in.

Mẫu vật:

echo '12211122211222221' | ruby golfscript.rb g.gs
"12211122211222221"
"21112211222221"
"111221222211"
"121122221"
"2122221"
"1122221"
"122221"
"22211"
"22111"
"2211"
"221"
10

2

Con trăn - 126

def f(s):
 j=0
 while 1:
    n="";i=0
    for c in s:n+=c*i;i=[int(c),0][i>0]
    if i:n+=`i`
    if s==n:break
    s=n;print s;j+=1
 print j

Điều này không in giá trị đầu vào. Nếu nó cần, sau đó di chuyển print s;sang phải trướcn="";

Lưu ý: bạn đã nói "chức năng", vì vậy đây là một chức năng. Đây là một phiên bản không phải là một chức năng (127 ký tự):

s=raw_input();j=0
while 1:
    n="";i=0
    for c in s:n+=c*i;i=[int(c),0][i>0]
    if i:n+=`i`
    if s==n:break
    s=n;print s;j+=1
print j

(Nếu tôi có thể yêu cầu người dùng dán số đó vào 118 (dán dữ liệu giữa các dấu ngoặc kép trên dòng đầu tiên)):

s="";j=0
while 1:
    n="";i=0
    for c in s:n+=c*i;i=[int(c),0][i>0]
    if i:n+=`i`
    if s==n:break
    s=n;print s;j+=1
print j

Chạy mẫu:

211222111111222
11222111222
122111222
2111222
111222
1222
222
7

Như một phần thưởng, mỗi giải pháp này hoạt động cho các chuỗi chứa số lớn hơn (tối đa 9), nhưng một số chuỗi tạo ra đầu ra lớn hơn và lớn hơn (ví dụ 99:)


1

JavaScript, 107

(yêu cầu hỗ trợ chức năng mũi tên, ví dụ như trong Firefox)

for(p=prompt,s=p(),k=0;r=s.match(/.?.?/g).map(a=>a>2?a[1]+(a<13?'':a[1]):a).join(''),p(s),r!=s;s=r)k++;p(k)
  • s là chuỗi đầu vào

  • Mỗi vòng, chúng tôi sử dụng regex .?.?để phát nổ sthành một chuỗi các chuỗi có hai ký tự, sau đó mapcác chuỗi đó thành các dạng rút gọn của chúng và dán các mảng lại với nhau

  • r lưu trữ kết quả của vòng hiện tại để so sánh với vòng trước s

  • k là quầy tròn

  • Chúng tôi lạm dụng khủng khiếp prompt(bí danh p) như là một cơ chế đầu vào và đầu ra, vì nó có thể hiển thị một thông báo cho người dùng


for(p=prompt,s=p(),k=0;
    r=s.match(/.?.?/g).map(
        a=>
            a>2?                     // if a is more than one char
                a[1]+(a<13?'':a[1])  // double the second char if the first char is 2
               :a                    // if not two chars, return a
    ).join(''),                      // glue new array together
     p(s),                           // print s
     r!=s;                           // test if string has changed
    s=r)
        k++;
p(k)

1

Perl - 50 (+2) byte

$a-=print while"$_"ne(s/(.)(.)/$2x$1/ge,$_);$_=-$a

Yêu cầu -plchuyển đổi dòng lệnh.

Sử dụng mẫu:

$ more in.dat
122122122121212212

$ perl -pl rev-count.pl < in.dat
211222111111222
11222111222
122111222
2111222
111222
1222
222
7

$ more in.dat
22222221

$ perl -pl rev-count.pl < in.dat
22222211
2222221
2

$ more in.dat
2222

$ perl -pl rev-count.pl < in.dat
0

1

PHP, 240

<?php
$s=$_GET['i'];$h=$s;for($t=1;$h!=r($h);$t++){echo$h.'<br>';$h=r($h);}echo r($s)==$s?0:$h.'<br>'.$t;function r($c){for($i=0;$i<strlen($c)-1;$i+=2){$s.=$c[$i]==1?$c[$i+1]:$c[$i+1].$c[$i+1];if($i+3==strlen($c))$s.=$c[$i+2];}return$s;}?>

Ví dụ: http://skyleo.de/codegolf.php?i=211222111111222

211222111111222
11222111222
122111222
2111222
111222
1222
222
7

Tôi hơi tệ ở codegolf ._. Có lẽ tôi không nên chỉ sử dụng Java và PHP (và tôi nên suy nghĩ phức tạp hơn)


1
CodeGolf không phải là tìm kiếm giải pháp phức tạp nhất, mà là đơn giản nhất.
primo

Bạn thực sự không cần phải làm str_splitvì bạn có thể truy cập các ký tự riêng lẻ trong một chuỗi giống như một mảng trong PHP.
Gareth

Vâng, sau một thời gian tôi đã nghĩ rằng bản thân mình, nhưng tôi quá lười để chỉnh sửa nó. Nhưng bây giờ tôi đã thay đổi nó.
Leo Pflug

0

R, 158

s=utf8ToInt(scan(,""))-48;i=0;while(any(!!s-2)){t=(a<-sum(s|T))%%2;u=s[seq(a-t)];cat(s<-c(rep(u[c(F,T)],u[c(T,F)]),s[a*t]),"\n",sep="");i=i+1};cat("Steps:",i)

Thí dụ:

122122122121212212

211222111111222
11222111222
122111222
2111222
111222
1222
222
Steps: 7

0

TOÁN HỌC, 117

s="122122122121212212";
Grid@FixedPointList[(Partition[#,2,2,1,{}]/.{{1,1}->{1},{1,2}->{2},{2,1}->{1,1}}//Flatten)&,FromDigits/@Characters@s]

122122122121212212
211222111111222
11222111222
122111222
2111222
111222
1222
222
222

0

POWERSHELL, 2

Dựa trên phản hồi của Vereos "Bạn có thể sử dụng bất kỳ phương thức nhập liệu nào rút ngắn mã của bạn" cho câu hỏi của tôi trong các nhận xét của OP, tập lệnh sau đạt được kết quả:

$a

Ví dụ chạy cho "122122122121212212":

# Input method is to assign answer to $a:
$a = @"
211222111111222
11222111222
122111222
2111222
111222
1222
222
Steps: 7
"@

# Execute script
$a

# Answer follows:
211222111111222
11222111222
122111222
2111222
111222
1222
222

Rõ ràng đây không phải là một mục nghiêm trọng - mục đích của nó là để minh họa quan điểm của tôi rằng cho phép bất kỳ phương thức nhập liệu nào cũng có thể tầm thường hóa mã thực tế cần thiết để đưa ra câu trả lời. Do đó phương thức nhập cần được chỉ định chặt chẽ hơn.


0

J, 41 ký tự

Là một chức năng (ew parens! Không quá hạnh phúc về chúng):

(,":@#)@}:@(([:;_2&(<@((".@[#])/)\))^:a:)
Khung nhìn bùng nổ
                _2&(            )\          NB. on non-overlapping 2-grams:
                       (      )/            NB.   insert between the two chars:
                        ".@[                NB.     read left operand ([) as a number
                            #]              NB.     and repeat right this many times,
                    <@(           )         NB.   then put it in a box
            ([:;                   )        NB. open and concatenate the boxes
           (                        ^:a:)   NB. repeat until fixpoint (keeping intermediates)
        }:@                                 NB. drop first element (the input)
(,":@#)@                                    NB. append length of array (# steps)
Chạy mẫu
   (,":@#)@}:@(([:;_2&(<@((".@[#])/)\))^:a:) '1121121'
1121121
11121  
121    
21     
11     
5      
   (,":@#)@}:@(([:;_2&(<@((".@[#])/)\))^:a:) '122122122121212212'
122122122121212212
211222111111222   
11222111222       
122111222         
2111222           
111222            
1222              
7                 

0

Perl, 107 ký tự

Mã perl khác rõ ràng đánh bại điều này, nhưng với giá trị của nó, đây là. Tôi đã sử dụng công tắc -l với chi phí của một nhân vật phụ:

$_=<>;while(1){$l=$_;$_=join"",map{($a,$b)=split//;$b?$b x$a:$a}grep/./,split/(..?)/;last if$l eq$_;print}

Một phiên bản dễ đọc hơn về điều đó:

$x = <>; while(1) { $l = $x; $x = join "", map{ ($a,$b) = split//, $_; $b ? $b x $a: $a } grep /./, split /(..?)/, $x; last if $l eq $x; print $x}
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.