Oparte palindromy
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
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!
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!
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"\
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)
Japt , 11 bajtów
A³ô fÈìU êê
Spróbuj
Język Wolfram (Mathematica) , 44 bajty
Pick[r=0~Range~1000,r-r~IntegerReverse~#,0]&
Wypróbuj online!
-13 bajtów z @att
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
Scala , 62 87 bajtów
- Naprawiono po tym, jak Siu Ching Pong -Asuka Kenji- wskazał,
BigIntżetoStringdział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.
Ł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
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
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.
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
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.
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.
K (ngn / k) , 18 bajtów
{&{x~|x}'x\'!1001}
Wypróbuj online!
x\'!1001przekonwertuj każdy z 0..1000 na reprezentację podstawową x{x~|x}'sprawdź, czy każda reprezentacja jest palindromem&uzyskać wskaźniki prawdy
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!
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. ^ _ ^
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!
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.
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!
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!
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
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
```
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
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