숫자 문자열 축소


12

주어진 길이 12길이 의 문자열이 주어지면 다음 기준에 따라 문자열을 최종 형태로 축소하는 데 필요한 단계 수를 계산하는 코드를 작성하십시오 ( 더 이상 함수 일 필요는 없으며 모든 것이 잘 될 것입니다).

문자열이 112112인 경우 다음 과 같이 1, 2 1 및 2를 인쇄해야합니다 1112. 작업을 다시 수행하면 1과 2를 인쇄해야합니다 12. 그런 다음 2를 인쇄하여를 얻습니다 2. 이 문자열은 더 이상 변경되지 않으므로 최종 형식입니다. 3최종 양식에 도달하려면 3 단계가 필요하므로 코드가 출력 됩니다.

다른 규칙

  • 문자열의 길이가 고르지 않으면 마지막 숫자는 그대로 유지됩니다.

  • 더 이상 변경할 수없는 모든 문자열 (예 222222:)은 최종 양식으로 간주됩니다.

  • 외부 소스를 사용할 수 없습니다.

  • 코드는 1및의 모든 문자열에서 작동해야합니다 2.

  • 코드 골프이기 때문에 가장 짧은 코드가 승리합니다.

  • 코드는 모든 단계를 인쇄해야합니다.

  • 모든 입력 방법이 좋습니다.

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

편집 : 크게 편집했습니다. 죄송합니다.


3
"문자열이 112112 인 경우 다음과 같이 1, 2, 1, 2를 인쇄해야한다는 것을 의미합니다. 1112."
Fabinout

7
큰 소리로 읽으십시오. "하나 하나", "둘 하나"및 "하나 둘"입니다. "1 시간 1", "2 시간 1"및 "1 시간 2"를 의미합니다.
Vereos

5
정규 표현식이 "유용하지 않다"면 왜 금지합니까?
JB

1
정규식 제한이 제거되었습니다.
Vereos

1
@ProgramFOX "하나 하나,이 초, 그리고 2" 1 11 2. 두 숫자는 모두 한 쌍입니다. 한 쌍의 첫 번째 숫자는 한 쌍의 두 번째 숫자를 렌더링하는 횟수를 나타냅니다. 페어 파트너가없는 모든 최종 홀수 숫자는 그대로 렌더링됩니다.
apillers

답변:


7

루비 1.9+, 73 자

나는 정규 표현식이없는 규칙을 어리 석고 임의적이라고 생각하므로 여기에 많은 정규식 기반 솔루션이 있습니다.

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

시운전 :

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

마지막 줄은 걸음 수입니다.

편집 : 정규식 제한이 Vereos에 의해 제거되었습니다.


3

C - 156 154

내 첫 번째 코드 골프는 여기!

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);}

테스트:

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

산출:

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

2

GolfScript : 69 자

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

내부 루프를 반복 할 때마다 문자열에서 처음 2 개의 숫자를 찾아서이를 사용하여 양식 블록을 {num1 num2 '' + *}만듭니다. 이 블록이 평가되면 원하는 숫자를 읽습니다. 더 이상 문자가 없을 때까지 이것을 반복하십시오. 그런 다음 반복 횟수와 인쇄를 추적하면서 해당 루프를 반복하십시오.

견본:

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

2

파이썬-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

입력 값을 인쇄하지 않습니다. 필요한 경우 print s;바로 전에 이동하십시오.n="";

참고 : "기능"이라고 말 했으므로 이것은 기능입니다. 다음은 함수가 아닌 버전입니다 (127 자).

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

(사용자가 118에 숫자를 붙여 넣을 수 있다면 (첫 번째 줄에 따옴표 사이에 데이터 붙여 넣기)) :

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

샘플 실행 :

211222111111222
11222111222
122111222
2111222
111222
1222
222
7

보너스로서, 각 솔루션 (최대 9) 더 많은 수를 포함하는 문자열에 대해 작동하지만, 어떤 캐릭터가 더 큰 출력을 생성 (예 99)


1

자바 스크립트, 107

(예 : 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 입력 문자열입니다

  • 매 라운드마다 정규 표현식 .?.?을 사용하여 s두 문자 문자열 배열 로 분해 한 다음 map해당 문자열을 축소 된 형태로 분해하고 배열을 다시 붙입니다.

  • r 이전 라운드와 비교하기 위해 현재 라운드의 결과를 저장합니다 s

  • k 둥근 카운터입니다

  • 우리는 무섭게 남용 prompt(별칭으로 p는 사용자에게 메시지를 제시 할 수 있기 때문에, 양쪽의 입력 및 출력 메커니즘)


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) 바이트

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

-pl명령 행 스위치가 필요합니다 .

샘플 사용법 :

$ 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;}?>

예 : http://skyleo.de/codegolf.php?i=211222111111222

211222111111222
11222111222
122111222
2111222
111222
1222
222
7

나는 codegolf에 약간 나쁘다 ._. 어쩌면 나는 Java와 PHP 만 사용해서는 안됩니다 (더 복잡하다고 생각해야합니다)


1
CodeGolf는 가장 복잡한 솔루션을 찾는 것이 아니라 가장 간단한 솔루션을 찾는 것입니다.
primo

str_splitPHP의 배열처럼 문자열의 개별 문자에 액세스 할 수 있으므로 실제로 할 필요는 없습니다 .
Gareth

예, 얼마 후 나는 그것을 스스로 생각했지만 편집하기에는 너무 게으르다. 그러나 지금 나는 그것을 바꿨다.
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)

예:

122122122121212212

211222111111222
11222111222
122111222
2111222
111222
1222
222
Steps: 7

0

MATHEMATICA, 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

파워 쉘, 2

OP의 의견에서 내 질문에 대한 Vereos의 응답 "입력 방법으로 코드를 단축 할 수 있습니다"를 기반으로 다음 스크립트가 결과를 얻습니다.

$a

"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

분명히 이것은 심각한 항목이 아닙니다. 목적은 입력 방법을 허용하면 답변을 얻는 데 필요한 실제 코드를 사 소화 할 수 있다는 점을 설명하는 것입니다. 따라서 입력 방법을보다 엄격하게 지정해야합니다.


0

J, 41 자

함수로서 (아파치!

(,":@#)@}:@(([:;_2&(<@((".@[#])/)\))^:a:)
분해도
                _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)
샘플 런
   (,":@#)@}:@(([:;_2&(<@((".@[#])/)\))^:a:) '1121121'
1121121
11121  
121    
21     
11     
5      
   (,":@#)@}:@(([:;_2&(<@((".@[#])/)\))^:a:) '122122122121212212'
122122122121212212
211222111111222   
11222111222       
122111222         
2111222           
111222            
1222              
7                 

0

펄, 107 자

다른 펄 코드는 분명히 이것을 능가하지만 가치가있는 것은 여기에 있습니다. 추가 문자를 사용하여 -l 스위치를 사용했습니다.

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

더 읽기 쉬운 버전 :

$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}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.