문자열을 길이 인코딩


18

다음 규칙을 사용하여 ASCII 인쇄 가능한 문자 만 포함하고 *-string 이라고하는 다른 문자열에서 단일 문자열을 가져 오십시오. 프로세스가 중단되기 전에 문자열이 부족하면 오류이며 프로세스의 결과는 정의되지 않습니다.

  1. 로 시작 d=1, s=""
  2. 을 만날 때마다 2를 *곱하십시오 d. 다른 문자를 만날 때마다을 끝까지 연결하고에서 s1을 빼십시오 d. 지금이라면 d=0중지하고 돌아옵니다s

정의 된 예 :

d->d
769->7
abcd56->a
*abcd56->ab
**abcd56->abcd
*7*690->769
***abcdefghij->abcdefgh

정의되지 않은 예 : (빈 문자열도이 중 하나임)

*7
**769
*7*
*a*b
*

당신의 임무는 문자열을 가져와 해당 문자열 *을 생성하는 가장 짧은 문자열을 반환하는 것입니다.

프로그램 예 :

7->7
a->a
ab->*ab
abcd->**abcd
769->*7*69

프로그램은 하나 이상의 문자와 *ASCII가 아닌 인쇄 가능 문자 만 포함하는 모든 문자열을 처리해야 합니다. 프로세스가 정의되지 않은 문자열은 반환 할 수 없습니다. 정의에 따라 모든 문자열을 생성 할 수 없기 때문입니다.

표준 허점 및 I / O 규칙이 적용됩니다.


입력에 포함되지 않았다고 가정 할 수 있습니까 *?
Luis Mendo

3
@DonMuesli "* ASCII가 아닌 문자 만 인쇄 가능"
FryAmTheEggman

답변:


3

Pyth ( 36 27 바이트)

9 바이트 개선을위한 Jakube에 감사합니다! 현재 진흙 투성이의 대답 만큼 좋지는 않지만 무엇이든

KlzJ1VzWgKyJp\*=yJ)pN=tK=tJ

테스트 스위트

파이썬으로 번역 :

                            | z=input() #occurs by default
Klz                         | K=len(z)
   J1                       | J=1
     Vz                     | for N in z:
       WgKyJ                |   while K >= J*2:
            p\*             |     print("*", end="")
               =yJ          |     J=J*2
                  )         |     #end inside while
                   pN       |   print(N, end="")
                     =tK    |   K=K-1
                        =tJ |   J=J-1

1
Muddyfish의 사망 한 것 같습니다 ...
Rɪᴋᴇʀ

5

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

f=(s,d=2)=>s?d>s.length?s[0]+f(s.slice(1),d-2):'*'+f(s,d*2):s

다음을 수행하는 재귀 함수 :

  • d남은 문자열 길이를 2로 나눈 값보다 작거나 같은 경우 :

    APPEND *출력과 곱 d(2)에 의한

  • 그밖에:

    문자열을 이동하고 출력에 추가하고에서 1을 뺍니다 d.

실제로보기 :

f=(s,d=2)=>s?d>s.length?s[0]+f(s.slice(1),d-2):'*'+f(s,d*2):s

input.oninput = e => output.innerHTML = f(input.value);
<input id="input" type="text"/>
<p id="output"></p>


1
조건을 반대로하여 d 값의 두 배에 더한 바이트를 더하여 2 바이트를 절약하십시오.f=(s,d=2)=>s?d>s.length?s[0]+f(s.slice(1),d-2):'*'+f(s,d*2):s
Neil


2

C, 125 바이트

main(int q,char**v){++v;int i=1,n=strlen(*v);while(n>(i*=2))putchar(42);for(i-=n;**v;--i,++*v)!i&&putchar(42),putchar(**v);}

이것은 올바른 인코딩을 출력하기 위해 매우 규칙적인 스타 위치 패턴을 활용합니다. 처음에는 무차별 재귀 솔루션을 사용해 보았지만 돌이켜 보면 더 간단한 수학 솔루션이 있음이 분명했습니다.

기본적으로 항상 2^floor(log_2(length))출력 시작 부분에 별표가 있고 2^ceil(log_2(length)) - length문자 다음에 별표가 있습니다 (최소한 1 문자까지 작동하는 경우).

(약간) ungolfed 버전은 다음과 같습니다

main(int q,char**v){
   ++v;                         // refer to the first command line argument
   int i=1, n=strlen(*v);       // set up iteration variables

   while(n > (i*=2))            // print the first floor(log2(n)) '*'s
      putchar(42);

   for(i-=n;  **v;  --i, ++*v)  // print the string, and the final '*'
      !i&&putchar(42),putchar(**v);
}

1

자바 스크립트 (ES6), 88 77 바이트

f=(s,l=s.length,p=2)=>l<2?s:p<l?"*"+f(s,l,p*2):s.slice(0,p-=l)+"*"+s.slice(p)

처음 엔에서 그 생각 abcde해야했다 *a**bcde그러나 그것은 밝혀 **abc*de작품을 단지뿐만 아니라. 이것은 출력이 floor (log₂ (s.length)) 선행 별과 길이가 2의 거듭 제곱이 아닌 문자열에 대한 추가 별을 사용하여 쉽게 구성됨을 의미합니다.

편집 : 선행 별 수를 재귀 적으로 계산하여 8 바이트를 절약했습니다. 길이가 1 인 특수 문자열을 사용하여 3 바이트를 더 절약하여 길이가 2의 거듭 제곱 인 문자열을 추가 별표가있는 것으로 처리 할 수 ​​있습니다.


0

하스켈, 68 바이트

f d[]=""
f d xs|length xs>=d*2='*':f(d*2)xs
f d(x:xs)=x:f(d-1)xs

다른 답변과 동일합니다. EOF이면 빈 문자열을 출력하십시오. 남은 길이가 두 배 이상인 경우 d별표와 두 배 를 출력합니다 d. 그렇지 않으면 다음 문자를 출력하고에서 하나를 빼십시오 d.

언 골프 드 :

f d (  [])                    = ""
f d (  xs) | length xs >= d*2 = '*' : f (d*2) xs
f d (x:xs)                    =  x  : f (d-1) xs
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.