| Bytes | Lang | Time | Link |
|---|---|---|---|
| 053 | Ruby | 221123T180911Z | Jordan |
| 162 | APLNARS | 250903T003022Z | Rosario |
| 051 | Julia 1.0 | 250902T095910Z | MarcMush |
| 006 | Vyxal | 250901T144056Z | lyxal |
| 023 | Ly | 221124T013718Z | cnamejj |
| 045 | Raku | 221123T202537Z | Sean |
| 085 | C clang | 220616T052801Z | c-- |
| 008 | Japt | 190410T234720Z | Shaggy |
| 054 | Python 2 | 190410T214731Z | ArBo |
| 008 | Brachylog | 190410T090500Z | Unrelate |
| 047 | APL NARS | 171217T063710Z | user5898 |
| 009 | Husk | 171207T001813Z | ბიმო |
| 141 | 05AB1E | 171122T182517Z | Magic Oc |
| 084 | JavaScript ES6 | 171123T214238Z | yetirs |
| 412 | Axiom | 171121T085803Z | user5898 |
| 068 | javascript | 171121T132057Z | Brian H. |
| 073 | Bash | 171121T123635Z | iBug |
| 056 | PHP | 170223T191128Z | Titus |
| 038 | QBIC | 170223T175055Z | steenber |
| 086 | Javascript | 170223T122929Z | Beldrait |
| 109 | Python | 140827T145851Z | RageCage |
| 073 | CoffeeScript | 140828T223153Z | Justin M |
| 049 | J | 140829T032340Z | algorith |
| 044 | Perl 5 | 140828T034622Z | user0721 |
| 075 | Mathematica | 140828T223007Z | freddiek |
| 289 | C++ | 140828T193605Z | bacchusb |
| 020 | Pyth | 140827T134148Z | izzyg |
| 117 | JavaScript | 140827T134315Z | Jacob |
| 062 | Haskell | 140827T153919Z | Ray |
| 025 | CJam | 140827T162924Z | Dennis |
| 092 | Clojure | 140827T231342Z | Yosemite |
| 076 | Python 2 | 140827T194049Z | BeetDemG |
| 109 | Java | 140827T142820Z | Geobits |
| 107 | Groovy | 140827T182503Z | Michael |
| 081 | Python 2.7 | 140827T153222Z | Moop |
| 084 | Ruby | 140827T135228Z | Martin E |
Ruby, 53 bytes
Port of ArBo's Python 2 answer.
-8 bytes thanks to Value Ink
F=->n,d=0{s="#{n+d}"
s!=s.reverse ? F[n,d<0?-d:~d]:d}
APL(NARS), 162 chars
fm←{k←(t←⌊2÷⍨≢w)↑w←⍕⍵⋄2∣≢w:k,w[t+1],⌽k⋄k,⌽k}⋄fp←{k←(t←⌊2÷⍨≢w)↑w←⍕⍵⋄2∣≢w:k,⌽¯1↓k⊣k←⍕1+⍎k,w[t+1],'x'⋄k,⌽k←⍕1+⍎k,'x'}⋄g←{a←⍵-⍨⍎(fm⍵),'x'⋄b←⍵-⍨⍎(fp⍵),'x'⋄(∣b)>∣a:a⋄b}
fm and fp has as input one number a, and return both one chars palidrome build on a, in the way (⍎fm a)<⍎fp a and a<⍎fp a. This seems ok on test but something could be not ok (for the series "prove me wrong").
g 3
0
g 234
¯2
g 1299931
¯10
g 126
5
g 123456789787282716763526581672816526718636721568362516283625618267x
91557548903799254766504362036054
123456789787282716763526581672816526718636721568362516283625618267x+91557548903799254766504362036054x
123456789787282716763526581672816618276185625367617282787987654321
Vyxal, 6 bytes
?+Ḃ=)N
Single character modification of my answer here lol.
Explained
?+Ḃ=)N
)N # Find the first X where:
?+ # N + X
= # equals
Ḃ # it's reverse
💎
Created with the help of Luminespire.
Ly, 23 bytes
n:[s>lSrJl=[<f-u;]pp<`]
At a high level, this one keeps the original number on the stack, then increments a value on the backup cell for the "is this a palindrome?" test. That test is done one a separate stack using a simple "convert number to digits", reverse the stack, "convert digits to number" check.
n: - get the input number, make a copy we can increment
[ ] - infinite loop, the code exit once it finds the answer
s>l - save the current candidate, switch stacks and load it
SrJ - convert to digits, reverse, convert back to a number
l= - re-load the candidate and compare
[ ] - codeblock used if they match (is palindrome)
< - switch back to the main stack
f- - flip the top two and subtract to get the offset
u; - print as a number and exit
pp - delete stack
<` - switch back to main stack and increment candidate
Raku, 45 bytes
{($_,{++$*($*=-1)+$_}...{$_==.flip})[*-1]-$_}
$_, { ... } ... { ... }defines a sequence that starts with the input argument$_.- The first set of braces
{ ++$ * ($ *= -1) + $_ }generates each term of the sequence from the previous one. It uses two anonymous state variables, both written as$. The first one increments on each call to the block, and the other alternates between -1 and +1. Multiplying them together and adding to the previous element gives the sequence$_, $_ + 1, $_ - 1, $_ + 2, $_ - 2, .... - The second set of braces
{ $_ == .flip }is the terminating condition, met by the first number which is equal to itself with the digits flipped (reversed). [* - 1]picks the last element of the sequence (the palindromic one).- $_subtracts the input element to give the required difference.
C (clang), 85 bytes
f(n,x,y,z){for(x=0;z=n+x;x=(1>x)-x){for(y=0;z;z/=10)y=y*10+z%10;if(y==n+x)return x;}}
This turned out to be a port of isaacg's Pyth solution.
Japt, 8 bytes
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
Brachylog, 8 bytes
;.≜+A↔A∧
The label predicate ≜ is vital here, because by using it on the output before anything else happens (although it's really being invoked on the list containing the input and the output), its absolute value is minimized, because instead of doing anything smarter based on the constraints the program guesses every integer starting from 0 until it can find one that works. If ≜ is omitted, it dawns on the program that 0 is a very nice palindrome, and it will always output the negative of the input.
The input
; + plus
. the output
≜ which is instantiated immediately
A is A
↔ which reversed
A is still A
∧ but isn't necessarily the output.
APL NARS 47 chars
r←s a;b
r←0
A:b←⍕a+r⋄→0×⍳b≡⌽b⋄r←-r⋄→A×⍳r<0⋄r+←1⋄→A
this above search but algo can not be fast and right as the g below...
This
A:b←⍕a+r⋄→0×⍳b≡⌽b⋄r←-r⋄→A×⍳r<0⋄r+←1⋄→A
is a simple loop exit only when it find b≡⌽b so b is a string palindrome
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
Husk, 16 12 9 bytes
ḟoS=↔+⁰İZ
Thanks @H.PWiz for -4 bytes!
Explanation
ḟ(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
05AB1E, 15 14 bytes (-1 Thanks to Emigna)
2äнsgÈi∞ë.∞}s-
Method:
- Take the first half of the number.
- Mirror it intersected if odd, non-intersected if even.
- Difference.
JavaScript (ES6), 84 bytes
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)
My first golf challenge! I know the shorter and more elegant solution has already been posted by @Brian H., but this is another approach.
Test Code
const t =
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)
;
console.log('t(3) =', t(3)); // expected: 0
console.log('t(234) =', t(234)); // expected: -2
console.log('t(1299931) =', t(1299931)); // expected: -10
console.log('t(126) =', t(126)); // expected: -5
Axiom, 720 594 412 bytes
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)
The byte count it is again this, but the algo it would be O(log(n)) because it would dipend only from the digit lenght of its input (and log10(n) would be near the lenght of the decimal digits of n). ungolfed and results
-- 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
javascript 68 bytes
(n,s=[...(''+n)],j=s.length)=>s.map((v,i,)=>i>--j?s[j]:v).join('')-n
HUGE props to @Beldraith for the algorithm, i'm posting this as an answer though, because it took me quite the time to get it to work in a single statement.
Any tips are welcome ;)
ungolfed
(
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
Bash, 73 bytes
i=$1;x=$i;while((x-10#$(rev<<<$x)));do ((r=(1>r)-r,x=r+i));done;echo $x
Input goes to the 1st command line argument:
foo.sh 123456789
PHP, 56 bytes
for(;strrev($i+$n=$argv[1])-$n-$i;$i=($i<1)-$i);echo+$i;
takes input from command line argument; run with -nr.
QBIC, 38 bytes, nc
:{[-1,1,2|A=!a+b*c$~A=_fA||_xb*c]c=c+1
Explanation:
The code reads an input, and then applies a modifier. It then tests to see if the number + modifier is a palindrome. Then, it flips the sigh on the modifier, re-applies that and tests again.
:{ 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
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}
This is my first codegolf challenge. Hope this solution is acceptable.
ungolfed:
n => {
s = (n + '').split('');
for (i = 0, j = s.length - 1; i < j; i++,j--)
s[j] = s[i];
return s.join('') - n
}
Explanation:
Convert input n to String and split.
Iterate over both sides of the resulting array and copy digit on s[i] to s[j] until i < j. This will result in our desired palindrome.
Join array back together and subtract n to get x
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)
CoffeeScript: 73
(x)->(x+="")[0...(y=x.length/2)]+x[0...-y].split("").reverse().join("")-x
Explanation:
This takes advantage of the fact that if we have a number of odd length (say 1234567), x.slice(0, y) won't include the middle digit but x.slice(0, -y) will. JavaScript's slice probably shouldn't work this way, but it does.
I was expecting CoffeeScript/JavaScript to have a better way to reverse a string, but the split/reverse/join method seems to be all there is.
J - 49 char
A function mapping integers to integers.
((0{g#f)>:@]^:(+:/@g=.(-:|.)@":@+f=._1 1*])^:_&0)
Here's how you might build to this result, in three parts. This is the display of the J REPL: indented lines are user input and outdented ones are REPL output. And yes, J spells the negative sign with an underscore _.
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
Examples:
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
You can also make the golf prefer the positive solution over the negative when they're equal, by changing _1 1 to 1 _1.
Perl 5, 93 89 88 87 75 63 44
$/=($/<1)-$/while$_+$/-reverse$_+$/;$_=$/+0
Ungolfed:
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
Thanks to Dennis's suggestions, got it down to 43 + -p = 44
Mathematica 75
Probably can be golfed more..
p = (j=0; b=#; While[a=IntegerDigits[b]; b += ++j(-1)^j; a!=Reverse[a]]; #-b+(-1)^j) &
Spaces not counted and not needed.
C++ 289
Function P checks for palindromes using <algorithm> method.
Ungolfed:
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;
}
Pyth, 26 20
Lnb_bWP`+QZ=Z-g0ZZ)Z
Updated to meet the new rules.
The program runs in an infinite loop which tests every possible increment, in the order 0, -1, 1, -2, -2 ...
Explanation:
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)
Example run:
python3 pyth.py programs/palin.pyth <<< 965376457643450
-2969881
This took 23 seconds.
Bonus solution, same character count:
Wn`+QZ_`+QZ=Z-g0ZZ)Z
JavaScript, 175 136 117
Straightforward. p returns true if a given number is palindrome, f searches the nearest.
EDIT: I also golfed it a little bit more thanks to the sweet "indecrement" trick by Geobits in the Java answer here.
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}
Usage:
f(3)
f(234)
f(1299931)
Haskell - 62
f n=[x-n|x<-[0..]>>= \v->[n+v,n-v],show x==(reverse.show)x]!!0
Save it to a file named golf.hs and then test it with 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>
CJam, 34 29 25 bytes
q~:I!{:R1<R-RI+`_W%=!}g;R
Examples
$ cjam palfind.cjam <<< 120; echo
1
$ cjam palfind.cjam <<< 121; echo
0
$ cjam palfind.cjam <<< 122; echo
-1
How it works
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”. ";
Clojure, 92
Takes the first from a lazy for-sequence that works from 0 out and only includes values that make palindromes:
(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 session:
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
Python 2 - 76
i=input()
print sorted([r-i for r in range(2*i)if`r`==`r`[::-1]],key=abs)[0]
Gets the input number and generates a list of the differences between the input and every number between 0 and 2*i only if the number is palindromic.
It then sorts the list by absolute value and prints the first element.
Java : 127 109
Basic iteration, checking both negative and positive before moving to the next candidate.
int p(long n){int i=0;for(;!(n+i+"").equals(new StringBuilder(n+i+"").reverse()+"");i=i<1?-i+1:-i);return i;}
For input 123456789012345, it returns -1358024, to equal palindrome 123456787654321.
Line breaks:
int p(long n){
int i=0;
for(;!(n+i+"").equals(new StringBuilder(n+i+"").reverse()+"");i=i<1?-i+1:-i);
return i;
}
Groovy - 131 111 107 chars
Golfed:
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--}
sample runs:
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
Ungolfed:
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--
}
Python 2.7, 98, 81
Creates a palindrome from the input number, then subtracts that from the input to find the delta.
def f(n):
m=map(int,str(n));l=len(m)/2;m[-l:]=m[l-1::-1];return int(`m`[1::3])-n
usage:
print f(3) # 0
print f(234) # -2
print f(2342) # -10
print f(129931) # -10
print f(100000) # 1
ungolfed and annotated:
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
Ruby, 111 84 bytes
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]}
Takes the number as its only command-line argument.