4까지의 거리


13

이 도전은이 비디오를 기반으로합니다 . 이 도전을 시도하기 전에 시청하는 것이 좋습니다.

먼저 함수를 정의합니다. 이 함수 ( OEIS )는 정수 n을 입력으로 취하여 영어로 표현 된 n의 문자 수 (공백 또는 하이픈없이)를 출력합니다. 예를 들어 "three"에는 5 개의 문자가 있으므로 3은 5로 매핑됩니다.

이 과정을 반복하는 숫자로 시작하는 비디오에서 알 수 있듯이 결국에는 4 개가 발생하여 영원히 매핑됩니다.

다음은 16보다 작은 숫자의 궤도를 보여주는 원유 직접 그래프입니다.

  12 11
    \|      
15 2 6 1 10 14 13
  \ \|/ /  /  /
   7 3-/  8--/
    \|   /
 9 0 5--/
  \ \|
   \-4

문제는 4에 도달하기 전에 숫자가 수행되는 단계 수 (또는이 함수를 숫자에 적용해야하는 횟수)를 결정하는 것입니다 (예 : 방향 그래프의 레벨).

영어 숫자 형성

이 도전에 대한 영어 단어를 어떻게 구성해야하는지에 대한 간단한 설명은 다음과 같습니다.

1에서 19까지의 숫자는 다음과 같습니다.

하나, 둘, 셋, 넷, 다섯, 여섯, 일곱, 여덟, 아홉, 열, 열한, 열두, 열 세, 열 네, 열 다섯, 열 여섯, 열 일곱, 열 여덟, 열 여덟

19보다 큰 숫자의 경우 프로세스는 다음과 같습니다.

숫자가 백 자리이면 백 자리의 자릿수로 시작하고 "백"입니다.

예 :

100 -> "onehundred"

나머지가 20보다 작 으면 나머지 영어 표현을 추가하십시오.

예 :

714 -> "sevenhundredfourteen"

그렇지 않으면 10 자리가 0이 아닌 경우 적절한 표현을 추가하십시오.

2-> twenty
3-> thirty
4-> forty
5-> fifty
6-> sixty
7-> seventy
8-> eighty
9-> ninety

예 :

470 -> "fourhundredseventy"

마지막으로 한 자리가 있다면 그 표현을 추가하십시오

예 :

681 -> "sixhundredeightyone"

추가 규정

  • 100보다 큰 숫자의 경우 글자 수를 세는 경우 "and"를 생략해야합니다. 예를 들어 577은 "fivehundseventyseven"이며 23 자로되어 있습니다.

  • 프로그램은 표준 방법을 통해 입력으로 0보다 크고 1,000보다 작은 모든 정수를 허용해야합니다.

  • 프로그램은 표준 출력 방법에 필요한 단계 수를 출력해야합니다.

  • 이것은 codegolf이므로 바이트 수가 가장 적은 솔루션이 승리합니다.

테스트 사례

1 -> 3
4 -> 0
7 -> 2
23 -> 5
577 -> 6
600 -> 4 

1
관련 나는 이것이 속이는 줄 알았지 만 찾을 수 없습니다.
제임스

"그리고"에 무슨 일이? 아니면, 왜 떠나고?!
Jonathan Allan

@JonathanAllan cuz 'Murica
LegionMammal978

답변:


5

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

f=(n,a="03354435543668877998")=>n-4&&1+f(7*(n>99)-(-a[n/100|0]-(a[n%=100]||a[n%10])-"0066555766"[n/10|0]))

숫자 변환 오버 헤드에도 불구하고 문자열은 길이를 인코딩하는 가장 좋은 방법 인 것 같습니다.


어이, 그것은 거의 정확히 11 바이트 더 짧은 내 (거의 게시 된) 답변의 모습입니다.
ETHproductions

@ETHproductions 좋은 점은 게시하기 전에 16 바이트를 골라 내었습니다!
Neil

2

파이썬, num2words, 97113115 94 93 92 바이트

+16 바이트 (num2words 실제로 테스트 케이스 임의의 결과를 변경하더라도 않는 적용 하이픈 깜빡 23하고 577각 하이픈 있음)
+2 바이트 (포함 깜빡 f=재귀 있지만)
-20 바이트 (사용 re)
-8 바이트 @Wheat 마법사 덕분에 (사용 ~, 교체 n!=4n-4, 그리고 ... 한 줄 가져 오기> _ <)
-1 바이트 감사 @Cyoce에 (에서 공간 4 and)

import re,num2words as w
f=lambda n:n-4and-~f(len(re.sub('\W|and','',w.num2words(n))))

단계 수를 세어보세요. 거대 및 음수 정수에서도 작동합니다 ( \Wnum2words 결과에서 공백, 쉼표 및 하이픈을 찾습니다).

>>> for test in (1,4,7,23,577,600,-1*2**96,3**96):
...     print('test: {0}  ->  {1}'.format(test, f(test)))
...
test: 1  ->  3
test: 4  ->  0
test: 7  ->  2
test: 23  ->  5
test: 577  ->  6
test: 600  ->  4
test: -79228162514264337593543950336  ->  4
test: 6362685441135942358474828762538534230890216321  ->  5

마지막 단계는 다음과 같습니다.

sixquattuordecillionthreehundredsixtytwotredecillionsixhundredeightyfiveduodecillionfourhundredfortyoneundecilliononehundredthirtyfivedecillionninehundredfortytwononillionthreehundredfiftyeightoctillionfourhundredseventyfourseptillioneighthundredtwentyeightsextillionsevenhundredsixtytwoquintillionfivehundredthirtyeightquadrillionfivehundredthirtyfourtrilliontwohundredthirtybillioneighthundredninetymilliontwohundredsixteenthousthreehundredtwentyone
fourhundredfiftyone
nineteen
eight
five

1
f=람다 함수 앞에는 필요하지 않습니다
Ad Hoc Garf Hunter

1
import re,num2words as r두 가지 다른 진술 대신 시도하십시오 .
Ad Hoc Garf Hunter

1
n-4같은 일이 같다n!=4
특별 Garf 헌터

1
@WheatWizard는 num2words이다 w, re여전히 re참고 모듈과 기능 모두가 호출됩니다 -num2words
조나단 앨런

1
마지막 하나 and 1+and-~1 바이트를 절약하기 위해 대체 될 수 있습니다
Ad Hoc Garf Hunter


1

Mathematica, 89 바이트

Length@FixedPointList[StringLength@StringReplace[IntegerName@#,{" "->"","-"->""}]&,#]-2&

전형적인 Mathematica : 내장 함수는 좋고 긴 함수 이름은 나쁩니다. FixedPointList답변이 변경되지 않을 때까지 첫 번째 인수 (함수)를 두 번째 인수에 반복적으로 적용하여 모든 결과를 나열합니다. 결과는 원래 입력과 반복 출력의 두 사본을 포함하므로 -2끝 부분에 있습니다. Mathematica의 내장 IntegerName에는 공백과 하이픈이 포함되어 있으므로 직접 제거해야합니다.

짜증나게, IntegerName의 출력에는 일반 하이픈이 아닌 문자 "-"(유니 코드 # 8208)가 포함되어 있습니다. 이 제출이 89 바이트가 아닌 88 이유의은 (그리고 네 개의 공백으로 코드를 위의 앞에 수 없다고 하고 위의 코드를 정확하게 권리 경우 작동하지 않습니다 - 그래서는? 유니 코드 문자 도움을 받아이 잘라 내기 및 붙여 넣기 .)


1

파이썬 2.7 344 216 208 바이트 :

x=`input()`;c=0;y=lambda v:dict(zip(range(0,10),[0]+v));l=[3,3,5,4,4,3,5,5,4];d=y(l);e=y([3,6,6,6,5,5,7,7,6]);f=y([i+7for i in l])
while x!='4':x=`sum([q[int(r)]for q,r in zip([d,e,f],x[::-1])])`;c+=1
print c

다른 Python 답변과 달리 외부 라이브러리를 사용하지 않습니다. 를 통해 입력을 받아서 stdin출력합니다 stdout.

모든 테스트 케이스와 함께 반복하십시오!

설명

먼저 각각의 숫자로 된 영어 단어 표현의 길이를 각각 1 [1,9], 10, 100 의 닫힌 간격 으로 나타내는 숫자와 쌍을 이루는 3 개의 사전을 만듭니다 . 예를 들어, 사전의 첫 번째 항목이 d됩니다 1:3같은 1철자가 one영어로하고있다3 편지를.

그런 다음 일부 문자열 입력의 각 숫자 자리 x가 해당 사전에 할당 된 후 각 자리의 각 숫자 가 해당 사전의 값과 일치합니다. 예를 들어, 입력 번호가이라고 가정하십시오 23. 2010 자리의이 사전와 결합 될 수 e있는 그것과 일치, 6그리고 3사람의 장소는 사전와 결합 될 d이 일치하는, 5. 그런 다음 일치하는 숫자는 숫자의 영어 표현 길이를 나타 내기 위해 함께 추가되며, 이는 x문자열로 지정되고 x!='4'while 루프가 지속되는 c1지금까지 수행 된 단계 수를 나타냅니다. 따라서, 23에 해당하는 것입니다 11차례 대응에에게 것이다, 6어떤을 켜 것이다 3다음에 5마지막에 4결과 5총 단계.

마지막으로 루프가 완료되면 "Distance to Four"를 나타내도록 c출력됩니다 .stdout5


1

자바, 556 295 바이트

261 바이트 를 절약 해 준 @KevinCruijssen에게 감사 합니다

  void int(n) {int s[]={0,3,3,5,4,4,3,5,5,4,3,6,6,8,8,7,7,9,9,8,6,9,9,11,10,6,6,5,5,7,7,6};int c=0,t=(int)Math.pow(10,(int)Math.log10(n)),v=1;while(n>0){if(n/100>0)c+=(s[n/100]+7);else {if(n>0&n<25){c+=s[n];break;}else{c+=s[(n/10)+22];}}n=n%t;t=t/10;}while(c!=4){v++;c=s[c];}System.out.print(v);}


언 골프 드 :

  void int(n) {

    int s[]={0,3,3,5,4,4,3,5,5,4,3,6,6,8,8,7,7,9,9,8,6,9,9,11,10,6,6,5,5,7,7,6};
     int c=0,t=(int)Math.pow(10,(int)Math.log10(n)),v=1;
         while(n>0){
            if(n/100>0)
                c+=(s[n/100]+7);
            else {if(n>0&n<25){
                c+=s[n];
            break;
            }
            else{
                c+=s[(n/10)+22];

            }
            }
            n=n%t;
            t=t/10;
        }

        while(c!=4)
        {
            v++;
        c=s[c];
        }
System.out.print(v);
}

때문에, 당신은 당신의 코드에서 실수를 생각 s++하는 String 배열에 수 없습니다 .. : S
케빈 Cruijssen

@KevinCruijssen S (카운터)를 INT 및 STRING으로 선언합니다 .... java가 자동으로 INT라고 결정합니다.
Numberknot

내가 ideone에 코드 또는 내 이클립스 IDE를 실행하면 두가 있기 때문에 글쎄, 그건 실패 s:이 같은 꽤 큰 금액으로 골프 당신이 할 수있는 BTW, .. 코드를int c(int n){int s[]={0,3,3,5,4,4,3,5,5,4,3,6,6,8,8,7,7,9,8,8,6,9,9,11,10,6,5,5,5,7,6,6},c=0,t=(int)Math.pow(10,(int)Math.log10(n)),x=1;while(n>0)if(n/100>0)c+=s[n/100]+7;else{if(n>0&n<25){c+=s[n];break;}else c+=s[(n/10)+22];}n%=t;t/=10;}for(;c!=4;x++,c=s[c]);return x;}
케빈 Cruijssen

나는 충격을 받았다. .. 내 코드와 @KevinCruijssen에 감사합니다 .. 그리고 그것을 고치고 있습니다 ... 다시 감사합니다.
Numberknot

Np :) if-else를 사용하지 않고 어떻게 든 골프를 칠 수 있다고 생각하지만 (다른 사람에게 맡길 것입니다), 초기 코드는 도전을 해결하기위한 훌륭한 기반이므로 +1 나에게서.
Kevin Cruijssen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.