Oparte palindromy

Dec 28 2020

Liczba palindromiczna, dla przypomnienia, to dowolna liczba, która czyta to samo do przodu, co do tyłu. A co z palindromami w innych bazach?

Wejście

Dowolna liczba całkowita, bgdzie b > 1.

Wynik

Wszystkie liczby całkowite o podstawie 10 od 0 do 1000 włącznie, które są palindromami o podstawie b. Dane wyjściowe mogą być listą liczb całkowitych lub liczb całkowitych oddzielonych separatorem, takim jak przecinek lub znak nowej linii.

Przypadki testowe

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}

Odpowiedzi

12 dingledooper Dec 29 2020 at 03:01

Python 3 , 78 bajtów

Wyprowadza liczby w kolejności malejącej 1000 -> 0i zwarcia z rozszerzeniemZeroDivisionError

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)

Wypróbuj online!

W f(b,n-n//n) -> f(b,n-1)recurses aż 0i błędy, bo dzielenie przez zero jest niezdefiniowane.

Python 3 , 76 bajtów

Możemy skrócić odpowiedź o 2 bajty, jeśli dozwolone jest wyjście zmiennoprzecinkowe.

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)

Wypróbuj online!

10 EasyasPi Dec 28 2020 at 13:02

C (gcc) naprzód, 118 117115 bajtów

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);}}

Wypróbuj online!

C (gcc) , wstecz, 115 113 bajtów

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);}}

Wypróbuj online!

Wyjaśnienie

Podpis C:

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

Przechodzi przez wszystkie liczby od 0 do 1000, baseręcznie konwertuje je na bazę , a następnie sprawdza, czy jest to palindrom.

Wersja wsteczna robi to samo, ale do tyłu.

Wyświetla pasujące liczby, oddzielone przecinkami, na standardowe wyjście.

Wersja Ungolfed

#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);
    }
}

Dzięki Arnauld za -1 bajtów!

Dzięki Toby Speight za -2 bajty!

10 Lyxal Dec 28 2020 at 04:54

05AB1E , 7 bajtów

₄ÝʒIвÂQ

Wypróbuj online!

Wyjaśnione

₄Ý	"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

Galaretka , 7 bajtów

ȷŻbŒḂ¥Ƈ

Wypróbuj online!

Jak to działa

ȷŻ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 bajtów

A³ô fÈìU êê

Spróbuj

6 J42161217 Dec 28 2020 at 04:53

Język Wolfram (Mathematica) , 44 bajty

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

Wypróbuj online!

-13 bajtów z @att

6 Arnauld Dec 28 2020 at 07:35

JavaScript (ES6),  87  86 bajtów

Zwraca ciąg znaków oddzielonych przecinkami.

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

Wypróbuj online!

W jaki sposób?

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 bajtów

  • Naprawiono po tym, jak Siu Ching Pong -Asuka Kenji- wskazał, BigIntże toStringdziała tylko dla baz do 36.
  • Zapisano 1 bajt dzięki @cubic lettuce .
b=>0 to 1000 filter{x=>val y=Seq.unfold(x){q=>Option.when(q>0)(q%b,q/b)};y==y.reverse}

Wypróbuj online!

To jest całkiem proste. Tworzy zakres od 0 do 1000, a następnie filtruje, sprawdzając, czy są równe ich odwróceniu w podstawie b. Do konwersji bazy b(jako ciąg), BigInt„s toStringmetoda jest użyto, ale teraz Seq.unfoldjest wykorzystywane do tworzenia Seqcyfr.

6 DominicvanEssen Dec 28 2020 at 08:04

Łuska , 12 11 bajtów

Edycja: -1 bajt dzięki LegionMammal978

foS=↔B⁰ŀdḋ9

Wypróbuj online!

Rzeczywisty kod „bazującego na palindromie” ma 7 bajtów ( foS=↔B⁰), ale określenie 0 ... 1000 kosztuje 5 4 (dzięki LegionMammal978) więcej bajtów.
Moglibyśmy zaoszczędzić bajt, gdybyśmy mogli wyprowadzić kilka dodatkowych palindromów opartych na wartościach do dziesiętnych 1024 ( foS=↔B⁰ŀ□32).

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

Węgiel drzewny , 14 bajtów

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

Wypróbuj online! Link prowadzi do pełnej wersji kodu. Wyjaśnienie:

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 bajty

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

Wypróbuj online!

Opierając się na fajnym pomyśle z odpowiedzi Pythona firmy Dingledooper : aby sprawdzić, czy njest to bpalindrom bazowy , nie generuj listy bcyfr bazowych , ale odwróć ją njako bliczbę bazową, wykonując konwersję podstawową odczytując cyfry od końca i sprawdź, czy wynik nadal jest równy n.

Kod |let 0%m=m;n%m=div n b%(m*b+mod n b)rekurencyjnie definiuje funkcję wrostkową, %która odwraca podstawę n(podaną 0jako początkowy drugi argument). Zdefiniowanie go wewnątrz letstrażnika pozwala nam uzyskać dostęp do argumentu bfunkcji głównej, podczas gdy funkcja samodzielna musiałaby przekazywać go przy każdym wywołaniu rekurencyjnym.

5 ovs Dec 28 2020 at 19:02

APL (Dyalog Extended) , 17 15 bajtów

Dzięki Razetime za -2 bajty!
Naprawiono błąd dzięki Siu Ching Pong !

Wymaga pochodzenia indeksu 0.

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

Wypróbuj online!

                 ⍝ 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 bajtów

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;}

Wyjaśnienie

Wystarczająco różni się od mojej wcześniejszej odpowiedzi na osobne przesłanie nakazu. Tym razem całkowicie odwracamy liczbę, a następnie porównujemy z oryginałem. Nie musimy więc eliminować końcowych zer ani znaków specjalnych 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);
        }
    }
}

Ta metoda działa niezawodnie ido INT_MAX/bi bdo INT_MAXlub odpowiednich odpowiedników, jeśli zmienimy używany typ liczby całkowitej. W przypadku typów bez znaku (lub z gcc -fwrapv) powinien działać dla pełnego zakresu i.

4 TobySpeight Dec 28 2020 at 23:28

C, 100 bajtów

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");}

Wypróbuj online

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");
}

Wyjaśnienie

Spowoduje to wyświetlenie liczb od najwyższych, ponieważ nie określono konkretnego zamówienia. Dla każdej liczby kandydującej zmniejszamy ją (as a) przez sukcesywne dzielenie przez podstawę, a resztę wykorzystujemy do zbudowania liczby odwrotnej (cal z). Jeśli stanie asię równe z, to mamy palindrom. Zwykle zatrzymywalibyśmy się tam ( a >= zw stanie pętli), ale do gry w golfa kontynuujemy całą drogę do a==0.

Musimy przetestować równość zarówno przed, jak i po przeniesieniu reszty do z, aby zaakceptować palindromy nieparzyste i parzyste.

Na koniec drukujemy 0, co zawsze jest palindromem i jest łatwiejsze do zastosowania w specjalnych przypadkach niż włączenie do pętli.

Metoda działa dla liczb całkowitych do INT_MAXmomentu cofnięcia warunku z i%b*apowrotem do i%b&&a, i będzie działać również dla innych typów liczb całkowitych.

4 coltim Dec 28 2020 at 23:57

K (ngn / k) , 18 bajtów

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

Wypróbuj online!

  • x\'!1001 przekonwertuj każdy z 0..1000 na reprezentację podstawową x
  • {x~|x}' sprawdź, czy każda reprezentacja jest palindromem
  • & uzyskać wskaźniki prawdy
4 Danis Dec 28 2020 at 12:59

Python 3.8 (wersja wstępna) , 92 85 bajtów

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

Wypróbuj online!

Dzięki dingledooperowi za oszczędność 7 bajtów!

4 DanielWagner Dec 29 2020 at 01:45

Haskell, 67 bajtów

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

fjest funkcją zainteresowania. Wypróbuj online!

Być może jedynym sprytnym fragmentem jest tutaj użycie take ndo stworzenia podstawy dla funkcji rozszerzania cyfr. Kiedy n=0, take nignoruje jego argument, więc rekurencja zatrzymuje się przez lenistwo; kiedy na n>0pewno nie będzie więcej niż ncyfr, więc bezpiecznie jest zachować tylko pierwszą n. Poniższa definicja jest równoważna (i równie długa):

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

... ale ta take nwersja jest fajniejsza, ponieważ jest bardziej zagmatwana. ^ _ ^

4 Jonah Dec 28 2020 at 13:16

J , 27 bajtów

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

w jaki sposób

  • (...) i.@1001 - Całość to hak J, co oznacza, że ​​argumentem będzie lewy argument wszystkiego w parach, a prawy argument będzie liczbami całkowitymi od 0 do 1000: i.@1001
  • ...#]Fraza wewnątrz parenów używa copy #do filtrowania prawego argumentu ]przez maskę boolowską wynikającą z frazy po lewej stronie #:
  • (-:|.)@(#.inv)"0- Pozycja 0 "0zapewnia, że ​​fraza dotyczy każdego indywidualnego numeru właściwego argumentu. Sama fraza najpierw konwertuje każdą z tych liczb na listę cyfr w podstawie podanej przez lewy argument (#.inv), a następnie sprawdza, czy ta lista jest równa jej odwrotności (-:|.)@. Cała fraza zwróci zatem 1, gdy jest to prawda, a 0 w przeciwnym razie, a ta maska ​​logiczna będzie filtrować odpowiedni argument zgodnie z potrzebami.

Wypróbuj online!

3 vrintle Dec 28 2020 at 11:13

Ruby 2.7 , 74 bajty

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

Wypróbuj online!

TIO używa starszej wersji Rubiego, podczas gdy w Rubim 2.7 mamy ponumerowane parametry, co pozwala zaoszczędzić dwa bajty.


Ruby , 48 bajtów

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

Wypróbuj online!

Nie działa dla baz powyżej 64 lat ze względu na ograniczenia .to_smetody.

3 NinaLisitsinskaya Dec 29 2020 at 02:07

JavaScript (V8) , 77 89 bajtów

Naprawiono dla podstaw większych niż 36.

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

Wypróbuj online!

3 ZaelinGoodman Dec 29 2020 at 03:26

PowerShell , 102 100 98 95 87 75 bajtów

-14 bajtów dzięki mazzy!

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

Wypróbuj online!

2 DominicvanEssen Dec 28 2020 at 19:44

R , 82 81 bajtów

(lub 79 bajtów przy użyciu dość skomplikowanego separatora „ \n[1] ”)

Edycja: -1 bajt dzięki caird coinheringaahing

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

Wypróbuj online!

Ręcznie oblicza cyfry w nowej reprezentacji bazowej i sprawdza, czy są takie same jak odwrócone.

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 bajtów

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

Wypróbuj online!

Wyjaśnienie

. 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 bajtów

f_IjTQUh^T3

Wypróbuj online!


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 bajtów

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

Wypróbuj online.

Wyjaśnienie:

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