Znajdź najbliższą liczbę palindromową


22

Biorąc pod uwagę liczbę N , wyjście / powrót X, tak że N + X jest palindromem, gdzie | X | musi być jak najmniejszy.

Palindrom: Liczba jest palindromem, jeśli sekwencja cyfr jest taka sama podczas czytania ich od lewej do prawej, jak podczas czytania od prawej do lewej.
95359i 6548456są symetryczne 123i 2424nie są. Liczby z wiodącymi zerami, takie jak 020nie są palindromem.

Dane wejściowe to dodatnia liczba całkowita mniejsza niż 10 15 . Przeczytaj to ze standardowego, jako parametru-metody, cokolwiek.

Wyjście musi być liczbą całkowitą (dodatnią lub ujemną) i powinno wynosić 0, jeśli wejście jest już palindromem. Możesz zapisać swoje wyjście na standardowe wyjście, zwrócić je z funkcji lub cokolwiek zechcesz. Jeśli są 2 liczby (np. 2I -2), które spełniają wymagania, wypisz tylko jedną z nich.

Przykłady:

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

Prawdopodobnie, jeśli liczba znajduje się w połowie drogi między dwoma najbliższymi palindromami, czy jest to akceptowalny wynik? Np N=10. Wyjście może być X=-1lub X=1?
Peter Taylor

@PeterTaylor Tak, musi być tak mały, jak to możliwe.
CommonGuy

Odpowiedzi:


9

Pyth , 26 20

Lnb_bWP`+QZ=Z-g0ZZ)Z

Zaktualizowano w celu spełnienia nowych zasad.

Program działa w nieskończonej pętli, która testuje każdy możliwy przyrost, w kolejności 0, -1, 1, -2, -2 ...

Wyjaśnienie:

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)

Przykładowy przebieg:

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

Zajęło to 23 sekundy.


Rozwiązanie premiowe, ta sama liczba znaków:

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

Aby Cię powiadomić, zasady zmieniły się na znalezienie najbliższego palindromu (w obu kierunkach). Ale myślę, że odkąd napisałeś przed tą zmianą reguły, nie masz obowiązku jej naprawiać.
Martin Ender

Czy to może zaoszczędzić znaki, aby pętla Z przechodziła [0, 1, -1, 2, -2, ...]przez aktualizację Z=-Z+(Z<0)?
xnor

Tak - pomyślałem o tym niezależnie.
isaacg

@xnor Dodano. Podsadzkarz.
isaacg

Ok fajnie. Czy zastanawiałeś się również nad tym, aby w dłuższej perspektywie zaprzeczyć negacji tego stanu? A może zapisanie repr przez zastosowanie go do danych wejściowych do P?
xnor


6

CJam, 34 29 25 bajtów

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

Wypróbuj online.

Przykłady

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

Jak to działa

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

Haskell - 62

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

Zapisz go w pliku o nazwie, golf.hsa następnie przetestuj za pomocą 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> 

co powiesz na pisanie x<-[0..]>>=(\v->[n+v,n-v])? Jest krótszy i sprawia, że ​​jest
jednowarstwowy

@proudhaskeller Thanks! Bardzo elegancka sztuczka z listą monad.
Ray

4

Python 2.7, 98 , 81

Tworzy palindrom na podstawie numeru wejściowego, a następnie odejmuje go od wejścia, aby znaleźć deltę.

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

stosowanie:

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

nieposortowany i opatrzony adnotacjami:

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

To nie daje najmniejszej delty. f(19) = -8(palindrom 11), gdzie należy +3zrobić 22.
Geobits

@Geobits Tak, wartości 10-100 dadzą mi problem z tym podejściem
Moop

To nie tylko te. Podobnie, 199999 daje -8 zamiast 3, 9911 daje 88 zamiast -22. Odwrócenie pierwszych cyfr nie działa, aby uzyskać najmniejszą deltę w wielu przypadkach.
Geobits

cóż, nie powiedziałbym zbyt wielu przypadków, założę się o 99,9% przypadków, w których działa. Ale tak, musi działać w 100% przypadków
Moop

@Geobits. Jasne, więc wskaźnik błędu wynosi 27%. Ale kiedy dojdziesz do 100000000, poziom błędu znacznie spada. Interesujące byłoby obliczenie rzeczywistego poziomu błędu.
Moop

4

Perl 5, 93 89 88 87 75 63 44

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

Nie golfowany:

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

Dzięki sugestiom Dennisa sprowadziłem go do 43 + -p = 44


1
1. -$ajest krótszy niż $a*-1. 2. Jeśli używasz ($a<1), nie ma takiej potrzeby ? :$a++. 3. Jeśli użyjesz -pprzełącznika $_=<>i print$_jest niejawny, możesz upuścić pierwszą instrukcję i zmienić ostatnią na $_=$a+0.
Dennis

@Dennis Nice znajduje. To tylko moja druga próba gry w golfa kodowego, więc doceniam radę!
user0721090601

Zwyczajowo liczy się -pprzełącznik jako jeden dodatkowy bajt, ale można go odzyskać, używając ($a<1)-$azamiast niego -$a+($a<1).
Dennis

@Dennis Zastanawiałem się nad zastosowaniem tej metody w oparciu o powyższą odpowiedź, ale zysk gubi się, ponieważ wymaga wcześniej miejscawhile
user0721090601

Jeśli użyjesz $/zamiast $a, to zadziała.
Dennis


3

Java: 127 109

Podstawowa iteracja, sprawdzająca zarówno negatywną, jak i pozytywną przed przejściem do następnego kandydata.

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

Dla danych wejściowych 123456789012345wraca -1358024do równego palindromu 123456787654321.

Podziały wierszy:

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

Czy n+i+""działa i zapisuje nawiasy? Myślę, że pierwszeństwo powinno być prawidłowe.
Peter Taylor

@PeterTaylor Yep, i otrzymałem jeszcze kilka od toString(). Dzięki :)
Geobits

1
Czy mogę ukraść to słodkie i=i<1?-i+1:-i? Nazwę to „niezdecydowaniem”.
Jacob

@Jacob Go for it;)
Geobits

3

Clojure, 92

Pobiera pierwszy z leniwej sekwencji, która działa od 0 na zewnątrz i zawiera tylko wartości, które tworzą palindromy:

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

Sesja 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

JavaScript, 175 136 117

Bezpośredni. pzwraca true, jeśli podaną liczbą jest palindrom, fwyszukuje najbliższy.

EDYCJA: Grałem też w golfa trochę bardziej dzięki słodkiej sztuczce „niezdecydowania” Geobitsa w odpowiedzi Java tutaj.

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}

Stosowanie:

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

104 w ES6: 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
Założę się, że jest. functioni returnsą strasznie długie zastrzeżone słowa ...
Jakub

1
Przepraszamy za opóźnienie 3-letniego, ale grałem do 68 w ES6: s=>{for(i=0;[...s+i+""].reverse().join``!=s+i;i=i<0?-i:~i);r‌​eturn i}. Podatne na przepełnienie stosu 61:f=(s,i=0)=>[...s+i+""].reverse().join``==s+i?i:f(s,i<0?-i:~i‌​)
Podatność na

2

J - 49 znaków

Funkcja mapująca liczby całkowite na liczby całkowite.

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

Oto, w jaki sposób możesz zbudować ten wynik w trzech częściach. Jest to wyświetlanie J REPL: wiersze wcięte są wprowadzane przez użytkownika, a wiersze nieobecne są wynikiem REPL. I tak, J zapisuje znak minus znakiem podkreślenia _.

   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

Przykłady:

   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

Możesz również sprawić, że golf woli preferować rozwiązanie pozytywne od negatywnego, gdy są równe, zmieniając _1 1 na 1 _1.


2

JavaScript 86

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

To jest moje pierwsze wyzwanie dla codegolfa. Mam nadzieję, że to rozwiązanie jest dopuszczalne.

niemodyfikowany: n => { s = (n + '').split(''); for (i = 0, j = s.length - 1; i < j; i++,j--) s[j] = s[i]; return s.join('') - n } Objaśnienie:
Konwertuj wejście n na String i podziel.
Iteruj po obu stronach wynikowej tablicy i kopiuj cyfry od s [i] do s [j], aż i <j. Spowoduje to nasz pożądany palindrom.
Ponownie połącz tablicę i odejmij n, aby uzyskać x


Witamy w PPCG! Ta odpowiedź ma odpowiednią strukturę (przesyłanie funkcji zwykle działa najlepiej w JavaScript) i wydaje się, że daje również prawidłowe odpowiedzi. Twój post może zostać ulepszony poprzez wyjaśnienie, dlaczego ten algorytm działa (nie jest dla mnie oczywiste, dlaczego tak działa), ale w tej chwili jest w porządku.

Dzięki, dodałem małe wyjaśnienie i wersję bez
golfa

możesz zmienić s=(n+'').split('')na s=[...(n+'')]. ogolić 5 bajtów
Brian H.

Myślałem w ten sam sposób, ale 19 wydaje się być pierwszym kontrprzykładem: f(19)=3ponieważ 22 jest najbliższą palindromią, ale funkcja zwraca -8 dla konwersji 19 na 11. btw [...n+'']będzie również działało dla dodatkowych -2 bajtów
Shieru Asakoto

2

JavaScript (ES6), 84 bajtów

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)

Moje pierwsze wyzwanie golfowe! Wiem, że krótsze i bardziej eleganckie rozwiązanie zostało już opublikowane przez @Brian H., ale jest to inne podejście.

Kod testowy


1
Witamy w PPCG!
Steadybox

2

Brachylog , 8 bajtów

;.≜+A↔A∧

Wypróbuj online!

Predykat etykiety jest tutaj niezbędny, ponieważ dzięki użyciu go na wyjściu, zanim wydarzy się cokolwiek innego (chociaż tak naprawdę jest wywoływany na liście zawierającej dane wejściowe i wyjściowe), jego wartość bezwzględna jest zminimalizowana, ponieważ zamiast robić mądrzejsze na podstawie ograniczenia program zgaduje każdą liczbę całkowitą, zaczynając od 0, aż znajdzie tę, która działa. Jeśli zostanie pominięty, w programie pojawia się informacja, że ​​0 jest bardzo ładnym palindromem i zawsze będzie wypisywać ujemną wartość wejściową.

            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

Groovy - 131 111 107 znaków

Gra w golfa:

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--}

przykładowe przebiegi:

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

Nie golfowany:

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

Python 2 - 76

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

Pobiera numer wejściowy i generuje listę różnic między danymi wejściowymi a każdą liczbą pomiędzy 0i 2*itylko wtedy, gdy liczba jest palindromiczna.

Następnie sortuje listę według wartości bezwzględnej i drukuje pierwszy element.


Nie sądzę, aby zakres (2 * i) działał dla dużych nakładów.
Moop

Możesz używać minargumentu słowa kluczowego zamiast sortowania.
xnor

Aby użyć tak długich zakresów, musisz przełączyć się na xrange, który jest generatorem, i min, który zwiera, aby uniknąć przekroczenia pamięci.
isaacg

1

C ++ 289

Funkcja P sprawdza palindromy za pomocą <algorithm>metody.

Nie golfowany:

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;
}

Krótsze będzie umieszczenie wszystkiego w jednym wierszu.
kot

1

Mathematica 75

Prawdopodobnie można grać w golfa więcej ..

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

Miejsca nie są liczone i nie są potrzebne.


1

CoffeeScript: 73

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

Objaśnienie: Wykorzystuje to fakt, że jeśli mamy liczbę nieparzystych długości (powiedzmy 1234567),x.slice(0, y) nie będzie zawierała środkowej cyfry, ale x.slice(0, -y)będzie. JavaScript sliceprawdopodobnie nie powinien działać w ten sposób, ale działa.

Spodziewałem się, że CoffeeScript / JavaScript będzie miał lepszy sposób na odwrócenie łańcucha, ale wydaje się, że metoda split / reverse / join jest wszystkim, co istnieje.


1

PHP, 56 bajtów

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

pobiera dane wejściowe z argumentu wiersza poleceń; biegać z -nr.


1

javascript 68 bajtów

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

OGROMNE rekwizyty dla @Beldraith dla algorytmu, ale zamieszczam to jako odpowiedź, ponieważ zajęło mi sporo czasu, aby uruchomić go w jednym poleceniu.

Wszelkie wskazówki są mile widziane;)

bez golfa

(
    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 mam nadzieję, że nie masz nic przeciwko, że przesyłam twoją odpowiedź do funkcji pojedynczej instrukcji, świetnie się przy tym bawiłem: D
Brian H.

Gra w golfa do 63: (n,s=[...n+''],j=s.length)=>s.map((v,i)=>i>--j?s[j]:v).join``-nale istnieje również nieoczywisty kontrprzykład (19);)
Shieru Asakoto

ouch, to nie tylko 19, to dowolna liczba, która kończy się na 9 i powinna uzyskać pozytywny wynik
Brian H.,

0

Python, 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)

powoduje to błąd podczas pracy (przekroczona maksymalna głębokość rekurencji)
Moop

To nie jest błąd w moim kodzie. Przekracza maksymalną głębokość rekurencji na dużej liczbie, ale działa na liczbach o odpowiedniej wielkości. Ponieważ w specyfikacjach nie było maksymalnego przypadku testowego, należy to nadal uważać za prawidłowe rozwiązanie.
RageCage

1
Liczba 123456789powoduje awarię, znacznie poniżej limitu 10 ^ 15 podanego w pytaniu.
Moop

1
Można łatwo zmienić rekurencję w pętlę i całkowicie uniknąć tego problemu
Moop

1
Uruchomienie tego w implementacji Python bez stosu powinno uniknąć problemu z głębokością rekurencji.
xnor

0

QBIC , 38 bajtów, nc

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

Wyjaśnienie:

Kod odczytuje dane wejściowe, a następnie stosuje modyfikator. Następnie sprawdza, czy modyfikator liczba + jest palindromem. Następnie włącza westchnienie modyfikatora, ponownie go stosuje i ponownie testuje.

:{        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

Bash, 73 bajty

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

Dane wejściowe przechodzą do argumentu pierwszego wiersza poleceń:

foo.sh 123456789

0

Axiom, 720 594 412 bajtów

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)

Liczba bajtów to znowu to, ale algo będzie to O (log (n)), ponieważ spadnie tylko od długości cyfr jego wejścia (a log10 (n) będzie w pobliżu długości cyfr dziesiętnych n ). niepoddane golfowi i wyniki

-- 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

Ci, którzy wypowiedzieli się ponownie (lub w celu całkowitego wyeliminowania), używali goto do języków komputerowych, dla mojego przyszłego programisty hobby: są niekompetentni w informatyce !!!!
RosLuP,

0

Łuska , 16 12 9 bajtów

ḟoS=↔+⁰İZ

Dzięki @ H.PWiz za -4 bajty!

Wypróbuj online!

Wyjaśnienie

ḟ(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 znaków

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

to powyższe wyszukiwanie, ale algo nie może być szybkie i właściwe, jak g poniżej ...

To

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

jest prostym wyjściem z pętli tylko wtedy, gdy znajdzie b≡⌽b, więc b jest palindromem łańcuchowym

  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 bajtów

nȥsw}cU

Spróbuj

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.