Stampa l'ennesimo numero non palindromico


22

Un numero palindromico (nel caso non lo sapessi) è un numero che legge lo stesso avanti e indietro (esempio 11). I primi numeri 15 non palindromi sono: 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26. Questo è A029742 . Ho costantemente bisogno di questi numeri, ma il mio blocco note è molto piccolo, quindi il tuo codice deve essere il più corto possibile.

Regole

  • Ogni invio deve essere un programma o una funzione completi (ad es. In C, non puoi semplicemente definire una funzione senza intestazioni, ma puoi definire una funzione CON le intestazioni necessarie).
  • Se possibile, fornire un collegamento a un sito in cui è possibile testare il programma.
  • Il tuo programma non deve scrivere nulla su STDERR.
  • Puoi prendere input come argomento o da STDIN(o l'alternativa più vicina nella tua lingua).
  • I programmi vengono classificati in base ai byte . Il solito set di caratteri è UTF-8, se ne stai usando un altro, specifica.
  • Sono vietate le scappatoie standard .

Casi test

1
==> 10

-----

5
==> 15

-----

12
==> 23

punteggio

Questo è , quindi vince meno byte.

Inseriti

Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, usando il seguente modello Markdown:

# Language Name, N bytes

dov'è Nla dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:

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

Se si desidera includere più numeri nell'intestazione (ad es. Perché il punteggio è la somma di due file o si desidera elencare separatamente le penalità del flag dell'interprete), assicurarsi che il punteggio effettivo sia l' ultimo numero nell'intestazione:

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

Puoi anche rendere il nome della lingua un collegamento che verrà quindi visualizzato nello snippet della classifica:

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

Classifica

Ecco uno snippet di stack per generare sia una classifica regolare che una panoramica dei vincitori per lingua.


1
Qualche testcase?
Leaky Nun,

@KennyLau Ne farò un po '.
George Gibson,

Possiamo usare un indice basato su 0, quindi 15sarebbe il 4 ° numero?
nimi,

@nimi In entrambi i casi, ma specifica se il tuo è indicizzato 0.
George Gibson,

@nimi Siamo spiacenti, questo è ciò che intendevo, ho modificato per chiarire.
George Gibson,

Risposte:


9

Pyth, 7 byte

e.f!_I`

Suite di test

Spiegazione:

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 byte

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

Utilizza un indice basato su 0. ([x|x<-[1..],(/=)<*>reverse$show x]!!) 11-> 23.

Il test su cui mantenere un numero si (/=)<*>reverse$show xtraduce (show x) /= (reverse (show x)), ovvero verifica se la rappresentazione in stringa del numero non è uguale al contrario della rappresentazione in stringa.


4

Brachylog , 14 11 byte

;0{<≜.↔¬}ⁱ⁽

-3 byte di serbatoi da fatalizzare

Spiegazione

; {      }ⁱ⁽        --  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

Provalo online!


;İ{ℕ≜.↔¬}ᶠ⁽tè di 2 byte più breve.
Fatalizza il

In realtà, l'utilizzo iterateè più corto di 1 byte:;0{<≜.↔¬}ⁱ⁽
Fatalizza il

3

Gelatina, 9 byte

1 byte grazie a @ Sp3000 .

ṚḌ_
0dz#Ṫ

Provalo online!

Suite di test.

Spiegazione

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
123Ṛ
Curiosità

@ Sp3000 Davvero molto interessante!
Leaky Nun,

Puoi rilasciare il ³. Se si inserisce l'input su STDIN, è possibile rilasciare 0anche. (Nell'ultima versione di Jelly, ṚḌ_ø#Ṫfunziona anche, ma è più recente di questa sfida.)
Dennis

Non funziona per me ...
Leaky Nun,

7 byte, ma può utilizzare funzionalità più recenti
caird coinheringaahing

3

05AB1E , 8 byte

Codice:

µNÂÂQ>i¼

Utilizza la codifica CP-1252 . Provalo online! .


Questo ha molto probabilmente a che fare con la vecchia versione di 05AB1E, ma per curiosità: perché il doppio biforcato Â? PS per chiunque legga questo: ora può essere di 5 byte µNÂʽ.
Kevin Cruijssen,

@KevinCruijssen: probabilmente a causa dell'output implicito di N (solo in cima allo stack). Inoltre, ora può essere di 4 byte poiché ½è anche implicito.
Emigna,

@Emigna Ah, ho completamente dimenticato di ½essere implicito, anche se l' ho menzionato in un suggerimento che ho scritto da solo ..>. < Ho pensato che ¼(aumenta il counter_variable di 1) fosse implicito per il ciclo while µper un momento, ma in effetti è il ½( se la parte superiore dello stack è 1: aumenta counter_variable di 1) invece ..
Kevin Cruijssen

3

Clojure, 62 byte

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

0-indicizzati. Genera un intervallo pigramente infinito di numeri non palindromici usando la comprensione dell'elenco e prendi iquello. Guardalo online: https://ideone.com/54wXI3


2

PowerShell v2 +, 65 byte

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

Passa attraverso i numeri da 0(valore implicito per non inizializzati$i ) fino a quando non troviamo input di $args[0]molte corrispondenze, quindi visualizza l'ultimo. Nota che non inizializziamo il loop, quindi $j=0è implicito.

Ogni iterazione, pre-incrementiamo $ie controlliamo se non è uguale a $iinverso. Se è così, ciò significa che abbiamo trovato un non-palindromo, quindi un incremento $j. Il ciclo continua quindi tutte le volte che è necessario.

Esempi

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 byte

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

Una funzione a un indice che accetta input ntramite argomento e restituisce iln numero non palindromico.

Come funziona

Questa è una ricerca ricorsiva esauriente, che verifica consecutivamente numeri interi inell'intervallo [1,∞)fino a quando nnon sono stati trovati numeri non palindromici; poiché iè pre-incrementato,i-1 viene quindi restituito. Verificare se un numero è palindromico viene eseguito convertendolo in una stringa, invertendo e quindi verificando che le stringhe originali e invertite siano uguali.

Il codice è logicamente equivalente a:

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)

che di per sé è essenzialmente:

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

Provalo su Ideone


2

Clojure, 62 byte

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

Un approccio abbastanza diverso rispetto all'altra risposta, ma uguale lunghezza.


2

R , 133 117 93 76 byte

-16 byte grazie a JayCe. -41 byte grazie a Giuseppe.

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

Provalo online!


1
Puoi abusare di alcuni byte F, ecc .: TIO . Inoltre, perché stai limitando il loop a (0:97)+10?
JayCe,

1
utilizzare il suggerimento n. 3 dalla mia risposta Suggerimenti per giocare a golf in R per estrarre le cifre; puoi fare all(D==rev(D))dov'è Dun vettore di cifre. Credo che un whileciclo sarà più breve e, come chiede @JayCe, perché controlli solo numeri tra 10 e 107?
Giuseppe,

@Giuseppe Aggiornato con i tuoi consigli. Ancora un po 'confuso su come implementare un whileloop risparmiando allo stesso tempo byte.
Robert S.

1
@RobertS. se avete domande, sentitevi liberi di chiamarmi nella chat R !
Giuseppe,

2

Forth (gforth) , 103 99 byte

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

Provalo online!

Spiegazione

Ripeti n volte, ogni iterazione trova il successivo numero non palindromico incrementando un contatore di 1 fino a quando il numero non si eguaglia da solo

Codice Ungolfed

Normalmente non "annullerei" il codice, ma dato che questo codice è un po 'disordinato, ho pensato che sarebbe stato d'aiuto

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

Spiegazione del codice

: 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 byte

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

(usa indice basato su 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
}

Uso:

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

In realtà, 17 byte

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

Provalo online!

I valori sono 1 indicizzati. Questo potrebbe essere facilmente cambiato in 0-indexed sostituendo il primo Rconr . Ma,R è quello che ho digitato inizialmente, quindi è quello con cui sto andando.

I numeri non palindromici soddisfano a(n) ≈ n + 10, quindi2n+9 è un limite superiore sufficiente.

Spiegazione:

;τ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 byte

Utilizza l'indicizzazione basata su 1. Funziona solo fino al 7624 ° numero.

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

uso

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 byte

Non utilizza la ricorsione e quindi può gestire input molto più grandi.

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

uso

(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 (utilizzando una libreria esterna) (97 byte)

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

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

Spiegazione del codice: la libreria ha un metodo statico chiamato Sequence, in cui il primo parametro definisce il numero di elementi che la sequenza garantirà di creare e il secondo parametro è un predicato che accetta l'attuale valore di iterazione, "i". Il predicato converte il numero intero in una stringa, che viene convertita in un array di caratteri chiamando _.From. L'array char viene confrontato con l'inversione dell'array char e, se non sono uguali, l'array char viene unito nuovamente in una stringa e restituito. Altrimenti, non viene restituito nulla (ovvero il risultato non è definito, che la libreria ignorerà sempre). Infine, viene restituito l'ultimo elemento della sequenza, ovvero l'ennesimo elemento

inserisci qui la descrizione dell'immagine


1

C, 84 byte

La funzione f(n)accetta numeri interi ne restituisce un numero n-thnon palindromico (basato su 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;}

Provalo su Ideone!

È un codice abbastanza banale, quindi probabilmente c'è spazio per miglioramenti.


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

1

Rubino, 54 byte

Questa funzione è 1 indicizzata ed è parzialmente basata sulla risposta Javascript di Dom Hastings . Penso che ci sia un modo per giocare a golf così meglio, specialmente con l'ultima condizione ternaria. Inoltre, questa funzione attualmente restituisce una stringa, che potrebbe essere necessario modificare in seguito. Tutti i suggerimenti per il golf sono i benvenuti.

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

Ungolfed:

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 byte

È basato su 1 e l'algoritmo è davvero ingenuo

#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 per quanto riguarda la tua modifica: #importè un'estensione del compilatore di gcc. È deprecato, ma questo non ha molta importanza qui
ovs

1

APL NARS 35 caratteri

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

è la funzione v; "⍎⌽⍕" r traslate numero r in stringa, inverte quella stringa, traslate da stringa a numero. Funzioni di test e aiuto:

  ⍝ 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

buccia , 6 byte

Sì per :)

!fS≠↔N

Provalo online!

Spiegazione

 f   N  -- filter the naturals by:
  S≠    --   is it not equal to..
    ↔   --   ..itself reversed
!       -- index into that list


1

C # 7, 89 byte

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

1 indicizzato Prova su 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

Non penso che questo utilizzi alcuna funzionalità del linguaggio da c # 7, ma ho messo lì dal momento che è quello che ho testato


Benvenuti in PPCG.
Jonathan Frech,


1

Java 8, 117 95 94 byte

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

0-indicizzato

Spiegazione:

Provalo qui.

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 Che fornisce risultati errati .. new StringBuffer(int)non è uguale a new StringBuffer(String), né è String.equals(StringBuffer)invece di String.equals(String).. Questa è una vecchia risposta, quindi posso usare (++r+"").contains(new StringBuffer(r+"").reverse())per salvare 1 byte.
Kevin Cruijssen il

-2

TCC, 11 byte

?>!~<>;i;'T

Provalo 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
Questo non funziona con il tcc.luafile con timestamp 16-07-26 12:46 UTC, che non aveva il ?>comando. Se la tua risposta richiede una versione della lingua che postdatasse la sfida, devi etichettarla come non competitiva nell'intestazione. Rimuoverò il mio downvote quando lo farai.
Dennis,

@Dennis Mi sono imbattuto in questo post di due anni e volevo menzionare che le risposte non sono più da contrassegnare come non concorrenti quando la loro lingua post-date la sfida.
Jonathan Frech,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.