Стрибки чисел


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то саме від вас залежить.
Luis felipe De

Я здогадуюсь, що "Будь-який допустимий формат вводу / виводу дозволений" включає виведення чисел у вигляді списків десяткових цифр, але просто хотів підтвердити -?
Джонатан Аллан

Так @JonathanAllan
Luis felipe De

Відповіді:



6

Желе , 8 байт

1DI*`ƑƊ#

Повна програма, що приймає ціле число, nз STDIN, яка друкує список перших nпозитивних перехідних чисел.

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

Як?

Прийнятні додаткові відмінності між цифрою 1і в -1той час як іншими з [-9,-2]+[2,9]немає. Це поєднується з цілими числами, які інваріантні, коли їх піднімають до себе. тобто xx=x оскільки:

00=1
11=1
22=4
11=1
-2-2=-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


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 (Діалог 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
ngn

"⍣ - операнд" - це "оператор" (я цю помилку в чаті і виправив, але, схоже, ви підняли початкову версію. Вибачте)
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 байт

  • Завдяки Джозефу Сиблу за те, що він застосував правила виклику та збереже три байти.
  • Збережено два байти завдяки німі .
(filter(all((==1).abs).(zipWith(-)<*>tail).map fromEnum.show)[1..]!!)

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


1
Це, здається, відповідає на питання "це стрибкове число?" для заданого вхідного номера, що не є заданим завданням.
Джозеф Сибл-

@JosephSible Ви маєте рацію. Дякую за те, що помітили.
Джонатан

Крім того, тепер, коли це виправлено, ви можете зробити g3 байти коротшими, переписавши його на безглузді, а потім скориставшись <*>:g=all((==1).abs).(zipWith(-)<*>tail).map(read.pure).show
Джозеф Сибл-

@JosephSible Дякую
Джонатан

@nimi Готово. Дякую.
Джонатан



1

Свіфт, 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

Пітон 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.