Prazing Puzles & Colf : 문자열 조율


25

이 사이트에서 약간의 시간을 보내면서 가능한 한 짧은 것을 즐기게되었습니다. 이것이 최근에 같은 문자를 두 번 이상 포함하는 문자열로 인해 기분이 상한 이유 일 수 있습니다. 다음 규칙에 따라 주어진 문자열 을 요약 하는 함수 또는 프로그램을 작성 해야합니다.

  • 0-condensation으로 시작합니다. 즉, 0 사이의 다른 문자가있는 동일한 문자의 첫 번째 (가장 왼쪽) 쌍을 찾습니다. 이러한 쌍을 찾으면 두 문자 중 하나를 제거하고 다른 0 응축 을 수행하여 알고리즘을 다시 시작하십시오 . 해당 쌍을 찾을 수 없으면 다음 단계로 진행하십시오. 예 :
    programming-C0-> programing
    aabbcc-C0-> abbcc
    test-C0->test

  • 그런 다음 1-condensation을 수행하십시오. 즉, 1 개의 다른 문자가 포함 된 첫 번째 동일한 문자 쌍을 찾으십시오. 이러한 쌍을 찾으면 그 중 하나와 그 사이의 모든 문자를 제거 하고 0-condensation으로 다시 시작하십시오 . 해당 쌍을 찾을 수 없으면 다음 단계로 진행하십시오. 예 :
    abacac-C1-> acac
    java-C1->ja

  • 계속 2 응축 하고 그래서 최대에 N-결로N 원래 문자열의 길이되고, 응축 한 후 다시 시작 때마다 일부 문자를 제거했습니다. 예 :
    programing-C2-> praming
    abcdafg-C3->afg

결과 문자열을 압축 이라고 하며 각 문자를 최대 한 번 포함합니다.


입력:

인쇄 가능한 ASCII 문자의 소문자 문자열입니다.

산출:

응축 위의 규칙에 따라 문자열입니다.

예 :

examples     -> es
programming  -> praming
puzzles      -> puzles
codegolf     -> colf
andromeda    -> a
abcbaccbabcb -> acb
if(x==1):x++ -> if(x+
fnabnfun     -> fun
abcdefae     -> abcde

알고리즘의 작동 방식을 명확히하는 자세한 예 :

fnabnfun -C0-> fnabnfun -C1-> fnabnfun -C2-> fnfun -C0-> fnfun -C1-> fun -C0-> fun 
 -C1-> fun -C2-> ... -C8-> fun

abcbaccbabcb -C0-> abcbacbabcb -C0-> abcbacbabcb -C1-> abacbabcb -C0-> abacbabcb 
 -C1-> acbabcb -C0-> acbabcb -C1-> acbcb -C0-> acbcb -C1-> acb -C0-> acb 
 -C1-> ... -C12-> acb

솔루션과 알고리즘이 허용되는 모든 입력에 대해 동일한 출력을 반환하는 한 접근 방식은 위에서 알고리즘을 구현할 필요가 없습니다. 이것은 도전입니다.


유용한 샌드 박스 댓글에 대한 @Linus 에게 감사합니다 !


@MartinEnder Riley의 테스트 케이스는 여전히 필요합니다. 레티 나 솔루션이 작동하지 않는 유일한 케이스이기 때문입니다.
mbomb007

@ mbomb007 아, 알겠습니다. 좋은 지적.
Martin Ender

입력 문자열에 공백과 같은 인쇄 할 수없는 문자가 포함됩니까?
mbomb007

@ mbomb007 아니요, 인쇄 가능한 ASCII 문자 만 사용하는 것으로 가정합니다.
Laikoni

@ mbomb007 그러나 내가 아는 한 공백 인쇄 가능한 ASCII 문자로 간주됩니다 (예 : here) .
Laikoni

답변:


6

자바 스크립트 (ES6), 74 바이트

f=
(s,n=0,m=s.match(`(.).{${n}}\\1`))=>s[n]?m?f(s.replace(...m)):f(s,n+1):s
;
<input oninput=o.textContent=f(this.value)><pre id=o>


내가 생각했던 것보다 짧고 아주 좋습니다.
ETHproductions

5

Perl, 38 31 30 29 바이트

이것은 골프가 아닌 언어를 훨씬 뒤에 남겨 두어야합니다 ...

라일리$-[0] 덕분에 -1

Dada@{-} 덕분에 -1

에 +1 포함 -p

STDIN에 입력하십시오

condense.pl:

#!/usr/bin/perl -p
s/(.)\K.{@{-}}\1// while/./g

이 27 바이트 버전은 작동하지만 펄이 @-정규식에서 보간되지 않기 때문에 작동하지 않습니다 ( https : //.com/questions/39521060/why-are-etc-not-interpolated-in-strings 참조 )

#!/usr/bin/perl -p
s/(.)\K.{@-}\1// while/./g

@{\@-}부품 은 어떻게 작동합니까? @-각 매치의 인덱스를 유지 한다고 생각 했기 때문에 매번 반복 할 때마다 어떻게 "계산"됩니까? 또한 @{\@-}각 교체 전후에 인쇄하면 1 또는 2 만 인쇄됩니다.
Riley

1
@Riley /./g문자열 변경 한 후 0으로 그것의 재설정 인쇄하면 때 문자열의 각 1 시간으로 점진 제외 @-애프터 /./g하지만 전에 s///당신은 올라가고 참조 (나머지 문자열이 큰 충분한 테스트를 사용) 것입니다
Ton Hospel

인쇄 $-[0]는 내가 기대하는 숫자를 제공합니다. 합니까 @{\@-}처럼 행동을 $-[0]어떤 이유로 인쇄 할 때 때문에 정규식 컨텍스트가 아니라? 같은 경우 $-[0]보다 짧은 바이트 @{\@-}입니다.
Riley

"@{\@-}"@{\@-}(없이 ") 와 다릅니다 .
Riley

@Riley 아니요, "@{\@-}"와 동일합니다 "@-". 그리고 이것은 정규식 대체에도 해당되지만 그렇지 않습니다. 동시에 $-[0]작동하지만 작동하지 않습니다. 추신 : 아마도 @-인쇄 를 할 때 스칼라 컨텍스트가 적용 되었기 때문에 항상 1 또는 2를 받았습니다
Ton Hospel

3

CJam , 35 바이트

rL{_,{{(_@_@#I={I)>]sj}*}h]s}fI}j

온라인으로 사용해보십시오!


rL{                            }j   | run recursion on input
   _,{                      }fI     | for I from 0 to length(input)
      {                 }h]s        | one pass & clean up
       (_@                          | slice and store leading element A
          _@#I={      }*            | if next A is I steps away
                I)>                 | slice off I+1 element
                   ]sj              | clean up & recursion

당신은 삽입 하여 개별 응축을 볼 수 있습니다ed


2

파이썬 2 117 104 101 바이트

필요한 교체를 재귀 적으로 수행하십시오. 정규식을 동적으로 작성합니다.

import re
def f(s,i=0):t=re.sub(r"(.)%s\1"%("."*i),r"\1",s);e=s==t;return i>len(t)and t or f(t,i*e+e)

온라인으로 사용해보십시오


2 개의 리턴 라인 return i>len(t) and t or s!=t and f(t) or f(t,i+1)은 -4 바이트의 네트 를 위해 압축 될 수 있습니다.
Quelklef

다음과 같이 변경하여 다른 2 바이트를 줄일 수 있습니다.return t if i>len(t)else s!=t and f(t)or f(t,i+1))
Quelklef

더 나아가 함수 정의에서를 e=s==t;return i>len(t)and t or f(t,i*e+e)제거 할 수는 i=0있지만 시작 0으로 호출해야합니다.
Quelklef

네 개의 공백을 사용하기 때문에가 아니라 SE가 자동으로 확장하기 때문에 네 개의 공백이 있다고 가정합니다. 그렇지 않은 경우 모든 공백을 탭 또는 -9 바이트의 단일 공백으로 변경할 수 있습니다.
Fund Monica의 소송

@Quelklef 메타는 추가 매개 변수 사용을 금지합니다.
mbomb007


1

Mathematica, 101 바이트

NestWhile[i=0;StringReplace[#,a_~~_~RepeatedNull~i++~~a_:>a,1]&,#,SameQ,2,ByteCount@#]&~FixedPoint~#&

이것을 더 짧게 만드는 방법이 있어야합니다 ...


1

PHP, 90 바이트

for($s=$argv[$c=1];$s[$i=++$i*!$c];)$s=preg_replace("#(.).{{$i}}\\1#","$1",$s,1,$c);echo$s;

또는 92 바이트

for($s=$argv[1];$s[$i];$i=++$i*!$c)$s=preg_replace("#(.).{".+$i."}\\1#","$1",$s,1,$c);echo$s;   

1
1) 첫 번째 버전 : (-2) +$i대신 $i+=0. 2) for대신 루프 while는 2 바이트를 절약하고 중괄호 (-4)를 제거 할 수 있습니다. 3) $i=++$i*!$c대신 $i=$c?0:$i+1(-1). 4) \\2필요하지 않은 경우 괄호 (-2)를 제거하십시오. 5) 속도 9대신 제한 을 허용 할 수 있습니다 1(+0)
Titus

@Titus 아주 좋은 아이디어. 나는 이것을 보지 못했다
Jörg Hülsermann

이제 다시 생각합니다 ... +$i모든 경우에 작동하지 않습니다. 시도하십시오 hammer. PHP는 정규 표현식의 빈 괄호에 대해 불평하지 않습니다. 그러나 원하는대로 일치하지 않습니다. 그건 그렇고 : 나는 90이 아닌 91을 셉니다. 그러나 새로운 1) 시도for($s=$argv[$c=1];$s[$i=++$i*!$c];)
Titus

@Titus 예, 다시 돌아가서 $i+=0나중에 제안을 시도 할 것입니다. 망치로 무엇을 의미합니까?
Jörg Hülsermann

@Titus 똑같은 문제 는 괜찮지 만 puzzle다른 (.)//1제안이나 괜찮다면$i´=0
Jörg Hülsermann

1

루비, 75 64 57 바이트

(56 바이트의 코드 + p명령 행 옵션)

정규식 내에서 문자열 보간을 사용하여 교체되는 일치 길이를 제어합니다.

i=0
~/(.).{#{i}}\1/?sub($&,$1)&&i=0: i+=1while i<$_.size

테스트:

$ ruby -p condense.rb <<< fnabnfun
fun

1

하스켈 , 97 88 바이트

(0?)
(a:s)!(b:t)|a==b=a:t|1<3=a:s!t
s!_=s
m?s|length s<m=s|a<-s!drop m s=sum[m+1|a==s]?a

온라인으로 사용해보십시오!


오래된 97 바이트

(a:s)!(b:t)|a==b=a:t|1<3=a:s!t
s!_=s
m?s|length s==m=s|a<-s!drop m s=(last$0:[m+1|a==s])?a
c=(0?)

ideone에서 사용해보십시오 .

설명:

(a:s)!(b:t)|a==b = a:t         --perform condensation
           |1<3  = a:s!t       --recursively compare further
 s   ! _         = s           --no condensation performed

(!)기능을 수행 하나, N 축합 때 회 전체와 회 등 제거 처음 n 문자의 문자열 부여 abcdbe하고 cdbe반복적으로 두 선두 문자를 비교함으로써, 2 응축한다.

m?s|length s==m   = s         --stop before performing length-s-condensation
   |a <- s!drop m s           --a is the m-condensation of s
    = (last$0:[m+1|a==s])?a   --disguised conditional:
                              -- if a==s       if the m-condensation did not change s
                              -- then (m+1)?a  then perform m+1-condensation
                              -- else 0?a      else restart with a 0-condensation

c=(0?)                        -- main function, initialise m with 0
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.