가장 가까운 회문 번호 찾기


22

숫자 N이 주어지면 N + X 가 회문이 되도록 X를 출력 / 반환합니다 . 여기서 | X | 최대한 작아야합니다.

회문 : 숫자는 왼쪽에서 오른쪽으로 읽을 때 오른쪽에서 왼쪽으로 읽을 때와 같은 일련의 숫자가 동일한 경우 회문입니다.
953596548456대칭, 123그리고 2424수 없습니다. 앞에 0이있는 숫자 020는 회문이 아닙니다.

입력 값이 10 15 보다 작은 양의 정수 입니다. stdin에서 메소드 매개 변수로 무엇이든 읽으십시오.

출력 은 정수 (양수 또는 음수) 여야하며 입력이 이미 palindrom 인 경우 0이어야합니다. 출력을 stdout에 쓰거나 함수 또는 원하는대로 반환 할 수 있습니다. 요구 사항을 만족하는 2 개의 숫자 (예 : 2-2) 가 있으면 그 중 하나만 출력하십시오.

예 :

Input             Output
3                 0
234               -2
1299931           -10
126               5 or -5 (only one of them)

아마도 가장 가까운 두 개의 회문 사이에 숫자가 절반이면, 어느 쪽이 허용 가능한 출력입니까? 예를 N=10들어 출력에 대한 X=-1또는 X=1?
피터 테일러

@PeterTaylor 예, 가능한 한 작아야합니다.
CommonGuy

답변:


9

피스 , 26 20

Lnb_bWP`+QZ=Z-g0ZZ)Z

새로운 규칙에 맞게 업데이트되었습니다.

프로그램은 무한 루프에서 실행되어 0, -1, 1, -2, -2 순서로 가능한 모든 증분을 테스트합니다 ...

설명:

Q=eval(input())     implicit
Z=0                 implicit
Lnb_b               def P(b): return b != rev(b)
WP`+QZ              while P(repr(Q+Z)):
=Z-g0ZZ             Z=(0>=Z)-Z
)                   <end while>
Z                   print(Z)

예제 실행 :

python3 pyth.py programs/palin.pyth <<< 965376457643450
-2969881

23 초가 걸렸습니다.


보너스 솔루션, 동일한 문자 수 :

Wn`+QZ_`+QZ=Z-g0ZZ)Z

아시다시피, 규칙은 가장 가까운 회문을 찾는 방향으로 바뀌 었습니다. 그러나 규칙 변경 전에 게시 한 이후에는이를 수정할 의무가 없습니다.
Martin Ender

[0, 1, -1, 2, -2, ...]업데이트를 통해 문자를 Z를 반복하도록 저장할 수 Z=-Z+(Z<0)있습니까?
xnor

그래-나는 그것을 독립적으로 생각했다.
isaacg

@xnor가 추가되었습니다. 필러.
isaacg

그래요 좋아요. 당신은 또한 조건의 부정을 잠시 동안 두는 것을 보았습니까? 그리고 repr을 P의 입력에 적용하여 저장합니까?
xnor

7

루비, 111 84 바이트

i=$*[j=-1].to_i
r=->j{s=(i+j).to_s
abort(j.to_s)if s==s.reverse}
loop{r[j+=1]
r[-j]}

숫자를 유일한 명령 행 인수로 사용합니다.


어떻게 약 이 웹 사이트 ?
CommonGuy

@ Manu Thanks는 그 것을 몰랐습니다! 제출물은 내가 알 수있는 한 작동합니다.
Martin Ender

6

CJam, 34 29 25 바이트

q~:I!{:R1<R-RI+`_W%=!}g;R

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

$ cjam palfind.cjam <<< 120; echo
1
$ cjam palfind.cjam <<< 121; echo
0
$ cjam palfind.cjam <<< 122; echo
-1

작동 원리

q~:I    " Read from STDIN, evaluate and save the result in “I”.                           ";
!       " Compute the logical NOT (0 since the integer is positive).                      ";
{       "                                                                                 ";
  :R    " Save the topmost integer in “R”.                                                ";
  1<R-  " Compute (R < 1) - R. This produces the sequence 0 → 1 → -1 → 2 → -2 → … .       ";
  RI+   " Push I + R.                                                                     ";
  `_    " Cast to string and push a copy.                                                 ";
  W%=!  " Check if the reversed copy matches the original.                                ";
}g      " If it doesn't, repeat the loop.                                                 ";
;R      " Discard the integer on the stack and push “R”.                                  ";

5

하스켈-62

f n=[x-n|x<-[0..]>>= \v->[n+v,n-v],show x==(reverse.show)x]!!0

파일을 이름이 지정된 파일로 저장 golf.hs한 다음 ghci로 테스트하십시오.

*Main> :l golf
[1 of 1] Compiling Main             ( golf.hs, interpreted )
Ok, modules loaded: Main.
*Main> map f [1000..1050]
[-1,0,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,-21,-22,-23,-24,-25,-26,-27,-28,-29,-30,-31,-32,-33,-34,-35,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-48,-49]
*Main> 

글쓰기는 x<-[0..]>>=(\v->[n+v,n-v])어떻습니까? 더 짧아서 하나의 라이너가됩니다
자랑스런 Haskeller

@proudhaskeller 감사합니다! 목록 모나드에 매우 우아한 트릭.
Ray

4

파이썬 2.7, 98 , 81

입력 번호에서 회문을 생성 한 다음 입력에서이 값을 빼서 델타를 찾습니다.

def f(n):
    m=map(int,str(n));l=len(m)/2;m[-l:]=m[l-1::-1];return int(`m`[1::3])-n

용법:

print f(3)          # 0
print f(234)        # -2
print f(2342)       # -10
print f(129931)     # -10
print f(100000)     # 1

ungolfed 및 주석 :

def f(n):                      # take a integer n
    m=map(int,str(n));         # convert n into array of ints
    l=len(m)/2;                # get half the length of the array of ints
    m[-l:]=m[l-1::-1];         # replace the last elements with the first elements reversed
    return int(`m`[1::3])-n    # convert array of ints backinto single int and subtract the original number to find the delta

이것은 가장 작은 델타를 제공하지 않습니다. f(19) = -8(palindrome 11), +3만들어야 할 곳22 .
Geobits

@Geobits 예, 10-100 값은이 접근 방식에 문제를 줄 것입니다
Moop

그저 그런 것이 아닙니다. 마찬가지로 199999는 3 대신 -8을, 9911은 -22 대신 88을 제공합니다. 첫 번째 숫자를 바꾸면 많은 경우에 가장 작은 델타를 얻을 수 없습니다.
Geobits

글쎄, 나는 많은 경우를 말하지 않을 것입니다, 나는 그것이 작동하는 경우의 99.9 %를 걸었습니다. 그러나 네,이 경우 100 %를위한 작업에 필요
Moop

@ 지오 비트. 물론, 오류율은 27 %입니다. 그러나 100000000에 도달하면 오류율이 상당히 떨어집니다. 실제 오류율을 계산하는 것이 흥미로울 것입니다.
Moop

4

펄 5, 93 89 88 87 75 63 44

$/=($/<1)-$/while$_+$/-reverse$_+$/;$_=$/+0

언 골프 드 :

while($input + $adjustment - reverse($input + $adjustment)) {
    $adjustment = ($adjustment < 1) - $adjustment;   
}
$input = $adjustment + 0;  ## gives 0 if $adj is undefined (when $input is a palindrome)
print $input;  ## implicit

Dennis의 제안 덕분에 43 + -p = 44로 줄였습니다.


1
1. -$a보다 짧습니다 $a*-1. 2.를 사용하는 경우 ($a<1)필요가 없습니다 ? :$a++. 3. 당신이 사용하는 경우 -p스위치를, $_=<>그리고 print$_첫 번째 문을 삭제하고 마지막을 변경할 수 있도록 암시입니다 $_=$a+0.
Dennis

@Dennis Nice가 찾습니다. 이것은 코드 골프에 대한 두 번째 시도이므로 조언을 주셔서 감사합니다!
user0721090601

-p스위치를 하나의 추가 바이트로 계산하는 것이 일반적 이지만 ($a<1)-$a대신을 사용하여 다시 가져올 수 있습니다 -$a+($a<1).
Dennis

@Dennis 위의 답변을 기반으로 해당 방법을 사용하는 방법에 대해 설명하지만 이전에 공간이 필요하기 때문에 이득이 손실됩니다.while
user0721090601

$/대신에 사용 $a하면 작동합니다.
Dennis


3

자바 : 127 (109)

다음 후보로 이동하기 전에 음수와 양수를 모두 확인하는 기본 반복.

int p(long n){int i=0;for(;!(n+i+"").equals(new StringBuilder(n+i+"").reverse()+"");i=i<1?-i+1:-i);return i;}

입력의 경우 123456789012345, -1358024회문과 같습니다 123456787654321.

줄 바꿈 :

int p(long n){
    int i=0;
    for(;!(n+i+"").equals(new StringBuilder(n+i+"").reverse()+"");i=i<1?-i+1:-i);
    return i;
}   

n+i+""작동하고 괄호를 저장 합니까 ? 우선 순위가 정확해야한다고 생각합니다.
피터 테일러

@PeterTaylor Yep, 님이 몇 명 더 받았습니다 toString(). 감사합니다 :)
Geobits

1
그 달콤한 것을 훔칠 수 있습니까 i=i<1?-i+1:-i? 나는 그것을 "증가"라고 부를 것이다.
Jacob

@Jacob Go it it;)
Geobits

3

클로저, 92

0에서 작동하는 게으른 for-sequence에서 첫 번째를 가져오고 회문을 만드는 값만 포함합니다.

(defn p[x](first(for[i(range)j[1 -1]k[(* i j)]s[(str(+ x k))]:when(=(seq s)(reverse s))]k)))

REPL-LPER 세션 :

golf-flog> (p 3)
0
golf-flog> (p 10)
1
golf-flog> (p 234)
-2
golf-flog> (p 1299931)
-10
golf-flog> (p (bigint 1e15))
1

2

자바 스크립트, 175 (136) 117

똑바로. p주어진 숫자가 회문이면 참을 반환 f하고 가장 가까운 것을 검색합니다.

편집 : 또한 Java 답변 에서 Geobits의 달콤한 "증가"트릭 덕분에 조금 더 골프를 습니다 .

p=function(n){return (s=''+n).split('').reverse().join('')==s}
f=function(n){for(i=0;!p(n+i);i=i<1?-i+1:-i);return i}

용법:

f(3)
f(234)
f(1299931)

ES6에서 104 : p=n=>[...s=''+n].reverse().join('')==s f=n=>{r=t=0;while(!(p(n+r++)||p(n+t--)));return p(n+r-1)?r-1:t+1} :)
William Barbosa

1
나는 내기했다. functionreturn정말 긴 단어를 예약되어 ...
야곱

1
3 년간 지연되어 죄송하지만 ES6에서 68 골을 기록했습니다. s=>{for(i=0;[...s+i+""].reverse().join``!=s+i;i=i<0?-i:~i);r‌​eturn i} . 스택 오버 플로우가 발생하기 쉬운 61 : f=(s,i=0)=>[...s+i+""].reverse().join``==s+i?i:f(s,i<0?-i:~i‌​))
Shieru Asakoto

2

J-49 자

정수를 정수로 매핑하는 함수입니다.

((0{g#f)>:@]^:(+:/@g=.(-:|.)@":@+f=._1 1*])^:_&0)

이 결과를 세 부분으로 구축하는 방법은 다음과 같습니다. 이것은 J REPL의 표시입니다. 들여 쓰기 된 줄은 사용자 입력이고 들여 쓰기 된 줄은 REPL 출력입니다. 그리고 네, J는 밑줄로 음의 부호를 입력합니다 _.

   236 (_1 1*]) 4                          NB. -ve and +ve of right arg
_4 4
   236 (f=._1 1*]) 4                       NB. name it f
_4 4
   236 (+f=._1 1*]) 4                      NB. add left to each
232 240
   236 (":@+f=._1 1*]) 4                   NB. conv each to string
232
240
   236 ((-:|.)@":@+f=._1 1*]) 4            NB. palindrome? on each
1 0
   236 (g=.(-:|.)@":@+f=._1 1*]) 4         NB. name it g
1 0
   236 (+:/@g=.(-:|.)@":@+f=._1 1*]) 4     NB. logical NOR (result 1 if both=0)
0
   palin =: (+:/@g=.(-:|.)@":@+f=._1 1*])


   236 (>:@]) 0                            NB. increment right
1
   236 (>:@]^:2) 0                         NB. functional power
2
   236 (>:@]^:(236 palin 3)) 3             NB. power 1 if no palindromes
4
   236 (>:@]^:(236 palin 4)) 4             NB. power 0 if has palindrome
4
   236 (>:@]^:palin) 4                     NB. syntactic sugar
4
   236 (>:@]^:palin^:_) 0                  NB. increment until palindrome, start with 0
4
   (>:@]^:(+:/@g=.(-:|.)@":@+f=._1 1*])^:_&0) 236    NB. bind 0
4
   delta =: >:@]^:(+:/@g=.(-:|.)@":@+f=._1 1*])^:_&0


   ((f) delta) 236       NB. f=: -ve and +ve
_4 4
   ((g) delta) 236       NB. g=: which are palindromes
1 0
   ((g#f) delta) 236     NB. select the palindromes
_4
   ((g#f) delta) 126     NB. what if both are equal?
_5 5
   ((0{g#f) delta) 126   NB. take the first element
_5
   ((0{g#f)>:@]^:(+:/@g=.(-:|.)@":@+f=._1 1*])^:_&0) 236   NB. it works!
_4

예 :

   pal =: ((0{g#f)>:@]^:(+:/@g=.(-:|.)@":@+f=._1 1*])^:_&0)
   pal 3
0
   pal every 234 1299931 126
_2 _10 _5
   pal 2424
18
   2424 + pal 2424
2442

당신은 또한 골프를 바꾸면서 골프가 부정적인 것보다 긍정적 인 해결책을 선호하게 만들 수 있습니다 _1 11 _1.


2

자바 스크립트 86

n=>{s=(n+'').split('');for(i=0,j=s.length-1;i<j;i++,j--)s[j]=s[i];return s.join('')-n}

이것이 나의 첫 번째 코드 골프 도전이다. 이 솔루션이 허용되기를 바랍니다.

ungolfed : n => { s = (n + '').split(''); for (i = 0, j = s.length - 1; i < j; i++,j--) s[j] = s[i]; return s.join('') - n } 설명 :
입력 n을 문자열로 변환하고 분할하십시오.
결과 배열의 양쪽을 반복하고 i <j가 될 때까지 s [i]에서 s [j]의 숫자를 복사합니다. 이것은 우리가 원하는 회문을 초래할 것입니다.
배열을 다시 결합하고 n을 빼서 x를 얻습니다.


PPCG에 오신 것을 환영합니다! 이 답변은 올바른 구조 (기능 제출은 일반적으로 JavaScript에서 가장 잘 작동 함)를 가지며 올바른 답변도 제공하는 것으로 보입니다. 이 알고리즘이 왜 작동하는지에 대한 설명을 통해 게시물을 개선 할 수는 있지만 (왜 그럴지는 분명하지 않습니다) 현재로서는 괜찮습니다.

감사합니다, ive는 작은 설명과 ungolfed 버전을 추가했습니다
Beldraith

당신은 변경할 수 있습니다 s=(n+'').split('')s=[...(n+'')]. 5 바이트 면도하기
브라이언 H.

나는 같은 방식으로 생각하지만, (19)는 첫 번째 반례 것 같다 : f(19)=3(22)는 가장 가까운 상동이지만, 함수가 반환 -8 (11)로 19 변환은 BTW 때문에 [...n+'']것 또한 추가에 대한 작업은 -2 바이트
Shieru Asakoto

2

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

n=>[...(''+n)].reduce((p,c,i,s,m=s.length-1)=>i<m/2?p+(c-s[m-i])*Math.pow(10,i):p,0)

나의 첫번째 골프 도전! 더 짧고 우아한 솔루션이 @Brian H.에 의해 이미 게시되어 있음을 알고 있지만 이것은 또 다른 접근법입니다.

테스트 코드


1
PPCG에 오신 것을 환영합니다!
Steadybox

2

Brachylog , 8 바이트

;.≜+A↔A∧

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

레이블 술어 는 여기에 중요합니다. 왜냐하면 다른 일이 발생하기 전에 출력에 사용하면 (입력과 출력이 포함 된 목록에서 실제로 호출 되기는하지만) 절대 값이 최소화되기 때문입니다. 제약 조건 프로그램 은 0부터 시작하여 작동하는 정수를 찾을 때까지 모든 정수를 추측합니다. 경우 생략,는 0이 아주 좋은 회문이라는 프로그램이 샌다, 그것은 것입니다 입력 항상 출력 음을.

            The input
;  +        plus
 .          the output
  ≜         which is instantiated immediately
    A       is A
     ↔      which reversed
      A     is still A
       ∧    but isn't necessarily the output.

1

그루비 -131 111 107 문자

골프 :

n=args[0] as long;a=n;b=n;f={if("$it"=="$it".reverse()){println it-n;System.exit 0}};while(1){f a++;f b--}

샘플 실행 :

bash-2.02$ groovy P.groovy  0
0
bash-2.02$ groovy P.groovy  234
-2
bash-2.02$ groovy P.groovy  1299931
-10
bash-2.02$ groovy P.groovy  123456789012345
-1358024

언 골프 드 :

n=args[0] as long
a=n
b=n
f={ if("$it"=="$it".reverse()) {
       println it-n
       System.exit 0
    }
}

while(1) {
    f a++
    f b--
}

1

파이썬 2-76

i=input()
print sorted([r-i for r in range(2*i)if`r`==`r`[::-1]],key=abs)[0]

입력 번호를 취득하고, 입력 사이의 모든 수의 차이의리스트를 생성 02*i 수만 팔린 드롬을 경우.

그런 다음 목록을 절대 값으로 정렬하고 첫 번째 요소를 인쇄합니다.


range (2 * i)가 큰 입력에 대해 작동하지 않을 것이라고 생각합니다.
Moop

min정렬 대신 키워드 인수와 함께 사용할 수 있습니다 .
xnor

긴 범위를 사용하려면 메모리 오버런을 피하기 위해 발전기 인 xrange와 발전기 인 min을 전환해야합니다.
isaacg

1

C ++ 289

기능 P는 다음을 사용하여 회문을 점검합니다. <algorithm> 방법을 .

언 골프 드 :

bool P(int32_t i)
{
string a,b;
stringstream ss;
ss<<i;
ss>>a;
b=a;
reverse_copy(b.begin(),b.end(),b.begin());
int k=a.compare(b);
return (k==0);
}
int main()
{
int32_t n; cin>>n;
int32_t x=0,y=n,z=n,ans=x;
while(1)
{
if(P(y)){ans=x; break;}
if(P(z)){ans=-1*x; break;}
x++;
y+=x;
z-=x;
}
cout<<ans<<endl;
return 0;
}

한 줄에 모든 것을 넣는 것이 더 짧을 것입니다.
고양이

1

매스 매 티카 75

아마 더 많은 골프를하실 수 있습니다 ..

p = (j=0; b=#; While[a=IntegerDigits[b]; b += ++j(-1)^j; a!=Reverse[a]]; #-b+(-1)^j) &

계산되지 않은 공간과 필요하지 않은 공간


1

CoffeeScript : 73

(x)->(x+="")[0...(y=x.length/2)]+x[0...-y].split("").reverse().join("")-x

설명 : 홀수 길이 (예 : 1234567) x.slice(0, y)가있는 경우 중간 자릿수는 포함하지 않지만 포함 한다는 사실을 이용합니다 x.slice(0, -y). JavaScript는 slice아마도 이런 식으로 작동 하지 않아야 하지만 작동합니다.

CoffeeScript / JavaScript가 문자열을 되돌릴 수있는 더 좋은 방법이 있기를 기대했지만 split / reverse / join 메소드가 모두있는 것처럼 보입니다.


1

PHP, 56 바이트

for(;strrev($i+$n=$argv[1])-$n-$i;$i=($i<1)-$i);echo+$i;

명령 행 인수에서 입력을받습니다. 로 실행하십시오 -nr.


1

자바 스크립트 68 바이트

(n,s=[...(''+n)],j=s.length)=>s.map((v,i,)=>i>--j?s[j]:v).join('')-n

HUGE는 알고리즘을 위해 @Beldraith에 제안합니다. 단 하나의 문장으로 작동하는 데 시간이 많이 걸리기 때문에 이것을 답변으로 게시하고 있습니다.

모든 팁을 환영합니다;)

언 골프

(
    n, // input
    s=[...(''+n)], // input split to array of chars
    j=s.length, // highest available index in s
)=> 
s.map( // this will return a new array, without modifying s
    (
        v, // value of current iteration
        i, // index of current iteration
    )=> i > --j ? s[j] : v
).join('') - n

@ Beldraith 당신이 하나의 문장 함수에 당신의 대답을 포팅하는 것을 신경 쓰지 않기를 바랍니다. 나는 폭발했습니다 : D
Brian H.

63 Golfable : (n,s=[...n+''],j=s.length)=>s.map((v,i)=>i>--j?s[j]:v).join``-n뿐만 아니라 비 명백한 반증 (19)이 존재)
Shieru Asakoto에게

ouch, 그것은 단지 19가 아니라 9로 끝나고 긍정적 인 결과를 얻어야하는 숫자입니다
Brian H.

0

파이썬, 109

def q(x,z):
 r=lambda s:int(str(s)[::-1])
 if x+z==r(x+z):return z
 if x-z==r(x-z):return -z
 return q(x,z+1)

실행시 오류가 발생합니다 (최대 재귀 깊이 초과)
Moop

그것은 내 코드에서 오류가 아닙니다. 엄청난 수의 최대 재귀 깊이를 초과하지만 적절한 크기의 숫자에서 작동합니다. 사양에 최대 테스트 사례가 없었으므로 여전히 유효한 솔루션으로 간주해야합니다.
RageCage

1
이 숫자 123456789는 질문에 게시 된 10 ^ 15 제한보다 훨씬 아래에 실패합니다.
Moop

1
재귀를 쉽게 루프로 바꿀 수
있고이

1
Stackless Python 구현에서 이것을 실행하면 재귀 깊이 문제를 피해야합니다.
xnor

0

QBIC , 38 바이트, nc

:{[-1,1,2|A=!a+b*c$~A=_fA||_xb*c]c=c+1

설명:

코드는 입력을 읽은 다음 수정자를 적용합니다. 그런 다음 숫자 + 수정자가 회문인지 확인합니다. 그런 다음 수정 자에서 한숨을 쉬고 다시 적용하고 다시 테스트합니다.

:{        Read the input value, start a DO-loop
[-1,1,2|  FOR (b = -1; b <= 1; b+=2 )
A=!a+b*c$ Get a string from the input number, 
            plus modifier c (which is 0 at the start of QBIC)
            times -1 or 1, depending on b's iteration.
~A=_fA|   if that string is equal to it's own reversed version
|_xb*c]   then Quit, printing the modifier * sign
c=c+1     Increment the modifoer and DO-LOOP again.
          The DO-loop is implicitly closed by QBIC at EOF

0

배쉬, 73 바이트

i=$1;x=$i;while((x-10#$(rev<<<$x)));do ((r=(1>r)-r,x=r+i));done;echo $x

입력은 첫 번째 명령 행 인수로갑니다.

foo.sh 123456789

0

공리, 720 594 412 바이트

R(x)==>return x;p(r,a)==(n:=#(a::String);if r<0 then(a=0=>R a;n=1 or a=10^(n-1)=>R(a-1);a=10^(n-1)+1=>R(a-2));if r>0 then(n=1 and a<9=>R(a+1);a=10^n-1=>R(a+2));r=0 and n=1=>1;v:=a quo 10^(n quo 2);repeat(c:=v;w:=(n rem 2>0=>v quo 10;v);repeat(c:=10*c+w rem 10;w:=w quo 10;w=0=>break);r<0=>(c<a=>R c;v:=v-1);r>0=>(c>a=>R c;v:=v+1);R(c=a=>1;0));c)
D(a:NNI):INT==(p(0,a)=1=>0;w:=p(-1,a);s:=p(1,a);a-w<s-a=>w-a;s-a)

바이트 수는 다시 이것이지만, 입력의 자릿수 길이와 만 달라지기 때문에 알고리즘은 O (log (n))입니다. ). ungolfed 및 결과

-- Ritorna il precedente numero palidrome rispetto ad 'a' NNI, se r<0
--                               ha la particolarita' palpn(-1,0) = 0
-- Ritorna il successivo numero palidrome rispetto ad 'a' NNI, se r>0
-- Se r=0 ritorna 1 se 'a' e' palindrome, 0 se 'a' non e' palindrome
R(x)==>return x
palpn(r,a)==
    n:=#(a::String) -- n la lunghezza in cifre di base 10 di a
    if r<0 then(a=0        =>R a;n=1 or a=10^(n-1)=>R(a-1);a=10^(n-1)+1=>R(a-2))
    if r>0 then(n=1 and a<9=>R(a+1);    a=10^n-1  =>R(a+2))
    r=0  and n=1=>1
    v:=a quo 10^(n quo 2)
    repeat -- because here not there is a goto instruction i have to use repeat
        c:=v;w:=(n rem 2>0=>v quo 10;v)
        repeat
          c:=10*c+w rem 10
          w:=w quo 10
          w=0=>break
        r<0=>(c<a=>R c;v:=v-1)
        r>0=>(c>a=>R c;v:=v+1)
        R(c=a=>1;0) -- for r==0
    c

-- Ritorna la distanza minima tra l'input 'a' e una palindrome:
--        0 se 'a' e' una palindrome
--        r numero con segno negativo se tale palindrome precede 'a'
--        r numero con segno positivo se tale palindrome e' successiva ad 'a'
palDistance(a:NNI):INT==
    palpn(0,a)=1=>0
    p:=palpn(-1,a);s:=palpn(1,a)
    a-p<s-a=>p-a
    s-a

--------------------------------------

(3) -> [[i,D(i)] for i in [3,10,234,1299931,126]]
   (3)  [[3,0],[10,1],[234,- 2],[1299931,- 10],[126,5]]
                                                  Type: List List Integer
(4) -> D 7978986575546463645758676970789089064235234524548028408198401348930489104890184018410
   (4)  - 199223418598327604580355025458434427119613
                                                            Type: Integer
(5) ->  p(0,7978986575546463645758676970789089064235234524548028408198401348930489104890184018410+%)
   (5)  1
                                                    Type: PositiveInteger
(6) -> 7978986575546463645758676970789089064235234524548028408198401348930489104890184018410+%%(-2)
   (6)
       7978986575546463645758676970789089064235234325324609809870796768575463646455756898797
                                                    Type: PositiveInteger

그들은 내 겸손한 취미 프로그래머를 위해 컴퓨터 언어로 goto를 사용한다고 다시 말했거나 완전히 제거했습니다. 정보학에 무능합니다 !!!!
RosLuP

0

껍질 , 16 12 9 바이트

ḟoS=↔+⁰İZ

-4 바이트에 대한 @ H.PWiz에게 감사합니다!

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

설명

ḟ(S=↔+⁰)İZ  -- input ⁰ a number, for example: 126
        İZ  -- built-in integers: [0,1,-1,2,-2...]
ḟ(     )    -- first element that satisfies the following (eg. 5):
     +⁰     --   add element to input: 131
  S=        --   is it equal to itself..
    ↔       --   ..reversed: 131 == 131

0

APL NARS 47 자

r←s a;b
r←0
A:b←⍕a+r⋄→0×⍳b≡⌽b⋄r←-r⋄→A×⍳r<0⋄r+←1⋄→A

위의 검색이지만 algo는 아래 g와 같이 빠르고 정확하지 않을 수 있습니다 ...

A:b←⍕a+r⋄→0×⍳b≡⌽b⋄r←-r⋄→A×⍳r<0⋄r+←1⋄→A

b≡⌽를 찾을 때만 간단한 루프 종료이므로 b는 문자열 회문

  s¨3,10,234,1299931,126
0 1 ¯2 ¯10 5 

∇r←g w;n;a;y;t;o;h;v
         r←0J1
   →0×⍳0≠⍴⍴w⋄→0×⍳''≡0↑w ⍝ if arg is not scalar int>=0→0J1
   →0×⍳(w<0)∨w≠⌊w
   h←{z←⍕⍺⋄q←⍕⍵⋄⍎(z,⌽q)}⍝ h return as digit ⍺⌽⍵
   n←⍴⍕w⋄r← 0
   →0×⍳n≤1              ⍝ arg one digit return r←0
   a←10*⌊n÷2
B: v←a⋄→C×⍳∼2∣n⋄v←a×10
C: t←⌊w÷v ⋄y←⌊w÷a
   o←y h t⋄r←(y+1)h t+1
   →D×⍳∼(∣r-w)<∣o-w⋄r←r-w⋄→0
D: r←o-w
∇

  g¨3,10,234,1299931,126
0 1 ¯2 ¯10 ¯5 


0

Japt , 8 바이트

nȥsw}cU

시도 해봐

nȥsw}cU     :Implicit input of integer U
      cU     :Get the first number in the sequence [U,U-1,U+1,U-2,U+2,...,U-n,U+n]
 È           :That returns true when passed the the following function
  ¥          :  Test for equality with
   s         :  Convert to string
    w        :  Reverse
     }       :End function
n            :Subtract U from the result
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.