Надрукуйте n-е непаліндромне число


22

Паліндромне число (якщо ви цього не знаєте) - це число, яке читається однаково назад і вперед (наприклад, 11). Перший 15 непаліндромний номер: 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26. Це A029742 . Мені постійно потрібні ці номери, але мій липкий блокнот дуже малий, тому ваш код повинен бути якомога коротшим.

Правила

  • Кожне подання повинно бути повноцінною програмою або функцією (наприклад, в C, ви не можете просто визначити функцію без заголовків, але ви можете визначити функцію З необхідними заголовками).
  • Якщо це можливо, надайте посилання на сайт, де можна перевірити вашу програму.
  • Ваша програма не повинна нічого писати на STDERR.
  • Ви можете взяти дані як аргумент або з STDIN(або найближчої альтернативи вашій мові).
  • Програми оцінюються відповідно до байтів . Звичайний набір символів - UTF-8, якщо ви використовуєте інший, будь ласка, вкажіть.
  • Стандартні лазівки заборонені.

Випробування

1
==> 10

-----

5
==> 15

-----

12
==> 23

Оцінка балів

Це , тому виграє найменше байт.

Подання

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

# Language Name, N bytes

де Nрозмір вашого подання. Якщо ви покращите свій рахунок, ви можете зберегти старі бали у заголовку, прокресливши їх. Наприклад:

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

Якщо ви хочете включити у свій заголовок декілька чисел (наприклад, тому що ваш показник становить суму двох файлів або ви хочете окремо перерахувати штрафні санкції для перекладача), переконайтеся, що фактичний бал є останнім номером у заголовку:

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

Ви також можете зробити ім'я мови посиланням, яке потім з’явиться у фрагменті таблиць лідерів:

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

Таблиця лідерів

Ось фрагмент стека для створення як звичайного табло, так і огляду переможців за мовою.


1
Будь-які тести?
Лина монашка

@KennyLau Я зроблю кілька.
Джордж Гібсон

Чи можемо ми використовувати індекс на основі 0, таким 15би було 4-е число?
німі

@nimi Будь-ласка, але вкажіть, чи ваш 0-індексований.
Джордж Гібсон

@nimi Вибачте, ось що я мав на увазі, відредагував, щоб уточнити.
Джордж Гібсон

Відповіді:


9

Pyth, 7 байт

e.f!_I`

Тестовий набір

Пояснення:

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 байт

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

Використовує індекс на основі 0. ([x|x<-[1..],(/=)<*>reverse$show x]!!) 11-> 23.

Тест на те, чи слід зберігати число, (/=)<*>reverse$show xозначає (show x) /= (reverse (show x)), що перевірити, чи рядкове представлення числа не дорівнює звороту подання рядка.


4

Брахілог , 14 11 байт

;0{<≜.↔¬}ⁱ⁽

-3 байт танки для Fatalize

Пояснення

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

Спробуйте в Інтернеті!


;İ{ℕ≜.↔¬}ᶠ⁽tна 2 байти коротше.
Фаталізувати

Насправді використання iterateна 1 байт коротше:;0{<≜.↔¬}ⁱ⁽
Фаталізувати

3

Желе, 9 байт

1 байт завдяки @ Sp3000 .

ṚḌ_
0dz#Ṫ

Спробуйте в Інтернеті!

Тестовий набір.

Пояснення

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Ṛ
Sp3000

@ Sp3000 Дуже цікаво!
Leaky Nun

Можна скинути ³. Якщо ви розмістите вхід на STDIN, ви можете також упустити його 0. (В останній версії Jelly, ṚḌ_ø#Ṫтеж працює, але це новіше , ніж цей виклик.)
Денніс

Не працює для мене ...
Leaky Nun

7 байт, але він може використовувати новіші функції
caird coinheringaahing

3

05AB1E , 8 байт

Код:

µNÂÂQ>i¼

Використовує кодування CP-1252 . Спробуйте в Інтернеті! .


Це, швидше за все, стосується старої версії 05AB1E, але з цікавості: чому подвійний роздвоєний Â? PS для всіх, хто читає це: Тепер може бути 5 байт µNÂʽ.
Кевін Cruijssen

@KevinCruijssen: Ймовірно, через відсутність неявного виводу N (лише верхня частина стека). Крім того, це може бути 4 байти, оскільки значення ½також є неявним.
Емінья

@Emigna Ах, зовсім забув про ½бути неявним, хоча я згадав про це в наконечнику я написав сам ..>. <Думав , що ¼(збільшення counter_variable на 1) малося на увазі для в той час як петлі µна мить, але це дійсно ½( якщо вершина стека дорівнює 1: замість цього збільшить counter_variable на 1) ..
Кевін Круїйсен

3

Clojure, 62 байти

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

0-індексований. Створіть ліниво нескінченний діапазон непаліндромних чисел, використовуючи розуміння списку, і візьміть iйого. Дивіться це в Інтернеті: https://ideone.com/54wXI3


2

PowerShell v2 +, 65 байт

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

Перебирає числа з 0(неявне значення для неініціалізованих $i), поки ми не знайдемо вхід $args[0]багато збігів, а потім виводить останнє. Зауважте, що ми не ініціалізуємо цикл, тому $j=0це неявно.

Кожну ітерацію ми попередньо збільшуємо $iі перевіряємо, чи не вона дорівнює $iзворотній. Якщо це так, це означає, що ми знайшли неаліндром, тому приріст $j. Потім цикл продовжується стільки разів, скільки потрібно.

Приклади

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 байт

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

Одноіндексована функція, яка приймає введення nчерез аргумент і повертає nне непаліндромне число.

Як це працює

Це вичерпний рекурсивний пошук, який послідовно тестує цілі числа iв діапазоні, [1,∞)поки nне будуть знайдені непаліндромні числа; оскільки iпопередньо збільшується, i-1то повертається. Тестування того, чи є число паліндромним, проводиться шляхом перетворення на рядок, обернення назад, а потім перевірка рівності початкових та зворотних рядків.

Код логічно еквівалентний:

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)

що саме по суті:

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

Спробуйте це на Ideone


2

Clojure, 62 байти

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

Зовсім інший підхід, ніж інша відповідь, але однакової довжини.


2

R , 133 117 93 76 байт

-16 байт завдяки JayCe. -41 байт завдяки Джузеппе.

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

Спробуйте в Інтернеті!


1
Ви можете зловживати деякими байтами Fтощо: TIO . Крім того, чому ви обмежуєте цикл (0:97)+10?
JayCe

1
скористайтеся порадою №3 з моєї відповіді Поради щодо гольфу в R для отримання цифр; ви можете робити all(D==rev(D))там, де Dє вектор цифр. Я вірю, що whileцикл буде коротшим, і як @JayCe запитує, чому ви лише перевіряєте цифри між 10 і 107?
Джузеппе

@Giuseppe Оновлено вашими рекомендаціями. Ще трохи розгублено, як реалізувати whileцикл, одночасно зберігаючи байти.
Роберт С.

1
@RobertS. якщо у вас є якісь запитання, не соромтеся пінг мені в R-кімнату !
Джузеппе

2

Четвертий (gforth) , 103 99 байт

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

Спробуйте в Інтернеті!

Пояснення

Цикл n разів, кожна ітерація знаходить наступне непаліндромне число, збільшуючи лічильник на 1, поки число не дорівнює самому зворотному

Кодекс без вогню

Зазвичай я б не "не переймав" код, але, оскільки цей код дещо безладний, я вважав, що це допоможе

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

Пояснення коду

: 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 байт

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

(використовує індекс на основі 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
}

Використання:

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

Власне, 17 байт

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

Спробуйте в Інтернеті!

Значення є 1-індексованими. Це можна легко змінити на 0-індексувати, замінивши перший Rна r. Але, Rце те, що я спочатку набрав, тож саме з цим я йду.

Непаліндромні числа задовольняють a(n) ≈ n + 10, тому 2n+9є достатньою верхньою межею.

Пояснення:

;τ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 байти

Використовує індексацію на основі 1. Працює лише до 7624-го числа.

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

Використання

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 байт

Не використовує рекурсії, тому може обробляти набагато більші введення.

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

Використання

(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 (за допомогою зовнішньої бібліотеки) (97 байт)

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

Посилання на lib: https://github.com/mvegh1/Eumerable

Пояснення коду: Бібліотека має статичний метод під назвою Sequence, де перший парам визначає, скільки елементів гарантуватиме послідовність, а другий параметр - це предикат, що приймає поточне значення ітерації, "i". Присудок перетворює ціле число в рядок, який перетворюється в масив char за допомогою виклику _.From. Масив char порівнюється з реверсуванням масиву char, а якщо вони не рівні, масив char з'єднується назад у рядок та повертається. В іншому випадку нічого не повертається (тобто результат не визначений, що бібліотека завжди буде ігнорувати). Нарешті, повертається останній елемент послідовності, тобто N-й елемент

введіть тут опис зображення


1

C, 84 байти

Функція f(n)приймає ціле число nі повертає n-thнепаліндромне число (на основі 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;}

Перевірте це на Ideone!

Це досить тривіальний код, тому, можливо, є простір для вдосконалення.


Запропонувати n=n?g(n/10,r*10+n%10):r;}s;f(n){for(s=9;n--;g(++s,0)-s||s++);n=s;замістьreturn n?g(n/10,r*10+n%10):r;}s;f(n){for(s=9;n--;g(++s,0)==s&&s++);return s;
roofcat

1

Рубін, 54 байти

Ця функція є 1-індексованою і частково заснована на відповіді Javascript на Домі Гастінгсі . Я думаю, що є спосіб пограти в гольф краще, особливо з останнім потрійним станом. Також ця функція наразі повертає рядок, яку, можливо, потрібно буде редагувати пізніше. Будь-які пропозиції щодо гольфу вітаються.

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

Безголівки:

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 байт

Він заснований на 1, і алгоритм дійсно наївний

#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 щодо вашої редакції: #importце розширення компілятора gcc. Це застаріло, але це насправді не має значення
вт

1

APL NARS 35 символів

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

це функція v; "⍎⌽⍕" r перекладене число r в рядку, переверне його, перекладене з рядка на число. Тестові та довідкові функції:

  ⍝ 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 байт

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

1 індексований спробуйте на 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

Я не думаю, що для цього використовуються мовні функції від c # 7, але я поклав туди, оскільки це те, на що я протестував


Ласкаво просимо до PPCG.
Джонатан Фрех


1

Java 8, 117 95 94 байт

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

0-індексований

Пояснення:

Спробуйте тут.

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 Це дає невірні результати .. new StringBuffer(int)не дорівнює new StringBuffer(String), а не String.equals(StringBuffer)замість цього String.equals(String). Однак це стара відповідь, тому я можу використовувати (++r+"").contains(new StringBuffer(r+"").reverse())для збереження 1 байт.
Кевін Круїссен

-2

TCC, 11 байт

?>!~<>;i;'T

Спробуйте в Інтернеті!

            | 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
Це не працює з tcc.luaфайлом із позначкою часу 16-07-26 12:46 UTC, який не мав ?>команди. Якщо у вашій відповіді потрібна версія мови, яка подає виклик, ви повинні позначити її як не конкуруючу у заголовку. Я зніму свій потік, коли ви це зробите.
Денніс

@Денніс Я наткнувся на цю дворічну посаду і хотів зазначити, що відповіді тепер більше не відзначаються як неконкурентоспроможні, коли їх мова після дати виклику.
Джонатан Фрех
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.