Określ, czy liczba całkowita jest palindromem w danej podstawie (podstawa)


11

Napisz program, który odczytuje ze standardowego wejścia dwie liczby całkowite, każda nowa linia jest zakończona, zwane dalej „liczbą” i „radiksem” oraz:

  1. Drukuje każdą stałą wiadomość chcesz jeśli liczba jest palindrom w tym radix (np true, t, 1)
  2. Drukuje każdą inną ustaloną wiadomość, którą chcesz, jeśli liczba nie jest palindrom w tym radix (np false, f, 0, itd.)
  3. Te komunikaty muszą być takie same dla każdego biegu, ale nie ma żadnych zasad dotyczących tego, czym muszą być (co jest najlepsze do gry w golfa).
  4. Możesz założyć, że dane wejściowe są prawidłowe, dwie dodatnie liczby całkowite. „liczba” nie przekroczy 2147483647, „podstawa” nie przekroczy 32767.
  5. Nie możesz korzystać z zasobów zewnętrznych, ale możesz użyć dowolnej funkcji matematycznej domyślnie dostępnej w Twoim języku.

Uwaga: podstawa to tylko podstawa liczby.

Przykładowe przebiegi:

16
10
false

16
3
true

16
20
true

121
10
true

5
5
false

12346
12345
true

16781313
64
true

16781313
16
true

Uwaga: podstawa to tylko podstawa liczby.

Teraz wygląda dobrze. Możesz jednak zablokować zasoby zewnętrzne.

@ user2509848 hmmm, na przykład?
durron597

Jeśli dana osoba może znaleźć w Internecie kalkulator, który konwertuje liczby między bazami, prawie na pewno zostanie użyty. Ostatnio pojawiło się mnóstwo paskudnych odpowiedzi.

Czy jeden ze stałych komunikatów może być pustym łańcuchem (zakładając, że drugi jest niepustym łańcuchem)?
Toby Speight

Odpowiedzi:


5

Podwójna cecha J (23 znaków) i K (19)

Oba języki są bardzo podobne, zarówno ogólnie, jak i w tym konkretnym golfie. Oto J:

(-:|.)#.^:_1~/".1!:1,~1
  • ,~1- Dołącz liczbę 1 do siebie, tworząc tablicę 1 1.
  • 1!:1- Odczytaj z klawiatury dwa ciągi znaków ( 1!:1ma to odczytać i 1jest uchwytem pliku / numerem dla wprowadzania danych z klawiatury).
  • ". - Konwertuj każdy ciąg na liczbę.
  • #.^:_1~/- F~/ x,yznaczy znaleźć y F x. Nasz Fjest #.^:_1, który wykonuje rozszerzenie bazy.
  • (-:|.)- Czy argument match ( -:) jest odwrotny ( |.)? 1za tak, 0za nie.

A oto K:

a~|a:_vs/|.:'0::'``
  • 0::'``- Wczytaj ( 0::) ciąg dla każdej ( ') linii z konsoli ( `jest to uchwyt pliku do tego).
  • .:'- Convert ( .:) każdy ( ') ciąg na liczbę.
  • _vs/|- Odwróć parę liczb, tak aby podstawa znajdowała się przed liczbą, a następnie wstaw ( /) _vswektorową funkcję rozszerzenia („wektor ze skalara”) między nimi.
  • a~|a:- Przypisz wynikowe rozszerzenie do a, a następnie sprawdź, czy apasuje ( ~) do jego odwrotnej ( |). Ponownie 1za tak, 0za nie.

@ ak82 Uważam, że jest to bardziej interesujące w ten sposób
John Dvorak

8

GolfScript, 10 znaków

~base.-1%=

To jest łatwe dla GolfScript, jeśli zrobimy to w prosty sposób. Dane wyjściowe to 0/ 1for 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

3

APL (20)

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

Wyjścia 0lub 1np .:

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

Wyjaśnienie:

  • ⎕{... }⎕: przeczytaj dwie liczby, przekaż je do funkcji. jest pierwszą liczbą i jest drugą liczbą.
  • ⌊1+⍺⍟⍵: floor(1+⍺ log ⍵), liczba cyfr niezbędnych do przedstawienia w bazie .
  • ⍺/⍨: podstawa dla każdej cyfry, więc powielona przez właśnie obliczoną liczbę.
  • ⍵⊤⍨: reprezentują w podanej bazie (używając liczb, więc działa dla wszystkich wartości ).
  • ≡∘⌽⍨: sprawdź, czy wynik jest równy jego odwrotności.

3

Perl, 82 77 73 69 bajtów

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

Liczby wejściowe są oczekiwane jako linie wejściowe STDIN, a wynik jest zapisywany jako 1lub 0, pierwsza oznacza, że ​​pierwsza liczba jest palindromem w jej reprezentacji danej bazy.

Edycja 1: Użycie $=zapisuje niektóre bajty z powodu wewnętrznej konwersji na int.

Edycja 2: Operator smartmatch ~~porównuje bezpośrednio elementy tablicy, dlatego konwersja na ciąg nie jest konieczna.

Edycja 3: Optymalizacja poprzez usunięcie niepotrzebnej zmiennej.

65 bajtów : Jeśli pusty ciąg znaków jest dozwolony jako wyjście false, ostatnie cztery bajty można usunąć.

Wersja bez golfa

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

Algorytm przechowuje cyfry przekonwertowanej liczby w tablicy @a. Następnie reprezentacja ciągu tej tablicy jest porównywana z tablicą w odwrotnej kolejności. Spacje oddzielają cyfry.


Przepraszam, moja odpowiedź jest naprawdę taka sama, ale przy użyciu $=pozwól mi zmierzyć intkrok ... I postawić pytanie, anything you wantaby nic nie mogło być tym, czego chcesz ;-)
F. Hauri

@ F.Hauri: Dzięki, zaktualizuję. $=podano również jako wskazówkę w tej odpowiedzi na pytanie „Wskazówki dotyczące gry w golfa w Perlu” . Zwrot 0kosztuje 6 dodatkowych bajtów, ale miałem wrażenie, że ustalona wiadomość nie jest pusta.
Heiko Oberdiek

Hem ,, Zwrot 0 kosztuje 4 dodatkowe bajty, a nie 6. Ale utrzymuję: to wszystko! silence
F. Hauri

@ F.Hauri: Tak, 4 jest poprawne, dodatkowe dwa bajty były nawiasami wersji bez golfa.
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 to liczba, bargument to podstawa.


2

Sage, 45 lat

Działa w interaktywnym pytaniu

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

Drukuje, Truegdy jest palindromem, drukuje Falseinaczej


2

Perl 54 56 62

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

Być testowanym:

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

da:

1

1


1

To wyjście 1dla trueznalezienia palindromu i nic, jeśli inaczej.

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 :

  • $_ jest bieżącym buforem linii i jest pusty na początku.
  • $=jest zmienną zarezerwowaną , pierwotnie używaną do drukowania linii, jest to licznik linii. Tak więc ta zmienna jest liczbą całkowitą , wszelkie obliczenia na tej podstawie skutkowałyby liczbą całkowitą obciętą, jak gdyby int()użyto.
  • $- był używany dla zabawy, żeby nie używać tradycyjnych liter ... (trochę więcej zaciemnienia) ...

dla wyjaśnienia, to nic nie mówi, gdy nie jest palindromem, a 1, gdy jest?
durron597

1
Niezłe sztuczki. Jednak źle dodatni: 21 z podstawą 11. Cyfry potrzebują separatora w porównaniu łańcucha.
Heiko Oberdiek

Aaaarg +3! @HeikoOberdiek Masz rację ...
F. Hauri

@ F.Hauri: Również cyfry zostają odwrócone. Zatem 170 z podstawą 16 to 0xAA, palindrom, ale wynik jest fałszywy.
Heiko Oberdiek

Aaarg +6! konwersja do znaków ...
F. Hauri

1

Mathematica 77 43

IntegerDigits[n,b]reprezentuje n jako listę cyfr w bazie b. Każda cyfra podstawy b jest wyrażana dziesiętnie.

Na przykład 16781313 nie jest palindromem w podstawie 17:

IntegerDigits[16781313, 17]

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

Jest to jednak palindrom w bazie 16:

IntegerDigits[16781313, 16]

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


Jeśli wprowadzono uporządkowane pary w powyższych przykładach,

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

wróciłby

Fałsz (* (ponieważ {11, 13, 15, 11, 14, 1}! = {1, 14, 11, 15, 13, 11}) *)

Prawda (* (ponieważ {1, 0, 0, 1, 0, 0, 1} jest równy {1, 0, 0, 1, 0, 0, 1}) *)


Dziwne, nie potrzebne do odpowiedzi, ale jestem ciekawy, w jaki sposób je renderuje?
durron597

Nienawidzę tego, kiedy przegrywam z powodu głupiego typecastu ...
user12205

Wyjaśnij uprzejmie „typecast”.
DavidC

Moje rozwiązanie dla mędrca jest dłuższe niż twoje o 2 znaki, ponieważ muszę Integer
przesłać

Teraz rozumiem, co masz na myśli. Dzięki.
DavidC

1

Haskell (80 znaków)

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

Zadzwoń za pomocą pali $number $radix. To prawda, że ​​gdy liczba jest palindromem, Fałsz, jeśli nie.


1

Ruby - 76 znaków

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

1

Perl 6 , 27 bajtów (22 bez standardowego wejścia / wyjścia)

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

Wypróbuj online!

  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, król czytelnych golfów (golves?) (A także niektórych nie tak czytelnych).

Funkcja Perla 6 (nie standardowego / standardowego), 22 bajty

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

Wypróbuj online!


Powodem, dla którego nie użyłem basew mojej odpowiedzi jest to, że baseobsługuje tylko do bazy 36, a pytanie wymaga wsparcia dla podstawników do32767
Jo King

Ooh, nie wiedziałem o tym. Hmm
Phil H

0

dg - 97 bajtów

Wypróbowanie dg :

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

Wyjaśniono:

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

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);}
  • podstawa 1 nie jest obsługiwana :)

1
Po prostu puts(m)by działało, prawda?
durron597

printf("%d",m);będzie o 8 znaków krótszy.
VX

0

Haskell - 59

Kilka zmian w odpowiedzi Maxa Rieda.

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


0

dc, 39 bajtów

Długość jest oczywiście palindromem ( 33₁₂).

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

Liczba i podstawa powinny znajdować się na górze stosu (w bieżącej bazie liczb); liczba musi wynosić co najmniej 0, a podstawa musi wynosić co najmniej 2. Wyjście jest, tjeśli jest to palindrom, a fjeśli nie. Ponieważ nie jest to określone w wyzwaniu, założyłem, że liczby nigdy nie mają zer wiodących (więc żadna liczba kończąca się 0nie może być palindromem).

Wyjaśnienie

Jako pełny program:

#!/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

0

LaTeX, 165 bajtów

Przykład na desmos.com

k, podstawa, jest regulowanym wejściem

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)

Jeśli f(x)=0, xto palindrom w bazie k.


0

Perl 6 , 34 bajtów

-4 bajty dzięki PhilH

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

Wypróbuj online!


Możesz użyć $ _ zamiast @r, aby zapisać 2
Phil H

@PhilH Nie . (przypisuje sekwencję, a nie listę)
Jo King

Ach, przepraszam, nie widziałem błędu
Phil H

@PhilH Twoja druga wskazówka pomogła jednak zaoszczędzić bajty!
Jo King,

1
Zawsze denerwujące, że nie ma krótszego sposobu na wywołanie metody redukcji meta na $ _ lub @_.
Phil H

0

05AB1E ,  4  3 bajty

вÂQ

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

в      # 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

0

C (gcc) , 79 bajtów

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

Wypróbuj online!

Zniszczony

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.

Na podstawie faktu, że w przypadku palindromu odwrotność liczby musi być równa samej liczbie.

Załóżmy, że masz trzycyfrową liczbę ABC w jakiejś bazie. Pomnożenie go przez zasadę zawsze spowoduje ABC0, a podzielenie go przez zasadę w AB z C jako resztą. Aby odwrócić liczbę, wybieramy cyfrę najbardziej po prawej stronie od numeru oryginalnego i wstawiamy ją po prawej stronie na odwróconym numerze. Aby zrobić miejsce dla tej cyfry, wcześniej mnożymy rewers przez bazę.

Gruntownie:

n       rev
ABC     0
AB      C
AB      C0
A       CB
A       CB0
0       CBA

To jest fajne, czy możesz wyjaśnić matematykę?
durron597,

@ durron597 Pewnie! Dodano wyjaśnienie do postu.
gastropner
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.