Bestimmen Sie, ob eine Ganzzahl ein Palindrom in einem bestimmten Radix (Basis) ist.

11

Schreiben Sie ein Programm, das aus zwei Ganzzahlen liest, wobei jede neue Zeile beendet wird, im Folgenden "number" und "radix" genannt, und:

  1. Druckt jede feste Nachricht , die Sie wollen , wenn die Zahl ein Palindrom in diesem radix (zB true, t, 1)
  2. Druckt jede andere feste Nachricht , die Sie wollen , wenn die Nummer nicht ein Palindrom in diesem radix (zB false, f, 0, etc.)
  3. Diese Meldungen müssen für jeden Lauf gleich sein, es gibt jedoch keine Regeln dafür, was sie sein müssen (was auch immer für das Golfen am besten ist).
  4. Sie können davon ausgehen, dass die Eingabe gültig ist, zwei positive ganze Zahlen. "Anzahl" wird nicht überschreiten 2147483647, "Radix" wird nicht überschreiten 32767.
  5. Sie dürfen keine externen Ressourcen verwenden, aber Sie können jede mathematische Funktion verwenden, die standardmäßig in Ihrer Sprache enthalten ist.

Hinweis: Ein Radix ist nur die Basis der Zahl.

Probeläufe:

16
10
false

16
3
true

16
20
true

121
10
true

5
5
false

12346
12345
true

16781313
64
true

16781313
16
true
durron597
quelle
Hinweis: Ein Radix ist nur die Basis der Zahl.
Sieht jetzt gut aus. Möglicherweise möchten Sie jedoch externe Ressourcen sperren.
@ user2509848 hmmm zum Beispiel?
Durron597
Wenn eine Person im Internet einen Taschenrechner findet, der Zahlen zwischen Basen konvertiert, wird er mit ziemlicher Sicherheit verwendet. Wir haben in letzter Zeit eine Menge Trolly-Antworten erhalten.
Kann eine der festen Nachrichten die leere Zeichenfolge sein (vorausgesetzt, die andere ist eine nicht leere Zeichenfolge)?
Toby Speight

Antworten:

5

Doppelmerkmal J (23 Zeichen) und K (19 Zeichen)

Die beiden Sprachen sind sowohl im Allgemeinen als auch in diesem speziellen Golf sehr ähnlich. Hier ist das J:

(-:|.)#.^:_1~/".1!:1,~1
  • ,~1- Hängen Sie die Nummer 1 an sich selbst an und erstellen Sie das Array 1 1.
  • 1!:1- Lesen Sie zwei Zeichenfolgen von der Tastatur ein ( 1!:1ist zu lesen und 1ist das Dateihandle / die Nummer für die Tastatureingabe).
  • ". - Konvertieren Sie jede Zeichenfolge in eine Zahl.
  • #.^:_1~/- F~/ x,ybedeutet zu finden y F x. Unser Fist #.^:_1, das die Basiserweiterung durchführt.
  • (-:|.)- Entspricht das Argument ( -:) seiner Umkehrung ( |.)? 1für ja, 0für nein.

Und hier ist das K:

a~|a:_vs/|.:'0::'``
  • 0::'``- Lesen Sie ( 0::) eine Zeichenfolge für jede ( ') Zeile von der Konsole ein ( `ist das Dateihandle dafür).
  • .:'- Konvertieren Sie ( .:) jede ( ') Zeichenfolge in eine Zahl.
  • _vs/|- Kehren Sie das Zahlenpaar um, so dass der Radix vor der Zahl liegt, und fügen Sie dann ( /) die Basiserweiterungsfunktion _vs("Vektor vom Skalar") zwischen ihnen ein.
  • a~|a:- Weisen Sie diese resultierende Erweiterung zu aund prüfen Sie, ob sie amit ( ~) umgekehrt ( |) übereinstimmt . Wieder 1für ja, 0für nein.
Algorithmushai
quelle
@ ak82 Ich glaube, es ist auf diese Weise interessanter
John Dvorak
8

GolfScript, 10 Zeichen

~base.-1%=

Für GolfScript ist das einfach, wenn wir es auf einfache Weise tun. Die Ausgabe ist 0/ 1für false / true.

~       # Take input and evaluate it (stack: num rdx)
base    # Fortunately the stack is in the correct order for
        # a base transformation (stack: b[])
.       # Duplicate top of stack (stack: b[] b[])
-1%     # Reverse array (stack: b[] brev[])
=       # Compare the elements
Howard
quelle
3

APL (20)

⎕{≡∘⌽⍨⍵⊤⍨⍺/⍨⌊1+⍺⍟⍵}⎕

Ausgänge 0oder 1zB:

      ⎕{≡∘⌽⍨⍵⊤⍨⍺/⍨⌊1+⍺⍟⍵}⎕
⎕:
      5
⎕:
      5
0
      ⎕{≡∘⌽⍨⍵⊤⍨⍺/⍨⌊1+⍺⍟⍵}⎕
⎕:
      16781313
⎕:
      64
1

Erläuterung:

  • ⎕{... }⎕: zwei Zahlen lesen, an die Funktion übergeben. ist die erste Nummer und ist die zweite Nummer.
  • ⌊1+⍺⍟⍵: floor(1+⍺ log ⍵), Anzahl der Stellen, die zur Darstellung in der Basis erforderlich sind .
  • ⍺/⍨: die Basis für jede Ziffer, also repliziert durch die gerade berechnete Zahl.
  • ⍵⊤⍨: in der angegebenen Basis darstellen (unter Verwendung von Zahlen, damit es für alle Werte von funktioniert ).
  • ≡∘⌽⍨: Überprüfen Sie, ob das Ergebnis der Umkehrung entspricht.
Marinus
quelle
3

Perl, 82 77 73 69 Bytes

$==<>;$.=<>;push(@a,$=%$.),$=/=$.while$=;@b=reverse@a;print@a~~@b?1:0

Die Eingabenummern werden als Eingabezeilen von STDIN erwartet und das Ergebnis wird als 1oder geschrieben 0, wobei die erstere bedeutet, dass die erste Zahl ein Palindrom in ihrer Darstellung der gegebenen Basis ist.

Bearbeiten 1: Mit $=spart einige Bytes, da es intern in int konvertiert wird.

Bearbeiten 2: Der Smartmatch-Operator ~~vergleicht die Array-Elemente direkt, sodass die Konvertierung in eine Zeichenfolge nicht erforderlich ist.

Edit 3: Optimierung durch Entfernen einer unnötigen Variablen.

65 Bytes : Wenn die leere Zeichenfolge als Ausgabe für zulässig ist false, können die letzten vier Bytes entfernt werden.

Ungolfed Version

$= = <>;
$. = <>;
while ($=) {
    push(@a, $= % $.);
    $= /= $.; # implicit int conversion by $=
}
@b = reverse @a;
print (@a ~~ @b) ? 1 : 0

Der Algorithmus speichert die Ziffern der konvertierten Zahl in einem Array @a. Dann wird die Zeichenfolgendarstellung dieses Arrays in umgekehrter Reihenfolge mit dem Array verglichen. Leerzeichen trennen die Ziffern.

Heiko Oberdiek
quelle
Sorry, meine Antwort ist wirklich der gleiche Ansatz, aber mit $=lassen Sie intSchritt peitschen ... Und Frage stehen für anything you wantso nichts könnte sein, was Sie wollen ;-)
F. Hauri
@ F.Hauri: Danke, ich werde aktualisieren. $=wird in dieser Antwort auch als Tipp auf die Frage "Tipps zum Golfen in Perl" gegeben . Die Rücksendung 0kostet 6 zusätzliche Bytes, aber ich hatte den Eindruck, dass eine feste Nachricht nicht leer sein soll.
Heiko Oberdiek
Hem ,, Return 0 kostet 4 zusätzliche Bytes, nicht 6. Aber ich behaupte: ist alles! silence
F. Hauri
@ F.Hauri: Ja, 4 ist richtig, die zusätzlichen zwei Bytes waren die Klammern der ungolfed Version.
Heiko Oberdiek
2

Javascript 87

function f(n,b){for(a=[];n;n=(n-r)/b)a.push(r=n%b);return a.join()==a.reverse().join()}

nArgument ist die Zahl, bArgument ist der Radix.

Michael M.
quelle
2

Salbei, 45

Wird in der interaktiven Eingabeaufforderung ausgeführt

A=Integer(input()).digits(input())
A==A[::-1]

Druckt, Truewenn es sich um ein Palindrom handelt, druckt Falseanders

user12205
quelle
2

Perl 54 56 62

$==<>;$-=<>;while($=){$_.=$/.chr$=%$-+50;$=/=$-}say$_==reverse

Getestet werden:

for a in $'16\n3' $'16\n10' $'12346\n12345' $'12346\n12346' $'21\n11' $'170\n16';do
    perl -E <<<"$a" ' 
        $==<>;$-=<>;while($=){$_.=$/.chr$=%$-+50;$=/=$-}say$_==reverse
    '
  done

wird geben:

1

1


1

Also diese Ausgabe 1für den trueFall, dass ein Palindrom gefunden wird und nichts anderes.

Ungolfing:

$==<>;                            # Stdin to `$=`  (value)
$-=<>;                            # Stdin to `$-`  (radix)
while ( $= ) {
    $_.= $/. chr ( $= % $- +50 ); # Add *separator*+ chr from next modulo to radix to `$_`
    $=/= $-                       # Divide value by radix
}
say $_ == reverse                 # Return test result

Nota :

  • $_ ist der aktuelle Zeilenpuffer und zu Beginn leer.
  • $=ist eine reservierte Variable, die ursprünglich für den Zeilendruck verwendet wird. Dies ist ein Zeilenzähler. Diese Variable ist also eine Ganzzahl . Jede Berechnung dazu würde zu einer abgeschnittenen Ganzzahl führen, wie wenn sie int()verwendet würde.
  • $- wurde zum Spaß verwendet, nur um keine traditionellen Buchstaben zu verwenden ... (etwas mehr Verschleierung) ...
F. Hauri
quelle
Zur Verdeutlichung sagt dies nichts aus, wenn es kein Palindrom ist, und 1, wenn es ist?
Durron597
1
Schöne Tricks. Jedoch falsch positiv: 21 mit Basis 11. Die Ziffern benötigen ein Trennzeichen im Zeichenfolgenvergleich.
Heiko Oberdiek
Aaaarg +3! @ HeikoOberdiek Sie haben Recht für ...
F. Hauri
@ F.Hauri: Auch die Ziffern werden vertauscht. Somit ist 170 mit der Basis 16 0xAA, ein Palindrom, aber das Ergebnis ist falsch.
Heiko Oberdiek
Aaarg +6! Umwandlung in Zeichen ...
F. Hauri
1

Mathematica 77 43

IntegerDigits[n,b]repräsentiert n als eine Liste von Ziffern in Basis b. Jede Basis-b-Ziffer wird dezimal ausgedrückt.

Zum Beispiel ist 16781313 kein Palindrom in Basis 17:

IntegerDigits[16781313, 17]

{11, 13, 15, 11, 14, 1}

Es ist jedoch ein Palindrom in Basis 16:

IntegerDigits[16781313, 16]

{1, 0, 0, 1, 0, 0, 1}


Wenn die geordneten Paare in den obigen Beispielen eingegeben wurden,

(x=Input[]~IntegerDigits~Input[])==Reverse@x

würden zurückkehren

Falsch (* (weil {11, 13, 15, 11, 14, 1}! = {1, 14, 11, 15, 13, 11}) *)

True (* (weil {1, 0, 0, 1, 0, 0, 1} gleich {1, 0, 0, 1, 0, 0, 1} ist) *)

DavidC
quelle
Seltsam, nicht notwendig für die Antwort, aber ich bin neugierig, wie macht es sie?
Durron597
Ich hasse es, wenn ich wegen einer dummen
Typografie
Bitte erklären Sie "typecast".
DavidC
Meine weise Lösung ist um 2 Zeichen länger als Ihre, da ich die Eingabe in typeInteger
user12205
Jetzt verstehe ich was du meinst. Vielen Dank.
DavidC
1

Haskell (80 Zeichen)

tb 0 _=[]
tb x b=(tb(div x b)b)++[mod x b]
pali n r=(\x->(x==reverse x))(tb n r)

Nennen Sie es mit pali $number $radix. Richtig, wenn die Zahl ein Palindrom ist, falsch, wenn nicht.

Max Ried
quelle
1

Ruby - 76 Zeichen

f=->(n,b){n==0?[]:[n%b,*f.(n/b,b)]};d=f.(gets.to_i,gets.to_i);p d==d.reverse
Nik O'Lai
quelle
1

Perl 6 , 27 Bytes (22 ohne stdin / out)

say (+get).base(get)~~.flip

Probieren Sie es online aus!

  get()                     # pulls a line of stdin
 +                          # numerificate
(      ).base(get())        # pull the radix and call base to 
                            #  convert to string with that base
                    ~~      # alias LHS to $_ and smartmatch to
                      .flip # reverse of the string in $_

Perl6, König der lesbaren Golfplätze (Gölfe?) (Und auch einige nicht so lesbare).

Perl 6- Funktion (nicht stdin / stdout), 22 Bytes

{$^a.base($^b)~~.flip}

Probieren Sie es online aus!

Phil H.
quelle
Der Grund, den ich basein meiner Antwort nicht verwendet habe, ist, dass basenur bis zur Basis 36 unterstützt wird, und die Frage fragt, ob Radixe bis zu32767
Jo King
Oh, das wusste ich nicht. Hmm.
Phil H
0

dg - 97 Bytes

Dg ausprobieren :

n,r=map int$input!.split!
a=list!
while n=>
 a.append$chr(n%r)
 n//=r
print$a==(list$reversed a)

Erklärt:

n, r=map int $ input!.split!      # convert to int the string from input
a = list!                         # ! calls a function without args
while n =>
 a.append $ chr (n % r)           # append the modulus
 n //= r                          # integer division
print $ a == (list $ reversed a)  # check for palindrome list
rubik
quelle
0

C 140 132

int x,r,d[32],i=0,j=0,m=1;main(){scanf("%d %d",&x,&r);for(;x;i++)d[i]=x%r,x/=r;i--;for(j=i;j;j--)if(d[j]-d[i-j])m=0;printf("%d",m);}
  • Radix 1 wird nicht unterstützt :)
VX
quelle
1
puts(m)Würde einfach richtig funktionieren?
Durron597
printf("%d",m);wird um 8 Zeichen kürzer sein.
VX
0

Haskell - 59

Wenige Änderungen an Max Rieds Antwort.

0%_=[]
x%b=x`mod`b:((x`div`b)%b)
p=((reverse>>=(==)).).(%)
Shiona
quelle
0

Gleichstrom, 39 Bytes

Die Länge ist natürlich ein Palindrom ( 33₁₂).

[[t]pq]sgod[O~laO*+sad0<r]dsrx+la=g[f]p

Die Zahl und der Radix sollten sich oben auf dem Stapel befinden (in der aktuellen Zahlenbasis). Die Zahl muss mindestens 0 und der Radix mindestens 2 sein. Die Ausgabe erfolgt, twenn es sich um ein Palindrom handelt und fwenn nicht. Da dies in der Herausforderung nicht angegeben ist, habe ich angenommen, dass Zahlen niemals führende Nullen haben (daher kann jede Zahl, die mit endet, 0kein Palindrom sein).

Erläuterung

Als volles Programm:

#!/usr/bin/dc

# read input
??

# success message
[[t]pq]sg

# set output radix
o

# keep a copy unmodified
d

# reverse the digits into register a
[O~ laO*+sa d0<r]dsrx

# eat the zero left on stack, and compare stored copy to a
+ la=g

# failure message
[f]p
Toby Speight
quelle
0

LaTeX, 165 Bytes

Beispiel bei desmos.com

kDer Radix ist ein einstellbarer Eingang

b=\floor \left(\log _k\left(\floor \left(x\right)\right)\right)
f\left(x\right)=k^bx-x-\left(k^2-1\right)\sum _{n=1}^bk^{\left(b-n\right)}\floor \left(xk^{-n}\right)

Wenn f(x)=0, xist ein Palindrom in der Basis k.

ReGuess
quelle
0

Perl 6 , 34 Bytes

-4 Bytes dank PhilH

{@(polymod $^a: $^b xx*)~~[R,] $_}

Probieren Sie es online aus!

Scherzen
quelle
Sie können $ _ anstelle von @r verwenden, um 2 zu speichern
Phil H
@PhilH Nein . (weist eine Seq zu, keine Liste)
Jo King
Ahh, sorry hat den Fehler nicht gesehen
Phil H
@PhilH Dein zweiter Tipp hat trotzdem geholfen, Bytes zu sparen!
Jo King
1
Immer ärgerlich, dass es keinen kürzeren Weg gibt, Meta auf $ _ oder @_ zu reduzieren.
Phil H
0

05AB1E ,  4  3 Bytes

вÂQ

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

в      # The first (implicit) input converted to base second (implicit) input
       #  i.e. 12345 and 12346 → [1,1]
       #  i.e. 10 and 16 → [1,6]
 Â     # Bifurcate the value (short for duplicate & reverse)
       #  i.e. [1,1] → [1,1] and [1,1]
       #  i.e. [1,6] → [1,6] and [6,1]
  Q    # Check if they are still the same, and thus a palindrome
       #  i.e. [1,1] and [1,1] → 1
       #  i.e. [1,6] and [6,1] → 0
Kevin Cruijssen
quelle
0

C (gcc) , 79 Bytes

n,r,m;main(o){for(scanf("%d %d",&n,&r),o=n;n;n/=r)m=m*r+n%r;printf("%d",m==o);}

Probieren Sie es online aus!

Heruntergewirtschaftet

n,r,m;main(o){
for(scanf("%d %d",&n,&r),       Read the number and the radix.
o=n;                            ...and save the number in o
n;                              Loop while n is non-zero
n/=r)                           Divide by radix to remove right-most digit.
m=m*r+n%r;                      Multiply m by radix to make room for a digit
                                and add the digit.
printf("%d",m==o);}             Print whether we have a palindrome or not.

Basierend auf der Tatsache, dass für ein Palindrom die Umkehrung der Zahl gleich der Zahl selbst sein muss.

Angenommen, Sie haben die dreistellige Nummer ABC in einer Basis. Das Multiplizieren mit der Basis führt immer zu ABC0 und das Teilen durch die Basis in AB mit C als Rest. Um die Zahl umzukehren, nehmen wir die am weitesten rechts stehende Ziffer von der ursprünglichen Zahl und fügen sie rechts in die umgekehrte Zahl ein. Um Platz für diese Ziffer zu schaffen, multiplizieren wir die Umkehrung vorher mit der Basis.

Grundsätzlich:

n       rev
ABC     0
AB      C
AB      C0
A       CB
A       CB0
0       CBA
Gastropner
quelle
Das ist cool, kannst du die Mathematik dahinter erklären?
Durron597
@ durron597 Sicher! Dem Beitrag wurde eine Erklärung hinzugefügt.
Gastropner