카운트 다운 및 재활용


14

카운트 다운

이 코드 골프 챌린지의 목표는 카운트를 카운트하고 재활용하는 것 입니다. 설명하겠습니다.

먼저 응용 프로그램은 프로그램 인수 또는 stdin을 사용하여 숫자를 읽습니다. 다음으로 간단히 다음과 같이 카운트 다운해야합니다. 10 9 8 7 6( 내림차순 )

그러나 더 많은 것이 있습니다!

재활용

모든 숫자를 인쇄 할 수 있지만 모든 숫자를 나열하지는 않고 재활용 할 수있는 상황이 있습니다! 간단한 예를 들어 보겠습니다.

Input: 110

Output:   11091081071061051041031021010099... etc
Recycled:  10                        1

우리는 여전히 110, 109, 108의 모든 숫자를 나열했지만 01을 재활용했습니다 .

또 다른 예:

Input: 9900

Output:   9900989989897989698959894... etc
Recycled:        9 98  

코드 골프 챌린지

  • 숫자 읽기 (인수 또는 표준 입력)
  • 가능한 모든 숫자 를 재활용하는 동안 카운트 다운을 내림차순으로 출력하십시오 (표준 출력 또는 파일로)
  • 1에 도달하거나 0에서 9까지 재활용 한 순간 중지 (먼저 일어나는 일)

간단한 예 (1에 도달 할 때까지) :

Input: 15
Output: 15141312110987654321

(Notice the 110 instead of 1110)

고급 예 (모두 재활용) :

Input: 110
Output:   110910810710610510410310210100998979695949392919089887868584838281807978776757473727170696867665646362616059585756554535251504948474645443424140393837363534332313029282726252423221
Recycled:  10                            9                    8                    7                    6                    5                    4                    3                    2

(We've recycled all 0-9)


2
그것은 "모두를 지배하는 하나의 반지"문제와 전혀 관련이 없습니다.

@RoyvanRijn 당신은 당신의 질문에 오름차순에 대해 언급하지 않았습니다. 숫자가 오름차순이어야하는 경우 시퀀스의 시작 부분에 10 (두 번째 예에서)이 어떻게 올바를 수 있습니까?
자랑스런 Haskeller

1
@proudhaskeller는 질문에 내림차순을 지정하지 않습니까? "카운트 다운"은 내림차순을 의미하는 것으로 이해된다.

1
로이, 나는 중복으로 마감 투표하지 않았다. 그러나 관련 질문을 명시 적으로 언급하면 ​​관련 질문에 대한 시스템의 자동 추측이 보완됩니다. @ 물론, 관련이 있습니다. 조기 중지 조건을 제거하면이 질문은 "하나의 문자열로 모두 규칙 화"에 대해 최적이 아닌 특정 전략을 구현하도록 요청합니다.
피터 테일러

답변:


11

T-SQL - 291 277 267 217 199 191 166 158 153 145 142 128 117

새로운 방식으로 이것에 접근 한 후, 나는 너무 허름하지 않은 145 (몇 가지 사소한 조정 후 142)로 내려갔습니다. 그것은 내가은이나 청동을 위해 경쟁 할 수 있다는 것을 의미합니다. ^^

DECLARE @ INT=100;WITH N AS(SELECT 1A UNION ALL SELECT A+1FROM N WHERE A<@)SELECT LEFT(A,LEN(A)-1+A%11)FROM N ORDER BY-A

목록을 인쇄하지 않고 결과를 선택합니다. 이 질문에는 출력에 대한 구체적인 내용이 없었으므로 괜찮습니다. 이것은 여전히 ​​100에 대한 100의 제한을 가지고 있습니다. 부분적으로 100 미만의 모든 11 번째 용어가 문자를 잃고 부분적으로 공통 테이블 표현식에 대한 기본 100 재귀 제한 때문에 사실을 남용하기 때문입니다.

DECLARE @ INT=100;

WITH N AS
(
    SELECT 1A
    UNION ALL
    SELECT A+1
    FROM N
    WHERE A<@
)

SELECT LEFT(A,LEN(A)-1+A%11)
FROM N
ORDER BY-A

1
하하 T-SQL
Roy van Rijn

7

파이썬 143147

def t(n):
 p=o='';r=0 # p is previous string, o is output string, r is recycled bitmap
 while n and r<1023: # 1023 is first 10 bits set, meaning all digits have been recycled
    s=`n`;i=-1 # s is the current string representation of n
       # i is from end; negative offsets count backwards in strings
    while p.endswith(s[:i])-1:i-=1 # find common ending with prev; s[:0] is '',
       # which all strings end with
    for j in s[:i]:r|=1<<int(j) # mark off recycled bits
    o+=s[i:];p=s;n-=1 # concatenate output, prepare for next number
 print o # done

첫 번째 수준 들여 쓰기는 공백이고 두 번째 수준은 탭 문자입니다.


2
일부 표준 문자는 다음을 저장합니다. p=o=''함수에 선택적 매개 변수 와 같은 것을 넣습니다 . 당신이 사용할 수있는 *위해 andn and r<1023또는 어쩌면 r<1023*n; while x-1:공간을 면도 할 수 있습니다 while~-x. 또한 사용 된 자릿수를 저장하기 위해 비트 마스크 대신 자릿수 세트를 사용하는 것이 더 짧을 수 있습니다.
xnor

5

하스켈 154 149 147 145 128 120 119 117 바이트

import Data.List
(r%x)n|n>0&&r<":"=[(r\\t)%(x++(show n\\t))$n-1|t<-tails x,isPrefixOf t$show n]!!0|0<1=x
h=['0'..]%""

재활용 검사를 추가 하면 많은 캐릭터가 소비됩니다 ... 한숨

아직 재활용되지 않은 숫자를 기억하고 목록이 비어있을 때 중지하여 약간의 골프를 쳤습니다. 그런 다음 명시적인 재귀와 몇 가지 트릭으로 이동하여 조금 더 골프를 쳤습니다.

예제 출력 :

*Main> h 110
"110910810710610510410310210100998979695949392919089887868584838281807978776757473727170696867665646362616059585756554535251504948474645443424140393837363534332313029282726252423221"

5

파이썬 2 : 119 (117)

Will 's answer의 골프 버전이기 때문에 이것을 커뮤니티 위키로 표시하십시오 .

n=input()
d=s,={''}
exec"t=`n`;i=len(t)\nwhile(s*i)[-i:]!=t[:i]:i-=1\ns+=t[i:];d|=set(t[:i]);n-=len(d)<11;"*n
print s

환상적입니다! 어떻게 d=s,={''}작동합니까?

2
@Will d=s,={''}은에 해당합니다 d={''}; s,={''}. s,={''}와 같은 문에서 더 일반적으로 사용되는 기능인 시퀀스 압축 풀기를 사용 a, b = (b, a)하지만 단일 요소 시퀀스에서 유일한 요소를 추출하는 데 사용할 수도 있습니다.
flornquake

1
@flornquake 오, 내 실수. len(d)%11*nexec 루프를 사용하는 것처럼 보이지만 여전히 할 수 있다고 생각합니다 .
xnor

1
@Will이 영리한 트릭이 왜 효율적인지에 대한 배경으로, set()단일 요소 집합보다 빈 집합을 만드는 것이 아이러니하게 더 길다 {x}. 따라서 flornquake는 필러 멤버로 초기화하고 11 개의 요소가 있는지 확인하여 10 자리가 모두 있는지 확인합니다. 빈 문자열을로 초기화해야 s하므로이 초기화를 결합하여 문자를 저장하는이 필러 멤버로 사용됩니다.
xnor

1
@Will 네, len(d)%11*n좋았을 것입니다. :)
flornquake

4

루비, 145 (139) 130 바이트

n=gets.to_i
d=*?0..?9
s=''
n.times{|i|j=(t=(n-i).to_s).size;j-=1 while s[-j,j]!=u=t[0,j];d-=u.chars;s=t;$><<t[j..-1];exit if[]==d}

비트 마스크를 사용하지 않고 대신 사용되지 않는 숫자의 집합과 같은 배열을 제외하고 Wills와 비슷한 접근 방식. 입력은 STDIN을 통해 이루어집니다.

while대신 사용하는 대체 버전 이 times있지만 시도하는 모든 바이트 수는 동일합니다.

n=gets.to_i
d=*?0..?9
s=''
(j=(t=n.to_s).size;j-=1 while s[-j,j]!=u=t[0,j];d-=u.chars;s=t;$><<t[j..-1];exit if[]==d;n-=1)while 0<n

3

CJam, 80 77 65 57 54 자

아마도 전혀 최적화되지는 않았지만 여기에 많은 최적화와 디버깅이 끝나면 CJam에서 ES6 답변을 직접 변환 한 것입니다.

Mr{s:C_,{:H<M_,H->=!_CH@-@}g:T>+:MCT<_O@-+:O,A<Ci(*}h;

여기에서 온라인으로 사용해보십시오 . 이 함수는 숫자를 STDIN으로 사용하여 재활용 카운트 다운을 출력하여 재활용이 완료되면 그 사이에 중지합니다.

나는 그것을 더 골프하려고합니다.

작동 방식 :

기본 아이디어는 각 카운트 다운 숫자 C에 대해 첫 번째 H 숫자가 결과 문자열의 마지막 H 숫자와 같은지 확인합니다. 여기서 H는 C의 자릿수에서 0으로 이동합니다.

Mr                                    "Put an empty string and input on stack";
  { ... }h;                           "Run while top element of stack is true, pop when done";
s:C                                   "Store string value of top stack element in C"
   _,                                 "Put the number of characters in C to stack";
     { ... }g                         "Run while top element of stack is true";
:H<                                   "Store the digit iteration in H and slice C";
   M                                  "M is the final output string in making";
    _,H-                              "Take length of M and reduce H from it";
        >                             "Take that many digits of M from end and..."
         =!_                          "Compare with first H digits of C, negate and copy";
            CH@                       "Put C and H on stack and bring the above result to top of stack";
               -                      "Reduce H if the matched result was false";
                @                     "Bring the matched result on top in order continue or break the loop"
             :T                       "Store top stack element in T after the loop";
               >+:M                   "Take everything but first T digits of C and add it to M and update M";
                   CT<_               "Take first T digits of C and copy them";
                       O@             "Put saved digits on stack, and rotate top three elements";
                         -            "Remove all occurence of first T digits of C from O";
                          +:O         "Add first T digits of C to O and update O";
                             ,A<      "Compare number of saved digits with 10";
                                Ci(   "Decrement integer value of C and put it on stack";
                                   *  "If number of saved digits greater than 9, break loop";

2

자바 스크립트 ES6, 149 개 (146) 문자

그런 장황하고 많은 캐릭터들.

C=n=>{s=c='';while(n>0&s.length<10){j=1;while(t=(n+'').slice(0,-j++))if(c.endsWith(t)){s+=~s.search(t)?'':t;break}c+=(n--+'').slice(1-j)}return c}

최신 Firefox 웹 콘솔에서 실행하십시오.

실행 한 후에 C는 다음과 같이 사용할 수 있는 방법 을 만듭니다.

C(12)
12110987654321

업데이트 : 때로는 일반 오래된 return것이 화살표 함수 클로저보다 짧습니다 :)


그것은 어떤 숫자가 출력되지는 재활용 후, 순서 아래에만 계산을 재활용했다한다
자랑 haskeller

오! 그거야? 그의 모든 사례도 그 결과를 출력하고있었습니다.
Optimizer

@ proudhaskeller 아, 나는 재활용 문자도 출력했습니다. 고마워, 그것은 나를 약간의 문자를 저장합니다.
PenutReaper
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.