회문 반전 추가
반전 추가 과정은 생성 된 숫자가 회문이 될 때까지 숫자가 추가되는 곳입니다. 예를 들어 68로 시작하면 프로세스는 다음과 같습니다.
68 + 86 => 154 + 451 => 605 + 506 => 1111
보시다시피, 회문 번호에 도달하기 위해 3 번의 추가가 필요했습니다. 로 시작 89
하려면 24 단계가 필요합니다 ( 여기서 세부 사항 참조 ).
회문에 도달하기 전에 수행 된 대부분의 단계에 대한 세계 기록은 261이며,이 1186060307891929990
수는 10 118 보다 큰 수 를 생성합니다 . 그러나 회문을 얻을 수 없었던 숫자가 상당히 많았습니다. 이것을 라이 클렐 번호 라고 합니다 .
우리는 10 진법으로 일하고 있기 때문에 후보자라고 부를 수 있습니다. 왜냐하면이 숫자는 회문에 도달하지 않았다는 증거가 없기 때문입니다. 예를 들어, 가장 작은 10 진법 Lychrel 후보는 196 개이며 10 억 회 이상 반복되었습니다. 회문이 존재하면 10 10 8.77 보다 훨씬 큽니다 . 이에 비해, 많은 1이 원자에 새겨 져 있다면, 그것을 쓰기 위해서는 2.26772 × 10 588843575 원자의 가치가있는 원자가 필요합니다.
당신의 작업
정수 입력을 받고 회문에 도달하는 데 필요한 단계 수를 리턴하거나 인쇄하는 프로그램 또는 함수를 작성하십시오. 귀하는 Lychrel 후보를 다룰 필요가 없습니다 (즉, 귀하의 프로그램은 Lychrel 후보가 주어지면 오류를 발생 시키거나 영원히 실행될 수 있습니다).
테스트 사례 :
f(0) => 0
f(11) => 0
f(89) => 24
f(286) => 23
f(196196871) => 45
f(1005499526) => 109
f(1186060307891929990) => 261
규칙
보너스
- 형식화 된 각 추가 단계를 인쇄
n + rev(n) = m
하면 점수에 0.75를 곱할 수 있습니다 . 단계 수보다 먼저 합계를 인쇄해야합니다. - 코드가 숫자가 리 크렐 후보인지 감지 할 수 있으면 점수에 0.85를 곱할 수 있습니다 . 이 경우 261 회 이상 반복되는 것이 라이 클렐 후보라고 가정하면 충분합니다. 아무 것도 반환하지 않거나 정답으로 오인 할 수없는 숫자 (예 : 0-261 범위에없는 문자열 또는 숫자)는 반환하지 마십시오. 오류는 유효한 출력으로 계산되지 않으며 (예 : 최대 재귀 깊이 초과) 감지에 사용할 수 없습니다.
- 두 보너스를 모두 완료하면 0.6을 곱하십시오 .
이것은 code-golf 이므로 바이트 수가 가장 적습니다.
이 코드 스 니펫은 Python 3에서 두 가지 보너스가 모두 포함 된 예제 솔루션을 보여줍니다.
def do(n,c=0,s=''):
m = str(n)
o = m[::-1]
if c > 261:
return "Lychrel candidate"
if m == o:
print(s)
return c
else:
d = int(m)+int(o)
s+="%s + %s = %s"%(m,o,str(d))
return do(d,c+1,s)
답변
Pyth, 12 바이트
f_I`~+Qs_`Q0
이것은 아주 새로운 기능을 사용합니다 (17 시간 만 사용).
설명
implicit: Q = input number
f 0 repeat the following expression until it
evaluates to true and return the number of steps
`Q convert Q to string
_ reverse the digits
s convert to int
+Q add Q
~ assign the result to Q
(this returns the old value of Q)
` convert the old value of Q to a string
_I and check if it's invariant under the operation reverse
편집하다:
코드를 약간 변경했습니다. 이전 버전은
fqKs_`Q~+QK0
동일한 바이트 수이지만 새로운 것은 더 시원합니다.
답변
파이썬, 51
def f(n):r=int(str(n)[::-1]);return n-r and-~f(n+r)
Python 2 str()
의 경우 리터럴에 L
첨부되어있어 백틱을 대체 할 수 없습니다 long
.
점수가 64 * 0.85 = 54.4 인 대체 버전은 다음과 같습니다 .
def f(n,c=262):r=int(str(n)[::-1]);return c*(n-r)and-~f(n+r,c-1)
점수가 88 * 0.6 = 52.8 인 Python 3 의 대체 버전 :
def f(n,c=262):r=int(str(n)[::-1]);return c*(n-r)and-~f(n+r,print(n,'+',r,'=',n+r)or~-c)
답변
CJam, 23 22 20.4 바이트
ri{__sW%i+}261*]{s_W%=}#
코드의 길이는 24 바이트이며 Lychrel 후보의 경우 -1 을 인쇄합니다 .
작동 원리
ri e# Read an integer from STDIN.
{ }261* e# Do the following 261 times:
__ e# Push two copies of the integer on the stack.
sW%i e# Cast to string, reverse and cast back to integer.
+ e# Add the copy and the reversed copy of the integer.
] e# Wrap all 262 results in an array.
{ }# e# Push the index of the first element such that:
s e# The string representation equals...
_W%= e# the reversed string representation.
경우 {}#
에 성공, 인덱스는 단계의 수입니다. 반면에 배열에 회문이 포함되어 있지 않으면 -1{}#
을 누릅니다 .
답변
자바, 200 * 0.6 = 120
import java.math.*;int f(BigInteger a){int s=-1;for(String b,c;(b=a+"").equals(c=new StringBuffer(b).reverse()+"")!=s++<999;)System.out.println(b+" + "+c+" = "+(a=a.add(new BigInteger(c))));return s;}
이것은 상자에 표시된 것과 동일한 역할을하지만 골프가 추가 된 간단한 루프입니다. 1000
리치 렐 후보가 탐지 보너스를 받기 위해 반환 합니다. 나도 인쇄 할 수 없었 습니다. 많은 문자 (적어도 Java의 경우)에 대해 그 보너스도 걸렸습니다. 보너스 코드없이 내가 할 수있는 최선은 156 이었으므로 그만한 가치가있었습니다.
줄 바꿈과 함께 :
import java.math.*;
int f(BigInteger a){
int s=-1;
for(String b,c;(b=a+"").equals(c=new StringBuffer(b).reverse()+"")!=s++<999;)
System.out.println(b+" + "+c+" = "+(a=a.add(new BigInteger(c))));
return s;
}
기존 답변 : 171 * 0.85 = 145.35 바이트
import java.math.*;int f(BigInteger a){int s=-1;for(String b,c;(b=a+"").equals(c=new StringBuffer(b).reverse()+"")!=s++<262;)a=a.add(new BigInteger(c));return s>261?-1:s;}
답변
루비, (80 + 2) * 0.6 = ~ 49.2
flags -nl
로 실행
p (0..261).find{$_[b=$_.reverse]||puts($_+' + '+b+' = '+$_="#{$_.to_i+b.to_i}")}
출력은 다음과 같습니다
$ ruby -nl lychrel.rb
89
89 + 98 = 187
187 + 781 = 968
968 + 869 = 1837
1837 + 7381 = 9218
9218 + 8129 = 17347
17347 + 74371 = 91718
91718 + 81719 = 173437
173437 + 734371 = 907808
907808 + 808709 = 1716517
1716517 + 7156171 = 8872688
8872688 + 8862788 = 17735476
17735476 + 67453771 = 85189247
85189247 + 74298158 = 159487405
159487405 + 504784951 = 664272356
664272356 + 653272466 = 1317544822
1317544822 + 2284457131 = 3602001953
3602001953 + 3591002063 = 7193004016
7193004016 + 6104003917 = 13297007933
13297007933 + 33970079231 = 47267087164
47267087164 + 46178076274 = 93445163438
93445163438 + 83436154439 = 176881317877
176881317877 + 778713188671 = 955594506548
955594506548 + 845605495559 = 1801200002107
1801200002107 + 7012000021081 = 8813200023188
24
196이 주어지면 처음 261 개의 추가 단계를 인쇄 한 다음를 수행합니다 nil
.
여기서 너무 까다로운 것은 없습니다. 우리는 $_
(입력으로 초기화 된) 반전이 포함되어 있는지 확인합니다 . 동일한 크기이므로 같은 경우에만 가능합니다. 그렇다면 단계 번호를 인쇄하고 종료합니다. 그렇지 않으면 추가 단계를 표시하고 실행하여 새 값을 저장합니다 $_
(안타깝게도 eval
후행 0으로 반전 된 숫자를 해석하기 때문에 표시중인 문자열 만 볼 수는 없습니다) 8 진 리터럴로). puts
루프가 계속되도록 잘못된 값을 반환합니다.
답변
Pyth-19 바이트
while 루프와 카운터를 사용합니다. 이보다 더 작은 알고리즘이있을 수 있지만 이것은 매우 짧습니다.
Wnz_z=z`+szs_z=hZ;Z
답변
K, 25 바이트
#1_{~x~|x}{$. x,"+",|x}\$
매우 우아하지 않습니다. 전체 형태 ( {monad 1}{monad 2}\x
)는 K가 일반 “while”루프와 동등하며, 첫 번째 모나드는 정지 조건이고 두 번째는 인수에 반복적으로 적용되는 함수 x
입니다. 첫 번째 모나드 ( {~x~|x}
)는 고전적인 “is xa palindrome”문구의 부정입니다. 두 번째 모나드는 x와 x의 역을 나타내는 문자열을 연결하여 평가 한 다음 결과를 문자열로 다시 캐스팅합니다 $
.
중간 결과를 보여주는 샘플 실행 :
{~x~|x}{$. x,"+",|x}\$68
("68"
"154"
"605"
"1111")
보너스 요청에 따라 포맷 된 출력을 수행하는 것은 매우 어색하고 상당한 양의 코드를 추가합니다.