Wydrukuj N-ty niepalindromiczny numer


22

Liczba palindromowa (na wypadek, gdybyś nie wiedział) to liczba, która czyta to samo do tyłu i do przodu (na przykład 11). Pierwsze numery 15 non-palindromowe to: 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26. To jest A029742 . Ciągle potrzebuję tych liczb, ale mój notes jest bardzo mały, więc twój kod musi być jak najkrótszy.

Zasady

  • Każde przesłanie musi być pełnym programem lub funkcją (np. W C nie można po prostu zdefiniować funkcji bez nagłówków, ale można zdefiniować funkcję Z niezbędnymi nagłówkami).
  • Jeśli to możliwe, podaj link do strony, na której można przetestować Twój program.
  • Twój program nie może nic pisać STDERR.
  • Możesz wziąć dane wejściowe jako argument lub z STDIN(lub najbliższej alternatywy w twoim języku).
  • Programy są oceniane według bajtów . Typowy zestaw znaków to UTF-8, jeśli używasz innego, proszę podać.
  • Standardowe luki są zabronione.

Przypadki testowe

1
==> 10

-----

5
==> 15

-----

12
==> 23

Punktacja

To jest , więc wygrywa najmniej bajtów.

Zgłoszenia

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

# Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

# Perl, 43 + 2 (-p flag) = 45 bytes

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

Tabela liderów

Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.


1
Jakieś przypadki testowe?
Leaky Nun

@KennyLau Zrobię trochę.
George Gibson

Czy możemy zastosować indeks oparty na 0, więc 15byłby to czwarty numer?
nimi

@nimi Albo, ale proszę podać, czy twoje jest indeksowane na 0.
George Gibson,

@nimi Przepraszamy, o to mi chodziło, edytowałem je dla wyjaśnienia.
George Gibson

Odpowiedzi:


9

Pyth, 7 bajtów

e.f!_I`

Zestaw testowy

Wyjaśnienie:

e.f!_I`
e.f!_I`ZQ    Implicit variable introduction.
 .f     Q    Find the first Q numbers whether the following is truthy,
             starting at 1, where Q is the input.
      `Z     Convert the number to a string.
     _I      Check if it's the same when reversed.
    !        Logical not.
 e           Return the last element of the list.

5

Haskell, 38 bajtów

([x|x<-[1..],(/=)<*>reverse$show x]!!)

Używa indeksu 0. ([x|x<-[1..],(/=)<*>reverse$show x]!!) 11-> 23.

Test, czy zachować liczbę, (/=)<*>reverse$show xprzekłada się na (show x) /= (reverse (show x)), tzn. Sprawdź, czy reprezentacja ciągu liczby nie jest równa odwrotności reprezentacji ciągu.


4

Brachylog , 14 11 bajtów

;0{<≜.↔¬}ⁱ⁽

-3 bajty czołgów do Fatalize

Wyjaśnienie

; {      }ⁱ⁽        --  Find the nth number
 0                  --      (starting with 0)
   <                --      which is bigger then the previous one
    ≜               --      make explicit (otherwise it fucks up)
      .             --      which is the output
       ↔            --      and if reversed
        ¬           --      is not the output

Wypróbuj online!


;İ{ℕ≜.↔¬}ᶠ⁽tjest o 2 bajty krótszy.
Fatalize

W rzeczywistości użycie iteratejest o 1 bajt krótsze:;0{<≜.↔¬}ⁱ⁽
Fatalize

3

Galaretka, 9 bajtów

1 bajt dzięki @ Sp3000 .

ṚḌ_
0dz#Ṫ

Wypróbuj online!

Zestaw testowy.

Wyjaśnienie

DUḌ_   Helper link. Check if x is not palindrome.

D      Convert to decimal.
 U     Reverse.
  Ḍ    Convert back to integer.
   _   Subtract x from the result above.
       For 23, this will yield 32-23 = 9.
       Only yield 0 (falsy) if x is palindrome.
       If x is not a palindrome,
       it will return a truthy number.


0dz#Ṫ  Main link.

0      Start from 0.
   #   Find the first         numbers:
  ³                   <input>
 Ç         where the above link returns a truthy number.
    Ṫ  Yield the last of the matches.

1
Ciekawostka: spróbuj123Ṛ
Sp3000

@ Sp3000 Rzeczywiście bardzo interesujące!
Leaky Nun

Możesz upuścić ³. Jeśli umieścisz wejście na STDIN, możesz również upuścić 0. (W najnowszej wersji Jelly ṚḌ_ø#Ṫteż działa, ale jest nowsza niż to wyzwanie.)
Dennis

Nie działa dla mnie ...
Leaky Nun

7 bajtów, ale może korzystać z nowszych funkcji
Cairney Coheringaahing

3

05AB1E , 8 bajtów

Kod:

µNÂÂQ>i¼

Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .


Najprawdopodobniej ma to coś wspólnego ze starą wersją 05AB1E, ale z ciekawości: dlaczego podwójnie rozwidlił się Â? PS dla każdego, kto to czyta: Może teraz mieć 5 bajtów µNÂʽ.
Kevin Cruijssen

@KevinCruijssen: Prawdopodobnie z powodu niejawnego wyjścia N (tylko górna część stosu). Ponadto może być teraz 4 bajty, ponieważ ½jest również domyślny.
Emigna,

@Emigna Ach, zupełnie zapomniałem o ½domniemaniu, mimo że wspomniałem o tym we wskazówce, którą sam napisałem ..>. <Myślałem, że ¼(wzrost przeciw zmiennej o 1) jest przez chwilę domyślny dla pętli while µ, ale w rzeczywistości jest to ½( jeśli szczyt stosu to 1: zamiast tego
zwiększ licznik_zmienności

3

Clojure, 62 bajty

#(nth(for[i(range):when(not=(seq(str i))(reverse(str i)))]i)%)

0-indeksowane. Wygeneruj leniwie nieskończony zakres liczb niepalindromicznych za pomocą analizy list i weź ijeden. Zobacz online: https://ideone.com/54wXI3


2

PowerShell v2 +, 65 bajtów

for(;$j-lt$args[0]){if(++$i-ne-join"$i"["$i".length..0]){$j++}}$i

Pętle przechodzą przez liczby od 0(wartość domyślna dla niezainicjowanego $i), dopóki nie znajdziemy wejściowych $args[0]wielu dopasowań, a następnie wyprowadza ostatnią. Zauważ, że nie inicjujemy pętli, więc $j=0jest niejawna.

Każdą iterację wstępnie zwiększamy $ii sprawdzamy, czy nie jest ona równa $iodwrotności. Jeśli tak, oznacza to, że znaleźliśmy nie-palindrom, więc przyrost $j. Pętla jest kontynuowana tyle razy, ile to konieczne.

Przykłady

PS C:\Tools\Scripts\golfing> .\print-nth-palindromic-number.ps1 100
120

PS C:\Tools\Scripts\golfing> .\print-nth-palindromic-number.ps1 5
15

PS C:\Tools\Scripts\golfing> .\print-nth-palindromic-number.ps1 55
70

PS C:\Tools\Scripts\golfing> .\print-nth-palindromic-number.ps1 212
245

2

Python 2, 60 bajtów

f=lambda n,i=0,j=1:j>n and i-1or f(n,i+1,j+(`i`!=`i`[::-1]))

Funkcja o jednym indeksie, która pobiera dane wejściowe nprzez argument i zwraca nth liczbę niepalindromiczną.

Jak to działa

Jest to wyczerpujące wyszukiwanie rekurencyjne, które kolejno testuje liczby całkowite iw zakresie, [1,∞)dopóki nnie zostaną znalezione liczby niepalindromiczne; ponieważ ijest wstępnie zwiększany, i-1jest następnie zwracany. Testowanie, czy liczba jest palindromiczna, jest przeprowadzane przez konwersję na ciąg znaków, odwracanie, a następnie sprawdzanie, czy ciągi oryginalne i odwrócone są równe.

Kod jest logicznie równoważny z:

def f(n,test=0,count=1):
    if count>n:
        return test
    elif str(test)!=reversed(str(test)):
        return f(n,test+1,count+1)
    else:
        return f(n,test+1,count)

który sam w sobie jest zasadniczo:

def f(n):
    test=0
    count=1
    while count<=n:
        if str(test)!=reversed(str(test)):
            count+=1
        test+=1
    return test-1

Wypróbuj na Ideone


2

Clojure, 62 bajty

#(nth(filter(fn[i](not=(seq i)(reverse i)))(map str(range)))%)

Zupełnie inne podejście niż druga odpowiedź, ale jednakowa długość.


2

R , 133 117 93 76 bajtów

-16 bajtów dzięki JayCe. -41 bajtów dzięki Giuseppe.

x=scan();while({F=F+any((D=T%/%10^(1:nchar(T)-1)%%10)!=rev(D));F<=x})T=T+1;T

Wypróbuj online!


1
Możesz nadużywać niektórych bajtów Fitp .: TIO . Ponadto, dlaczego ograniczasz pętlę do (0:97)+10?
JayCe,

1
użyj końcówki # 3 z mojej odpowiedzi Wskazówki dotyczące gry w golfa w R, aby wyodrębnić cyfry; możesz zrobić, all(D==rev(D))gdzie Djest wektor cyfr. Wierzę, że whilepętla będzie krótsza i jak pyta @JayCe, dlaczego sprawdzasz tylko liczby od 10 do 107?
Giuseppe,

@Giuseppe Zaktualizowano o twoje rekomendacje. Wciąż trochę myli się, jak zaimplementować whilepętlę, jednocześnie oszczędzając bajty.
Robert S.

1
@RobertS. Jeśli masz jakieś pytania, nie krępuj się pingować mnie na czacie R !
Giuseppe,

2

Dalej (gforth) , 103 99 bajtów

: f 9 swap 0 do begin 1+ dup 0 over begin 10 /mod >r swap 10 * + r> ?dup 0= until = 0= until loop ;

Wypróbuj online!

Wyjaśnienie

Pętla n razy, każda iteracja znajduje następną niepalindromiczną liczbę, zwiększając licznik o 1, aż liczba nie będzie równa się odwróceniu

Kod niepoznany

Normalnie nie „odhuliłbym” kodu, ale ponieważ ten kod jest nieco niechlujny, pomyślałem, że to pomoże

: reverse ( s -- s )
    0 swap 
    begin 
        10 /mod
        >r swap
        10 * +
        r> ?dup 0=
    until 
; 

: f ( s -- s )
    9 swap 0
    0
    do
        begin
            1+ dup dup
            reverse =
        0= until
    loop
;

Objaśnienie kodu

: f                \ start a new word definition
  9                \ start at 9, since all positive ints < 10 are palindromic
  swap 0           \ set up loop parameters from 0 to n-1
  do               \ start a counted loop       
    begin          \ start an indefinite loop
      1+ dup       \ increment counter and place a copy on the stack
      ( Reverse )
      0 over       \ add 0 to the stack (as a buffer) and copy the top counter above it
      begin        \ start another indefinite loop
        10 /mod    \ get the quotient and remainder of dividing the number by 10
        >r         \ store the quotient on the return stack
        swap 10 *  \ multiply the current buffer by 10
        +          \ add the remainder to the buffer
        r>         \ grab the quotient from the return stack
        ?dup       \ duplicate if not equal to 0
        0=         \ check if equal to 0
      until        \ end inner indefinite loop if quotient is 0
      ( End Reverse )
      = 0=         \ check if counter =/= reverse-counter            
    until          \ end the outer indefinite loop if counter =/= reverse-counter
  loop             \ end the counted loop
;                  \ end the word definition 

1

Perl 6 , 29 bajtów

{grep({$_!= .flip},^Inf)[$_]}

(używa indeksu 0)

{         # The $_ is implied above
  grep(   # V
    { $_ != $_.flip }, # only the non-palindromic elements of
    ^Inf               # an Infinite list ( 0,1,2,3 ...^ Inf )
  )[ $_ ]              # grab the value at the given index
}

Stosowanie:

my &non-palindrome = {grep({$_!= .flip},^Inf)[$_]}

say non-palindrome 1  - 1; # 10
say non-palindrome 5  - 1; # 15
say non-palindrome 12 - 1; # 23

# this also works:
say non-palindrome 0..20;
# (10 12 13 14 15 16 17 18 19 20 21 23 24 25 26 27 28 29 30 31 32)

1

Właściwie 17 bajtów

;τR9+;`$;R=Y`M@░E

Wypróbuj online!

Wartości są indeksowane 1. To może być łatwo zmieniona na 0-indeksowane przez zastąpienie pierwszy Rzr . Ale Rto jest to , co początkowo napisałem, więc o to mi chodzi.

Liczby niepalindromiczne spełniają a(n) ≈ n + 10więc, więc2n+9 jest wystarczającą górną granicą.

Wyjaśnienie:

;τR9+;`$;R=Y`M@░E
;τ9+R;             push n, range(1,(2*n)+10)
      `$;R=Y`M@░   take values that are not palindromic
                E  take nth element

1

JavaScript (ES6), 54 bajty

Wykorzystuje indeksowanie 1. Działa tylko do 7624. numeru.

d=(i,a=0)=>i?d(i-=++a!=[...''+a].reverse().join``,a):a

Stosowanie

d=(i,a=0)=>i?d(i-=++a!=[...''+a].reverse().join``,a):a
d(1)
10
d(123)
146
d(7624)
7800
d(7625)
// Uncaught RangeError: Maximum call stack size exceeded

JavaScript (ES6), 59 bajtów

Nie używa rekurencji, więc może obsługiwać znacznie większe dane wejściowe.

i=>eval("for(a=9;i-=++a!=[...`${a}`].reverse().join``;);a")

Stosowanie

(i=>eval("for(a=9;i-=++a!=[...`${a}`].reverse().join``;);a"))(1)
10
(i=>eval("for(a=9;i-=++a!=[...`${a}`].reverse().join``;);a"))(7625)
7801
(i=>eval("for(a=9;i-=++a!=[...`${a}`].reverse().join``;);a"))(123456)
124579

1

JavaScript (przy użyciu zewnętrznej biblioteki) (97 bajtów)

n=>_.Sequence(n,i=>{i=_.From(i+"");if(!i.Reverse().SequenceEqual(i)){return i.Write("")}}).Last()

Link do lib: https://github.com/mvegh1/Enumerable

Objaśnienie kodu: Biblioteka ma metodę statyczną o nazwie Sekwencja, w której pierwszy parametr określa liczbę elementów, które sekwencja gwarantuje do utworzenia, a drugi parametr jest predykatem akceptującym bieżącą wartość iteracji „i”. Predykat konwertuje liczbę całkowitą na ciąg znaków, który jest konwertowany na tablicę char przez wywołanie _.From. Tablica char jest porównywana z odwróceniem tablicy char, a jeśli nie są one równe, tablica char jest ponownie łączona w łańcuch i zwracana. W przeciwnym razie nic nie jest zwracane (tzn. Wynik jest niezdefiniowany, co biblioteka zawsze będzie ignorować). Na koniec zwracany jest ostatni element sekwencji, tj. N-ty element

enter image description here


1

C, 84 bajtów

Funkcja f(n)przyjmuje liczbę całkowitą ni zwraca n-thliczbę niepalindromiczną (na podstawie 1).

g(n,r){return n?g(n/10,r*10+n%10):r;}s;f(n){for(s=9;n--;g(++s,0)==s&&s++);return s;}

Przetestuj na Ideone!

Jest to dość trywialny kod, więc prawdopodobnie jest miejsce na ulepszenia.


Zaproponuj n=n?g(n/10,r*10+n%10):r;}s;f(n){for(s=9;n--;g(++s,0)-s||s++);n=s;zamiastreturn n?g(n/10,r*10+n%10):r;}s;f(n){for(s=9;n--;g(++s,0)==s&&s++);return s;
ceilingcat

1

Rubinowy, 54 bajty

Ta funkcja ma indeks 1 i jest częściowo oparta na odpowiedzi Javascript Dom Hastingsa . Wydaje mi się, że istnieje lepszy sposób na grę w golfa, zwłaszcza w przypadku tej ostatniej trójki. Ponadto ta funkcja obecnie zwraca ciąg, który może wymagać późniejszej edycji. Wszelkie sugestie dotyczące gry w golfa są mile widziane.

f=->x,y=?9{x<1?y:(y.next!.reverse!=y)?f[x-1,y]:f[x,y]}

Nie golfowany:

def f(x, y="9")
 if x<1
  return y
 else
  y = y.next
  if y.reverse != y
   return f(x-1, y)
  else
   return f(x, y)
  end
 end
end

1

C ++ (GCC), 148 bajtów

Jest oparty na 1, a algorytm jest naprawdę naiwny

#import <iostream>
using namespace std;int n,i=1;string s;main(){cin>>n;while(s=to_string(i+1),(n+=equal(begin(s),end(s),s.rbegin()))-i++);cout<<i;}

@enedil dotyczący twojej edycji: #importto rozszerzenie kompilatora gcc. Jest przestarzałe, ale nie ma to tak naprawdę znaczenia
2017

1

APL NARS 35 znaków

r←v a;c
r←c←0
A:r+←1⋄c+←r≠⍎⌽⍕r⋄→A×⍳c<a

jest to funkcja v; „⍎⌽⍕” r przekształca liczbę w ciąg znaków, odwraca ten ciąg, przenosi z ciągu na ciąg. Funkcje testowe i pomocnicze:

  ⍝ return the one string for the basic types ('Char', 'Int', 'Float', 'Complex or Quaternion or Oction')
  ⍝ or one string for composite types ('Tensor 3' 'Tensor 4' etc 'Matrix', 'List', 'String')
  ⍝ follow the example in: /codegolf//a/39745
  type←{v←⍴⍴⍵⋄v>2:'Tensor ',⍕v⋄v=2:'Matrix'⋄(v=1)∧''≡0↑⍵:'String'⋄''≡0↑⍵:'Char'⋄v=1:'List'⋄⍵≢+⍵:'Complex or Quaternion or Oction'⋄⍵=⌈⍵:'Int'⋄'Float'}
  h←{'Int'≢type ⍵:¯1⋄(⍵<1)∨⍵>2e5:¯1⋄v ⍵} 
  h 1
10
  h 1.32
¯1
  h 7878
8057
  h¨3 5 12
13 15 23 
  h 6 7 8
¯1
  h '123'
¯1
  h '1'
¯1
  h 1.0
10
  h 1.0003
¯1
  h ¯2
¯1
  h 0
¯1
  h 200000
201200
  h 200001
¯1



1

C # 7, 89 bajtów

n=>{int i=9;for(;n-->0;)if(Enumerable.SequenceEqual(++i+"",(""+i).Reverse()))i++;return i;}

1 zindeksowany Wypróbuj Repl.It

n=>
  int i = 9;                                  | Start at 9. Iterate exactly n times. Assume n >= 1      
  for(;n-->0;)                                | Iterate n times
  if(EnumerableSequenceEqual(                 | Compare two sequences
  ++i+"",(""+i).Reverse())                    | Generate the forward and backward strings, which behave like char sequences for Linq
  i++                                         | If the sequences are equal, the number is a palindrome. Increment i to skip
  return i;                                   | Return the number after the for loop exits

Nie sądzę, aby używało to żadnych funkcji językowych z c # 7, ale umieściłem je tam, ponieważ to właśnie przetestowałem


Witamy w PPCG.
Jonathan Frech,


1

Java 8, 117 95 94 bajtów

n->{int r=10;for(;n-->0;)if((++r+"").contains(new StringBuffer(r+"").reverse()))r++;return r;}

0-indeksowane

Wyjaśnienie:

Wypróbuj tutaj.

n->{             // Method with integer as both parameter and return-type
  int r=10;      //  Result-integer, starting at 10
  for(;n-->0;)   //  Loop an amount of times equal to the input
    if((++r+"")  //   First raise `r` by 1, and then check if `r`
               .contains(new StringBuffer(r+"").reverse()))
                 //   is the same as `r` reversed (and thus a palindrome)
      r++;       //    And if it is: raise `r` by 1 again
  return r;}     //  Return result-integer

@ceilingcat To daje niepoprawne wyniki .. new StringBuffer(int)nie jest równe new StringBuffer(String), ani nie jest String.equals(StringBuffer)zamiast String.equals(String).. To jest stara odpowiedź, więc mogę użyć, (++r+"").contains(new StringBuffer(r+"").reverse())aby zapisać 1 bajt.
Kevin Cruijssen

-2

TCC, 11 bajtów

?>!~<>;i;'T

Wypróbuj online!

            | Printing is implicit
?>          | Find n-th number for which the following is "T":
  !~        | If not equal...
    <>;     | reverse. No value specified, so input is assumed.
       i;   | Input, since double semicolons are ignored
         'T | ... print string "T"

1
To nie działa z tcc.luaplikiem ze znacznikiem czasu 16-07-26 12:46 UTC, który nie miał ?>polecenia. Jeśli twoja odpowiedź wymaga wersji językowej, która opublikowała wyzwanie, musisz oznaczyć ją w nagłówku jako niekonkurującą . Kiedy to zrobię, usunę moją opinię.
Dennis

@Dennis Natknąłem się na ten dwuletni post i chciałem wspomnieć, że odpowiedzi nie będą już oznaczane jako niekonkurencyjne, kiedy ich język pojawi się po wyzwaniu.
Jonathan Frech,
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.