Basierte Palindrome

Dec 28 2020

Eine palindromische Zahl als Auffrischung ist eine beliebige Zahl, die vorwärts und rückwärts gleich lautet. Was ist jedoch mit Palindromen in anderen Basen?

Eingang

Jede ganze Zahl bwo b > 1.

Ausgabe

Alle ganzzahligen Zahlen der Basis 10 von 0 bis einschließlich 1000, die Palindrome in der Basis b sind. Die Ausgabe kann entweder eine Liste von Ganzzahlen oder Ganzzahlen sein, die durch ein Trennzeichen wie ein Komma oder eine neue Zeile getrennt sind.

Testfälle

Input->Output

10->{0,1,2,3,4,5,6,7,8,9,11,22,33,44,55,66,77,88,99,101,111,121,131,141,151,161,171,181,191,202,212,222,232,242,252,262,272,282,292,303,313,323,333,343,353,363,373,383,393,404,414,424,434,444,454,464,474,484,494,505,515,525,535,545,555,565,575,585,595,606,616,626,636,646,656,666,676,686,696,707,717,727,737,747,757,767,777,787,797,808,818,828,838,848,858,868,878,888,898,909,919,929,939,949,959,969,979,989,999}

2->{0,1,3,5,7,9,15,17,21,27,31,33,45,51,63,65,73,85,93,99,107,119,127,129,153,165,189,195,219,231,255,257,273,297,313,325,341,365,381,387,403,427,443,455,471,495,511,513,561,585,633,645,693,717,765,771,819,843,891,903,951,975}

9->{0,1,2,3,4,5,6,7,8,10,20,30,40,50,60,70,80,82,91,100,109,118,127,136,145,154,164,173,182,191,200,209,218,227,236,246,255,264,273,282,291,300,309,318,328,337,346,355,364,373,382,391,400,410,419,428,437,446,455,464,473,482,492,501,510,519,528,537,546,555,564,574,583,592,601,610,619,628,637,646,656,665,674,683,692,701,710,719,728,730,820,910,1000}

Antworten

12 dingledooper Dec 29 2020 at 03:01

Python 3 , 78 Bytes

Gibt die Zahlen in absteigender Reihenfolge aus 1000 -> 0und schließt mit a kurzZeroDivisionError

def f(b,n=1000):
 r=0;m=n
 while m:r=r*b+m%b;m//=b
 n==r==print(n);f(b,n-n//n)

Probieren Sie es online aus!

Das f(b,n-n//n) -> f(b,n-1)rekursiert bis 0und Fehler, da das Teilen durch Null undefiniert ist.

Python 3 , 76 Bytes

Wir können die Antwort um 2 Bytes verkürzen, wenn eine Gleitkommaausgabe zulässig ist.

def f(b,n=1e3):
 r=0;m=n
 while m:r=r*b+m%b;m//=b
 n==r==print(n);f(b,n-n/n)

Probieren Sie es online aus!

10 EasyasPi Dec 28 2020 at 13:02

C (gcc) vorwärts, 118 117 115 Bytes

b[11],*p,*x,i,m;f(n){for(i=-1;i++<1e3;){for(p=x=b,m=i;m;*p++=m%n,m/=n);while(p>x)m|=*--p-*x++;m||printf("%d,",i);}}

Probieren Sie es online aus!

C (gcc) , rückwärts, 115 113 Bytes

b[11],*p,*x,i,m;f(n){for(i=1001;i--;){for(p=x=b,m=i;m;*p++=m%n,m/=n);while(p>x)m|=*--p-*x++;m||printf("%d,",i);}}

Probieren Sie es online aus!

Erläuterung

C Unterschrift:

// Technically implicit int with a void return
void f(int base);

Durchläuft alle Zahlen von 0 bis 1000, wandelt sie basevon Hand in Basis um und prüft dann, ob es sich um ein Palindrom handelt.

Die Rückwärtsversion macht dasselbe, aber rückwärts.

Druckt übereinstimmende Nummern, durch Kommas getrennt, nach Standard.

Ungolfed Version

#include <stdio.h>
// A buffer to hold our converted integer.
// It is large enough for 1000 in binary.
int buffer[11];
// Start and end pointers for buffer
int *start, *end;
// Loop counter
int i;
// Temporary
int tmp;

void f(int base)
{
    // Loop for 0 to 1000
#ifdef BACKWARDS
    // Loop backwards
    for (i = 1001; i-- != 0;) {
#else
    // Loop forwards
    // for (i = 0; i <= 1000; i++)
    for (i = -1; i++ < 1e3; ) {
#endif
        // Convert to base in buffer, tracking the length in end.
        for(start = end = buffer, tmp = i; tmp != 0;) {
            *end++ = tmp % base;
            tmp /= base;
        }

        // Check if it is a palindrome.
        // Loop while our starting pointer is less than our ending pointer.
        // tmp will zero at the start thanks to the loop condition.
        while (end > start)
            // Assembly style comparison using subtraction.
            // If *end == *start, tmp will still be zero.
            // If not, it will be permanently set to non-zero with a binary or.
            tmp |= *--end - *start++;
        // If tmp is still zero (meaning it is a palindrome), print.
        tmp || printf("%d,", i);
    }
}

Danke an Arnauld für die -1 Bytes!

Vielen Dank an Toby Speight für die -2 Bytes!

10 Lyxal Dec 28 2020 at 04:54

05AB1E , 7 Bytes

₄ÝʒIвÂQ

Probieren Sie es online aus!

Erklärt

₄Ý	"Push the range [0, 1000]"\
  ʒ	"and keep the items where:"\
   Iв	"After being converted to base (input)"\
     ÂQ	"have its reverse equal to itself"\
6 cairdcoinheringaahing Dec 28 2020 at 04:42

Gelee , 7 Bytes

ȷŻbŒḂ¥Ƈ

Probieren Sie es online aus!

Wie es funktioniert

ȷŻbŒḂ¥Ƈ - Main link. Takes a base b on the left
ȷ       - 1000
 Ż      - [0, 1, 2, ..., 1000]
     ¥  - Group the previous 2 links into a dyad f(k, b):
  b     -   Convert k to base b
   ŒḂ   -   Is this a palindrome?
      Ƈ - Filter [0, 1, 2, ..., 1000], keeping those k that are true under f(k, b)
6 Shaggy Dec 28 2020 at 07:48

Japt , 11 Bytes

A³ô fÈìU êê

Versuch es

6 J42161217 Dec 28 2020 at 04:53

Wolfram Language (Mathematica) , 44 Bytes

Pick[r=0~Range~1000,r-r~IntegerReverse~#,0]&

Probieren Sie es online aus!

-13 Bytes von @att

6 Arnauld Dec 28 2020 at 07:35

JavaScript (ES6),  87  86 Byte

Gibt eine durch Kommas getrennte Zeichenfolge zurück.

n=>(g=k=>--k&&g(k)+((h=k=>a=k?[k%n,...h(k/n|0)]:[])(k)+''==a.reverse()?[,k]:''))(1001)

Probieren Sie es online aus!

Wie?

n => (                        // n = input base
  g = k =>                    // g is a recursive function taking a counter k
    --k &&                    //   decrement k; abort if it's equal to 0
    g(k) + (                  //   otherwise do a recursive call and append the ...
      ( h = k =>              //   ... result of the recursive function h
        a = k ?               //     which builds an array a[]
          [ k % n,            //     consisting of each digit of k in base n,
            ...h(k / n | 0) ] //     dividing k by n and taking the integer part
        :                     //     for the next iteration until k = 0
          []                  //
      )(k) + ''               //   invoke h with k and coerce the result to a string
      == a.reverse() ?        //   if this is palindromic:
        [, k]                 //     append a comma followed by k to the output
      :                       //   else:
        ''                    //     just append an empty string
    )                         //
)(1001)                       // initial call to g with k = 1001
6 user Dec 28 2020 at 05:16

Scala , 62 87 Bytes

  • Behoben, nachdem Siu Ching Pong -Asuka Kenji- darauf hingewiesen hat BigInt, dass es toStringnur für Basen bis zu 36 funktioniert.
  • 1 Byte dank @cubic Salat gespeichert .
b=>0 to 1000 filter{x=>val y=Seq.unfold(x){q=>Option.when(q>0)(q%b,q/b)};y==y.reverse}

Probieren Sie es online aus!

Das ist ziemlich einfach. Es wird ein Bereich von 0 bis 1000 festgelegt und dann gefiltert, indem geprüft wird, ob sie der Umkehrung der Basis entsprechen b. Zur Umstellung von Base b(als String) BigInt‚s toStringMethode wird verwendet, aber jetzt Seq.unfoldverwendet wird , eine zu schaffen , Seqvon Ziffern.

6 DominicvanEssen Dec 28 2020 at 08:04

Schale , 12 11 Bytes

Bearbeiten: -1 Byte dank LegionMammal978

foS=↔B⁰ŀdḋ9

Probieren Sie es online aus!

Der tatsächliche 'basierte Palindrom'-Code ist 7 Bytes ( foS=↔B⁰), aber die Angabe von 0 ... 1000 kostet 5 4 (dank LegionMammal978) mehr Bytes.
Wir könnten ein Byte speichern, wenn es in Ordnung ist, ein paar weitere Palindrome mit Werten bis zur Dezimalstelle 1024 ( foS=↔B⁰ŀ□32) auszugeben .

f               # output the truthy values of
       ŀdḋ9     # series from zero up to one less than 1001
                # (decimal interpretation of binary digits of '9')
 o              # based on combination of 2 functions:
  S=↔           # 1. is it equal to reverse of itself?
     B⁰         # 2. digits in base given by argument
5 Neil Dec 28 2020 at 05:33

Holzkohle , 14 Bytes

NθIΦ⊕φ⁼↨ιθ⮌↨ιθ

Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Erläuterung:

Nθ              Input the base `b`
     φ          Predefined variable 1000
    ⊕           Incremented
   Φ            Filter on implicit range
        ι       Current value
       ↨ θ      Converted to base `b`
      ⁼         Equals
            ι   Current value
           ↨ θ  Converted to base `b`
          ⮌     Reversed
  I             Cast to string
                Implicitly print
5 xnor Dec 29 2020 at 10:59

Haskell , 63 Bytes

f b|let 0%m=m;n%m=div n b%(m*b+mod n b)=[n|n<-[0..1000],n==n%0]

Probieren Sie es online aus!

Basierend auf einer guten Idee aus der Python-Antwort von dingledooper : Um zu überprüfen, ob nes sich um ein Basis- bPalindrom handelt, generieren Sie keine Liste der Basis- bZiffern, sondern kehren Sie nals bBasis-Nummer um, indem Sie am Ende eine Basis-Konvertierungs-Lese-Ziffer ausführen Überprüfen Sie, ob das Ergebnis immer noch gleich ist n.

Der Code |let 0%m=m;n%m=div n b%(m*b+mod n b)definiert rekursiv eine Infix-Funktion %, die die Basis umkehrt n( 0als erstes zweites Argument angegeben). Wenn letwir es innerhalb eines Guard definieren, können wir auf das Argument bder Hauptfunktion zugreifen , während eine eigenständige Funktion es bei jedem rekursiven Aufruf weitergeben müsste.

5 ovs Dec 28 2020 at 19:02

APL (Dyalog Extended) , 17 bis 15 Byte

Vielen Dank an Razetime für -2 Bytes!
Ein Fehler dank Siu Ching Pong behoben !

Benötigt Indexursprung 0.

⍸⎕(⊤≡∘⌽⊤)¨⍳1001

Probieren Sie es online aus!

                 ⍝ tradfn taking the base as input
          ⍳1001  ⍝ the indices up to 1000
 ⍵(     )¨       ⍝ apply a function to each index as a right argument and the input base as a left argument:
      ⌽⊤         ⍝  the reverse of the index converted to the input base 
    ≡            ⍝  does it match 
   ⊤             ⍝  the index converted to the input base
⍸                ⍝ all truthy indices
5 TobySpeight Dec 29 2020 at 00:06

C - 76 Bytes

i=1001,a,z;f(b){for(;i--;i-z||printf("%d ",i))for(a=i,z=0;a;a/=b)z=z*b+a%b;}

Erläuterung

Ausreichend anders als meine frühere Antwort , um die Veröffentlichung separat zu rechtfertigen. Dieses Mal kehren wir die Zahl vollständig um und vergleichen sie dann mit dem Original. Wir müssen also keine nachgestellten Nullen oder Sonderfälle entfernen 0.

void fun(int b)
{
    for (int i = 1001; i--;) {
        int z = 0;
        for (int a = i; a != 0; a /= b) {
            z = z*b + a%b;
        }
        if (i==z) {
            printf("%d ",i);
        }
    }
}

Diese Methode funktioniert zuverlässig für ibis zu INT_MAX/bund bbis zu INT_MAXoder die entsprechenden Äquivalente, wenn wir den verwendeten Integer-Typ ändern. Für vorzeichenlose Typen (oder mit gcc -fwrapv) sollte es für den gesamten Bereich von funktionieren i.

4 TobySpeight Dec 28 2020 at 23:28

C 100 Bytes

i=1001,a,z;f(b){for(;--i;)for(a=i,z=0;i%b*a;a/=b)if(a==z||a==(z=z*b+a%b))printf("%d ",i);puts("0");}

Probieren Sie es online aus

Ungolfed Code

void fun(int b)
{
    for (int i = 1001; --i;) {
        if (i%b) {              /* no leading/trailing zeros */
            for (int a = i, z = 0; a != 0; a /= b) {
                if (a==z) {
                    printf("%d ",i);
                }
                z = z*b + a%b;
                if (a==z) {
                    printf("%d ",i);
                }
            }
        }
    }
    puts("0");
}

Erläuterung

Dies gibt zuerst die höchsten Zahlen aus, da keine bestimmte Reihenfolge angegeben wurde. Für jede Kandidatennummer reduzieren wir sie (as a), indem wir sie nacheinander durch die Basis dividieren und den Rest verwenden, um die umgekehrte Nummer (in z) aufzubauen . Wenn agleich wird z, dann haben wir ein Palindrom. Normalerweise würden wir dort anhalten ( a >= zim Loop-Zustand), aber zum Golfen fahren wir den ganzen Weg weiter a==0.

Wir müssen die Gleichheit sowohl vor als auch nach der Übertragung des Restes auf testen z, um sowohl Palindrome mit ungerader als auch mit gerader Länge zu akzeptieren.

Schließlich drucken wir 0, was immer ein Palindrom ist und in Sonderfällen leichter zu erfassen ist als in die Schleife aufzunehmen.

Die Methode funktioniert für Ganzzahlen bis zu, INT_MAXwenn wir die Bedingung i%b*awieder aufheben i%b&&a, und würde auch für andere Ganzzahltypen funktionieren.

4 coltim Dec 28 2020 at 23:57

K (ngn / k) , 18 Bytes

{&{x~|x}'x\'!1001}

Probieren Sie es online aus!

  • x\'!1001 Konvertieren Sie jeweils 0..1000 in die Basis-x-Darstellung
  • {x~|x}' Überprüfen Sie, ob jede Darstellung ein Palindrom ist
  • & Indizes der Wahrheiten erhalten
4 Danis Dec 28 2020 at 12:59

Python 3.8 (Vorabversion) , 92 85 Bytes

lambda b:[i for i in range(1001)if(f:=lambda n:n*[0]and[n%b]+f(n//b))(i)==f(i)[::-1]]

Probieren Sie es online aus!

Vielen Dank an dingledooper für die Einsparung von 7 Bytes!

4 DanielWagner Dec 29 2020 at 01:45

Haskell, 67 Bytes

b&n=take n$mod n b:b&div n b
f b=[n|n<-[0..1000],reverse(b&n)==b&n]

fist die Funktion von Interesse. Probieren Sie es online aus!

Vielleicht ist das einzig clevere hier die Verwendung von take n, um einen Basisfall für die Ziffernerweiterungsfunktion zu erstellen. Wenn n=0, take nignoriert sein Argument und so stoppt die Rekursion durch Faulheit; Wenn n>0es nicht mehr als nZiffern gibt, ist es sicher, nur die ersten zu behalten n. Die folgende Definition ist äquivalent (und gleich lang):

b&0=[]
b&n=mod n b:b&div n b

... aber die take nVersion macht mehr Spaß, weil sie verwirrender ist. ^ _ ^

4 Jonah Dec 28 2020 at 13:16

J , 27 Bytes

((-:|.)@(#.inv)"0#])i.@1001

Wie

  • (...) i.@1001 - Das Ganze ist ein J-Hook, was bedeutet, dass das Argument das linke Argument für alles in den Parens ist und das rechte Argument die ganzen Zahlen von 0 bis 1000: i.@1001
  • ...#]Die Phrase in den Parens verwendet copy #, um das rechte Argument ]nach der Booleschen Maske zu filtern, die sich aus der Phrase links von ergibt #:
  • (-:|.)@(#.inv)"0- Der Rang 0 "0stellt sicher, dass die Phrase für jede einzelne Nummer des richtigen Arg gilt. Die Phrase selbst konvertiert zuerst jede dieser Zahlen in eine Liste von Ziffern in der Basis, die durch das linke Argument angegeben wird (#.inv), und prüft dann, ob diese Liste ihrer Umkehrung entspricht (-:|.)@. Die gesamte Phrase gibt also 1 zurück, wenn dies wahr ist, und andernfalls 0, und diese boolesche Maske filtert das richtige Argument wie gewünscht.

Probieren Sie es online aus!

3 vrintle Dec 28 2020 at 11:13

Ruby 2.7 , 74 Bytes

->b{(0..1e3).select{(a=(g=->k,r=[]{k>0?g[k/b,r<<k%b]:r})[_1])==a.reverse}}

Probieren Sie es online aus!

TIO verwendet eine ältere Version von Ruby, während wir in Ruby 2.7 Parameter nummeriert haben, wodurch zwei Bytes gespart werden.


Ruby , 48 Bytes

->b{(0..1e3).select{|k|(k=k.to_s b)==k.reverse}}

Probieren Sie es online aus!

Funktioniert nicht für Basen über 64, da die .to_sMethode eingeschränkt ist.

3 NinaLisitsinskaya Dec 29 2020 at 02:07

JavaScript (V8) , 77 89 Byte

Behoben für Basen größer als 36.

b=>{for(i=-1;i<1e3;){j=[],k=++i;while(k|=0)j.push(k%b),k/=b;''+j==j.reverse()&&print(i)}}

Probieren Sie es online aus!

3 ZaelinGoodman Dec 29 2020 at 03:26

PowerShell , 102 100 98 95 87 75 Byte

-14 Bytes dank mazzy!

param($u)0..1e3|?{for($b=@();$_=($_-($b+=$_%$u)[-1])/$u){}"$b"-eq$b[11..0]}

Probieren Sie es online aus!

2 DominicvanEssen Dec 28 2020 at 19:44

R , 82 81 Bytes

(oder 79 Bytes mit dem ziemlich komplizierten Trennzeichen " \n[1] ")

Bearbeiten: -1 Byte dank Caird Coinheringaahing

function(b)for(i in 0:1e3)if(!i||all((a=i%/%b^(0:log(i,b))%%b)==rev(a)))cat(i,'')

Probieren Sie es online aus!

Berechnet manuell Ziffern in einer neuen Basisdarstellung und prüft, ob sie mit sich selbst identisch sind.

function(b)
 for(i in 0:1000)               # loop i through zero to 1000
  if(!i                         # if i is zero (always a palindrome),
   ||                           # or
   all(                         # if all the digits of
    (a=i%/%b^(0:log(i,b))%%b)   # a = the representation of i in base b
    ==rev(a))                   # are the same as themselves reversed
  )cat(i,'')                    # output this i
1 2x-1 Jan 03 2021 at 10:09

jq , 66 Bytes

. as$a|range(1001)|select([while(.>0;./$a|floor)|.%$a]|reverse==.)

Probieren Sie es online aus!

Erläuterung

. as $a |                # Assign the input to $a. range(1001) | # For every item in [0..1000]: select ( # Filter out all items where: [ while(. > 0; # The list of quotients from repeatedly . / $a | floor)     #     short-dividing by $a |. % $a]           #     And then modulo-ing by $a
  | reverse == .)        # is equal to its reverse
```
1 hakr14 Jan 03 2021 at 10:47

Pyth , 11 Bytes

f_IjTQUh^T3

Probieren Sie es online aus!


f_IjTQUh^T3 | Explanation
------------+---------------------------------------
f           | filter
      Uh^T3 | the range [0, 1001)
   jTQ      | on whether each number in base <input>
 _I         | equals itself reversed
1 KevinCruijssen Jan 07 2021 at 15:21

Java 10, 118 Bytes

b->{for(int i=-1;i++<1e3;){var s=b.toString(i,b);if(s.contains(new StringBuffer(s).reverse()))System.out.println(i);}}

Probieren Sie es online aus.

Erläuterung:

b->{                           // Method with Integer parameter and no return-type
  for(int i=-1;i++<1e3;){      //  Loop `i` in the range [0,1000]:
    var s=b.toString(i,b);     //   Convert `i` to base-`b` as String
    if(s.contains(new StringBuffer(s).reverse()))
                               //   If this String is a palindrome:
      System.out.println(i);}} //    Print `i` with trailing newline