Palindrom der niedrigsten Basis


16

Bei einer Zahl n, schreiben Sie eine Funktion, die die kleinste Basis findet , b ≥ 2so dass nein Palindrom in der Basis ist b. Beispielsweise sollte eine Eingabe von 28die Basis zurückgeben, 3da die ternäre Darstellung von 28 1001 ist. Obwohl 93sowohl in Basis 2 als auch in Basis 5 ein Palindrom vorliegt , sollte die Ausgabe 22 <5 sein.

Eingang

Eine positive ganze Zahl n < 2^31.

Ausgabe

Geben Sie die kleinste Basis zurück b ≥ 2, sodass die Basisdarstellung bvon nein Palindrom ist. Nehmen Sie keine führenden Nullen an.

Beispiele (Eingabe => Ausgabe):

11 => 10

32 => 7

59 => 4

111 => 6

Regeln

Der kürzeste Code gewinnt.


1
Ich denke, die Basis sollte begrenzt sein.
Snack

3
@ Snack: Was ist das Problem mit höheren Basen? Unabhängig von der Auswahl der Symbole ist eine Basis-1000-Zahl entweder ein Palindrom oder nicht.
Dennis

3
Interessante Anekdote: n in der Basis n-1 ist immer 11 für n> = 2 und somit ist immer ein Palindrom möglich.
Cruncher

1
@Cruncher: nkann 1 sein und 2 ist kein Base 1 Palindrom. Jedes Positiv nist jedoch ein n + 1Basenpalindrom.
Dennis

1
@ Tennis Wie ist 2 kein Base-1-Palindrom? Es ist 11. Oder II oder 2 von jedem Symbol, das Sie verwenden. Tatsächlich sind alle Zahlen der Basis 1 Palindrome. Und ich sagte n> = 2, weil ich nicht weiß, was auf der Erde Basis 0 wäre.
Cruncher

Antworten:


4

CJam , 19 Bytes / GolfScript, 23 Bytes

q~:N;1{)_N\b_W%=!}g

oder

~:N;1{).N\base.-1%=!}do

Probieren Sie es online aus:

Beispiele

$ cjam base.cjam <<< 11; echo
10
$ cjam base.cjam <<< 111; echo
6
$ golfscript base.gs <<< 11
10
$ golfscript base.gs <<< 111
6

Wie es funktioniert

q~:N;   # Read the entire input, interpret it and save the result in “N”.
1       # Push 1 (“b”).
{       #
  )     # Increment “b”.
  _N\   # Duplicate “b”, push “N” and swap.
  b     # Push the array of digits of “N” in base “b”.
  _W%   # Duplicate the array and reverse it.
  =!    # Compare the arrays.
}g      # If they're not equal, repeat the loop.

Für GolfScript q~ist ~, _ist ., bist base, Wist -1und gist do.


6

GolfScript, 20 Zeichen

~:x,2>{x\base.-1%=}?

Ein anderer Ansatz mit GolfScript als mit Dennis . Es vermeidet die teure explizite Schleife für eine Entdeckung Betreiber. Versuchen Sie es online .

~:x        # interpret and save input to variable x
,2>        # make a candidate list 2 ... x-1 (note x-1 is the maximum possible base)
{          # {}? find the item on which the code block yields true
  x\       # push x under the item under investigation
  base     # perform a base conversion
  .-1%     # make a copy and reverse it
  =        # compare reversed copy and original array
}?         

1
Klug! Dies funktioniert jedoch nicht, wenn x = 1oder x = 2. Beide sind einstellige Basis- x + 1Palindrome und x))sollten daher behoben werden.
Dennis

4

Mathematica, 67 66 Bytes

g[n_]:=For[i=1,1>0,If[(d=n~IntegerDigits~++i)==Reverse@d,Break@i]]

Ich kann hier nicht wirklich mit GolfScript in Bezug auf die Codegröße mithalten, aber das Ergebnis für 2 32 wird im Grunde sofort zurückgegeben.


Nett. Die Funktion muss aber nicht benannt werden, oder? Könnten Sie einfach eine unbenannte Funktion verwenden?
numbermaniac

( PalindromeQ
Ist

4

Japt , 12 9 Bytes

Sofern ich keinen Trick verpasst habe (es ist spät!), Sollte dies für alle Zahlen bis und mit mindestens funktionieren 2**53-1.

Bei meinen (zugegebenermaßen eingeschränkten und völlig zufälligen) Tests habe ich die bisherigen Ergebnisse auf Basis (!) Gebracht. Nicht schäbig , wenn man bedenkt JavaScript nur nativ unterstützt Basen zu .11601 310,515236

@ìX êê}a2

Versuch es

  • Dank an die ETH für den Hinweis auf etwas Neues, das 3 Bytes gespart und die Effizienz erheblich gesteigert hat.

Erläuterung

Implizite Eingabe einer Ganzzahl U.

@     }a2

Beginnen Sie mit 2, und geben Sie die erste Zahl zurück, die true zurückgibt, wenn Sie die folgende Funktion durchlaufen. Dabei handelt Xes sich um die aktuelle Zahl

ìX

In Uein Array von Basisziffern konvertieren X.

êê

Testen Sie, ob dieses Array ein Palindrom ist.


1) ja Gib dem Bier die Schuld dafür! : D 2) Schön; Ich wusste nie, dass N.ì(n)ich mit Basen besser umgehen kann als 36. Dank dafür.
Shaggy

Ja, das Base-36-Alphabet spielt keine Rolle, N.ì(n)da wir rohe Ganzzahlen verwenden ;-)
ETHproductions

2

Python 2 (83)

def f(n,b=2):
 l=[];m=n
 while m:l+=[m%b];m//=b
 return l==l[::-1]and b or f(n,b+1)

Ich bin nicht sicher, welches Eingabe- / Ausgabeformat die Frage haben wollte. Ich habe eine Funktion geschrieben. Der Code verwendet eine optionale Eingabe b, um die aktuelle Basis zu verfolgen, die getestet wird. Die whileSchleifen wandeln die Zahl in eine Liste von Stellen in der Basis um b.

Die letzte Zeile wird zurückgegeben, bwenn les sich um ein Palindrom handelt, und die nächste Zeile wird rekursiv ausprobiert b. Der Boolesche Index-Trick funktioniert hier nicht, da dadurch beide Optionen unabhängig vom Booleschen Wert ausgewertet werden und die Rekursion niemals einen Tiefpunkt erreicht.


1
Das funktioniert also nicht mit willkürlich hohen Basen, oder? Wenn die niedrigste Basis, auf der eine Zahl ein Palindrom hat, 10000 ist, kommt es dann zu einem Stapelüberlauf?
Cruncher

@Cruncher Kommt auf die Implementierung von Python an. Es wird überlaufen, wenn es mit CPython ausgeführt wird, aber nicht mit Stackless Python , das die Tail-Call-Optimierung durchführt und daher keine Rekursionsgrenze hat (obwohl ich es nicht wirklich getestet habe).
xnor

2

JavaScript, 88 Bytes

f=function(n){for(a=b='+1';a^a.split('').reverse().join('');a=n.toString(++b));return+b}

Ungolfed:

f = function(n) {
    for(a = b = '+1'; // This is not palindrome, but equals 1 so we have at least one iteration
        a ^ a.split('').reverse().join(''); // test a is palindrome
        a = n.toString(++b));
    return+b
}

1

Javascript, 105 Bytes

function f(n){for(var b=2,c,d;d=[];++b){for(c=n;c;c=c/b^0)d.push(c%b);if(d.join()==d.reverse())return b}}

JSFiddle: http://jsfiddle.net/wR4Wf/1/

Beachten Sie, dass diese Implementierung auch für große Basen korrekt funktioniert. Beispielsweise wird f(10014)1668 zurückgegeben (10014 ist 66 in Basis 1668).


Das ist nett. Sie können sogar s/var b=2,c,d/b=d=2/6 weitere Bytes gewinnen;)
Core1024

1

Bash + Coreutils, 100 Bytes

for((b=1;b++<=$1;)){
p=`dc<<<${b}o$1p`
c=tac
((b<17))&&c=rev
[ "$p" = "`$c<<<$p`" ]&&echo $b&&exit
}

Verwendet dcdie Basisformatierung. Das Schwierige ist dc, dass sich das Format für n> 16 unterscheidet.

Testfälle:

$ ./lowestbasepalindrome.sh 11
10
$ ./lowestbasepalindrome.sh 32
7
$ ./lowestbasepalindrome.sh 59
4
$ ./lowestbasepalindrome.sh 111
6
$ 

1

J - 28 Zeichen

#.inv~(-.@-:|.@)(1+]^:)^:_&2

Erklärt:

  • #.inv~ - Erweitern Sie das linke Argument bis zur Basis im rechten Argument.

  • (-.@-:|.@) - Geben Sie 0 zurück, wenn die Erweiterung palindrom ist, und 1, wenn dies nicht der Fall ist.

  • (1+]^:) - Erhöhen Sie das richtige Argument um eins, wenn wir 1 zurückgegeben haben, andernfalls wird keine Aktion ausgeführt.

  • ^:_ - Wiederholen Sie die obigen Schritte, bis keine Aktion mehr ausgeführt wird.

  • &2 - Bereiten Sie das richtige Argument als 2 vor und machen Sie dies zu einer Funktion eines Arguments.

Beispiele:

   #.inv~(-.@-:|.@)(1+]^:)^:_&2 (28)
3
   #.inv~(-.@-:|.@)(1+]^:)^:_&2 every 93 11 32 59 111  NB. perform on every item
2 10 7 4 6
   #.inv~(-.@-:|.@)(1+]^:)^:_&2 every 1234 2345 3456 4567 5678 6789
22 16 11 21 31 92

2+1 i.~[#.inv"*(-:|.@)~2+i.für 27 Bytes. (Ich möchte es nicht separat veröffentlichen. Ich lasse es einfach hier.)
randomra

@randomra Ich würde das als 29 zählen, weil Züge Parens benötigen, um inline verwendet zu werden; meins rettet einen Charakter, indem es eine Konjunktion auf der obersten Ebene hat.
Algorithmushai

Ich denke, dass die Mehrheit in Bezug auf das Scoring das parenlose Zählen mit einer unbenannten Funktion ist, obwohl es immer ein Argument dafür gibt. Wie auch immer, ich werde es hier lassen und jeder kann wählen, wie er / sie es bewertet. :)
randomra

1

R 122 95 Bytes

function(n)(2:n)[sapply(2:n,function(x){r={};while(n){r=c(n%%x,r);n=n%/%x};all(r==rev(r))})][1]

Drei Jahre alte Lösung mit 122 Bytes:

f=function(n)(2:n)[sapply(sapply(2:n,function(x){r=NULL;while(n){r=c(n%%x,r);n=n%/%x};r}),function(x)all(x==rev(x)))][1]

Mit einigen Erklärungen:

f=function(n)(2:n)[sapply(
                    sapply(2:n,function(x){ #Return the decomposition of n in bases 2 to n
                                 r=NULL
                                 while(n){
                                     r=c(n%%x,r)
                                     n=n%/%x}
                                     r
                                     }
                           ),
                    function(x)all(x==rev(x))) #Check if palindrome
                   ][1] #Return the first (i. e. smallest) for which it is

1

Schale , 11 9 Bytes

ḟoS=↔`B⁰2

Danke @Zgarb für -2!

Probieren Sie es online!

Erläuterung

ḟ(      )2  -- find least number ≥ 2 that satisfies:
     `B⁰    --   convert input to base (` flips arguments)
  S=↔       --   is palindrome (x == ↔x)


0

Scala, 83 Bytes

def s(n:Int)=(for(b<-2 to n;x=Integer.toString(n,b);if(x==x.reverse))yield(b)).min



0

JavaScript 72 Bytes

F=(n,b=2)=>eval(`for(t=n,a=c="";t;t=t/b|0)a=t%b+a,c+=t%b`)^a?F(n,b+1):b

console.log(F(11) == 10)

console.log(F(32) == 7)

console.log(F(59) == 4)

console.log(F(111) == 6)


0

Mathematica 42 Bytes

Eine Variation von Martin Enders Beitrag. Nutzt IntegerReverse(in Version 10.3 verfügbar gemacht) das auf IntegerDigits.

(i=2;While[#~IntegerReverse~i !=#,i++];i)&

0

Java 8, 103 Bytes

n->{int b=1,l;for(String s;!(s=n.toString(n,++b)).equals(new StringBuffer(s).reverse()+""););return b;}

Erläuterung:

Probieren Sie es hier aus.

n->{                          // Method with integer as both parameter and return-type
  int b=1,                    //  Base-integer, starting at 1
      l;                      //  Length temp integer
  for(String s;               //  Temp String
      !(s=n.toString(n,++b))  //   Set the String to `n` in base `b+1`
                              //   (by first increase `b` by 1 using `++b`)
       .equals(new StringBuffer(s).reverse()+"");
                              //   And continue looping as long as it's not a palindrome
  );                          //  End of loop
  return b;                   //  Return the resulting base integer
}                             // End of method
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.