Прыжки номера


12

Прыгающее число определяется как положительное число n, все пары последовательных десятичных цифр которого отличаются на 1. Кроме того, все однозначные числа считаются прыгающими числами. например. 3, 45676, 212 являются прыгающими числами, а 414 и 13 - нет. Разница между 9 и 0 не считается 1

Задача Создайте программу, которая выдаст один из следующих результатов:

  • На входе nвыведите первые nпрыгающие числа.
  • Учитывая , входной nвывод - nй член последовательности.

Заметка

  • Допустим любой допустимый формат ввода / вывода
  • 1-индекс или 0-индекс допускается (пожалуйста, укажите)

Вот несколько прыгающих чисел:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 21, 23, 32, 34, 43, 45, 54, 56, 65, 67, 76, 78, 87, 89, 98, 101, 121, 123, 210, 212, 232, 234, 321, 323, 343, 345, 432, 434, 454, 456, 543, 545, 565, 567, 654, 656, 676, 678, 765, 767, 787, 789, 876, ...

Это также A033075


Это 0 или 1 проиндексировано?
Тейлор Скотт

1
@TaylorScott Последовательность состоит только из положительных чисел. Если вы имеете в виду ввод, nто это зависит от вас.
Луис Фелипе Де Иисус Муньос

Я предполагаю, что «Любой допустимый формат ввода / вывода разрешен» включает вывод чисел в виде списков десятичных цифр, но просто хотел подтвердить -?
Джонатан Аллан

Ответы:



6

Желе , 8 байт

1DI*`ƑƊ#

Полная программа, принимающая целое число nот STDIN, которое печатает список первых nположительных скачущих чисел.

Попробуйте онлайн!

Как?

1-1[-9,-2]+[2,9]xx=x

00=1
11=1
22=4
11=1
22=14

1DI*`ƑƊ# - Main Link: no arguments (accepts a line of input from STDIN)
       # - count up keeping the first (input) n matches...
1        - ...start with n equal to: 1
      Ɗ  - ...match function: last three links as a monad:  e.g. 245       777      7656
 D       -   convert to a list of decimal digits                 [2,4,5]   [7,7,7]  [7,6,5,6]
  I      -   incremental differences                             [2,1]     [0,0]    [-1,-1,1]
     Ƒ   -   invariant under?:
    `    -     using left argument as both inputs of:
   *     -       exponentiation (vectorises)                     [4,1]     [1,1]    [-1,-1,1]
         -                                            --so we:   discard   discard  keep
         - implicitly print the list of collected values of n

6

05AB1E (legacy) , 5 байтов

Вход 1 индексируется.

Код:

µN¥ÄP

Использует кодировку 05AB1E . Попробуйте онлайн!


объяснение

µ          # Get the nth number, starting from 0, such that...
   Ä       #   The absolute values
 N¥        #   Of the delta's of N
    P      #   Are all 1 (product function, basically acts as a reduce by AND)

Правильный инструмент для работы.
lirtosiast

5

Python 2 , 79 75 байт

-4 байта от xnor

f=lambda n,i=1:n and-~f(n-g(i),i+1)
g=lambda i:i<10or i%100%11%9==g(i/10)>0

Попробуйте онлайн!

Производный от Чес Brown «s ответа . Вспомогательная функция g(i)возвращает, iявляется ли число прыжком. Если последние две цифры номера nимеют абсолютную разницу 1, то n%100%11будет 1 или 10, поэтому n%100%11%9будет 1.


Хороший трюк с %11. Это можно сделать, f=lambda n,i=1:n and-~f(n-g(i),i+1)если вы переключитесь на одноиндексирование.
xnor

4

APL (Dyalog Unicode) , 36 байтов SBCS

1-индексироваться. Спасибо dzaima за помощь в игре в гольф.

Редактировать: -15 байт от ngn.

1+⍣{∧/1=|2-/⍎¨⍕⍺}⍣⎕⊢0

Попробуйте онлайн!

объяснение

У нас есть f⍣g⍣h, где, как оператор, APL переводит это в (f⍣g)⍣h. (В отличие от функций, где 2×3+1переводится 2×(3+1))

1+⍣{...}⍣⎕⊢0  This is equivalent to 
               "do {check} we find the n-th integer that fulfils {check}"

1+⍣{...}   0  Start with 0 and keep adding 1s until the dfn 
               (our jumping number check in {}) returns true.
        ⍣⎕    We take input n (⎕) and repeat (⍣) the above n times 
               to get the n-th jumping number.

{∧/1=|2-/⍎¨⍕⍺}  The dfn that checks for jumping numbers.

         ⍎¨⍕⍺   We take the base-10 digits of our left argument
                 by evaluating each character of the string representation of ⍺.
     |2-/        Then we take the absolute value of the pairwise differences of the digits
 ∧/1=            and check if all of the differences are equal to 1.

10⊥⍣¯1⊢⍺->⍎¨⍕⍺
ngn

это намного короче с вместо рекурсии: {1+⍣{∧/1=|2-/⍎¨⍕⍺}⍣⍵⊢0}или1+⍣{∧/1=|2-/⍎¨⍕⍺}⍣⎕⊢0
нгн

«An - это операнд» - это «оператор» (я допустил эту ошибку в чате и исправил ее, но, похоже, вы выбрали первоначальную версию. Извините)
ngn



3

Python 2 , 88 87 байт

f=lambda n,i=2:n and f(n-g(i),i+1)or~-i
g=lambda i:i<10or abs(i/10%10-i%10)==1==g(i/10)

Попробуйте онлайн!

Возвращает 0-индексное число прыжков (т. Е. F (0) => 1 и т. Д.).


@lirtosiast: Все в порядке, пожалуйста, пожертвуйте свой ответ вашей любимой благотворительной организации :). Это достаточно отличается, чтобы заслужить отдельный ответ (а также подходит для разных языков).
Час Браун

3

Haskell , 69 байт

  • Спасибо Джозефу Сиблу за соблюдение правил вызова и сохранение трех байтов.
  • Сохранено два байта благодаря NIMI .
(filter(all((==1).abs).(zipWith(-)<*>tail).map fromEnum.show)[1..]!!)

Попробуйте онлайн!


1
Похоже, это отвечает на вопрос "это прыгающее число?" для заданного входного номера, который не является тем, о чем просили.
Джозеф Сибл-Восстановить Монику

@JosephSible Вы правы. Спасибо, что заметили.
Джонатан Фрех

Кроме того, теперь, когда это исправлено, вы можете сделать g3 байта короче, переписав его, чтобы он не содержал точек, а затем используя <*>:g=all((==1).abs).(zipWith(-)<*>tail).map(read.pure).show
Joseph Sible-Reinstate Monica

@JosephSible Спасибо.
Джонатан Фрех

@nimi Готово. Спасибо.
Джонатан Фрех



1

Swift, 228 байт

func j(n:Int){
var r:[Int]=[]
for x in 0...n{
if x<=10{r.append(x)}else{
let t=String(x).compactMap{Int(String($0))}
var b=true
for i in 1...t.count-1{if abs(t[i-1]-t[i]) != 1{b=false}}
if b{r.append(x)}
}
}
print(r)
}
j(n:1000)

Попробуйте онлайн!


1

Python 3 , 122 121 байт

g=lambda s:len(s)==1or 1==abs(ord(s[0])-ord(s[1]))and g(s[1:])
def f(n,i=1):
	while n:
		if g(str(i)):n-=1;yield i
		i+=1

Попробуйте онлайн!

-1 байт, переходя fот печати к функции генератора.

gявляется рекурсивной вспомогательной функцией, которая определяет, является ли строка s«прыжковой строкой» (это работает, поскольку коды символов от 0 до 9 расположены по порядку и являются непрерывными).

fявляется функцией генератора, которая принимает nи выдает первые nпрыжковые числа.


1

R 85 байт

i=scan();j=0;while(i)if((j=j+1)<10|all(abs(diff(j%/%10^(0:log10(j))%%10))==1))i=i-1;j

Попробуйте онлайн!

Подозреваю, что это может быть в гольф больше. Считывает номер с помощью scan()и выводит соответствующий скачущий номер.





Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.