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.