Распечатать 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

счет

Это , поэтому выигрывает минимум байтов.

Материалы

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

# 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

Leaderboard

Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.


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 байта танков для фатализации

объяснение

; {      }ⁱ⁽        --  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 байта короче.
Fatalize

На самом деле, использование iterateна 1 байт короче:;0{<≜.↔¬}ⁱ⁽
Fatalize

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.


@ Sp3000 Очень интересно на самом деле!
Лаки Монахиня

Вы можете бросить ³. Если вы поместите вход в STDIN, вы также можете сбросить его 0. (В последней версии Jelly ṚḌ_ø#Ṫтоже работает, но это новее, чем этот вызов.)
Деннис

Не работает для меня ...
Leaky Nun

7 байт, но он может использовать более новые функции
caird coinheringaahing

3

05AB1E , 8 байтов

Код:

µNÂÂQ>i¼

Использует кодировку CP-1252 . Попробуйте онлайн! ,


Скорее всего, это как-то связано со старой версией 05AB1E, но из любопытства: почему двойная раздвоенность Â? PS для всех, кто читает это: теперь может быть 5 байтов µNÂʽ.
Кевин Круйссен

@KevinCruijssen: вероятно, из-за отсутствия неявного вывода N (только вершина стека). Кроме того, теперь это может быть 4 байта, поскольку также ½является неявным.
Emigna

@Emigna Ах, совсем забыл о неявности, ½хотя я упоминал об этом в совете, который написал сам ..>. <Мысль ¼(увеличение counter_variable на 1) была неявной для цикла while µ, но это действительно ½( если вершина стека равна 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

Далее , 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/Enumerable

Объяснение кода: в библиотеке есть статический метод Sequence, где первый параметр определяет, сколько элементов будет гарантировано для создания последовательности, а второй параметр - это предикат, принимающий текущее значение итерации «i». Предикат преобразует целое число в строку, которая преобразуется в массив символов путем вызова _.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;
floorcat

1

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

Эта функция индексируется 1 и частично основана на ответе Javascript от Dom Hastings . Я думаю, что есть способ поиграть в гольф лучше, особенно с этим последним тройным состоянием. Кроме того, эта функция в настоящее время возвращает строку, которую, возможно, потребуется отредактировать позже. Любые предложения по игре в гольф приветствуются.

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

Это основанный на 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, в котором не было ?>команды. Если для вашего ответа требуется версия языка, который задним числом задал вопрос, вы должны пометить его как неконкурентный в заголовке. Я уберу свое понижение, когда ты это сделаешь.
Деннис

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