Zıplama Numaraları


12

Bir atlama sayısı, ardışık ondalık basamakların tüm çiftlerinin 1 ile farklı olduğu pozitif bir n sayısı olarak tanımlanır. Ayrıca, tüm tek haneli sayılar atlama sayıları olarak kabul edilir. Örneğin. 3, 45676, 212 atlama sayılarıdır, ancak 414 ve 13 değildir. 9 ile 0 arasındaki fark 1 olarak kabul edilmez.

Zorluk Aşağıdaki sonuçlardan birini çıkaran bir program oluşturun:

  • Bir giriş nçıkışı verildiğinde ilk natlama sayıları.
  • Bir giriş verilen nçıkış ninci dizisinin bir terimdir.

Not

  • Geçerli herhangi bir I / O formatına izin verilir
  • 1-endeks veya 0-endekse izin verilir (lütfen belirtin)

İşte bazı atlama numaraları:

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, ...

Bu aynı zamanda A033075


Bu 0 veya 1 Endeksli mi?
Taylor Scott

1
@TaylorScott Sekans sadece pozitif sayılardan oluşur. Girdiyi kastediyorsanız, no zaman size kalmış.
Luis felipe De jesus Munoz

"Geçerli herhangi bir I / O biçimine izin verilir" tahmin numaraları sayılar ondalık basamak listesi olarak çıktı içerir, ama sadece onaylamak istedim -?
Jonathan Allan

Yes @JonathanAllan
Luis felipe De jesus Munoz

Yanıtlar:



6

Jöle , 8 bayt

1DI*`ƑƊ#

nİlk npozitif atlama numaralarının bir listesini basan STDIN'den bir tamsayıyı kabul eden tam bir program .

Çevrimiçi deneyin!

Nasıl?

Rakamlar arasında kabul edilebilir artımlı farklılıklar vardır 1ve -1diğerleri arasında [-9,-2]+[2,9]değildir. Bu, kendilerine yükseltildiğinde değişmeyen tamsayılarla aynı hizaya gelir. yani xx=x tarihten beri:

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

6

05AB1E (eski) , 5 bayt

Giriş 1 dizinlidir.

Kod:

µN¥ÄP

05AB1E kodlamasını kullanır . Çevrimiçi deneyin!


açıklama

µ          # 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)

İş için doğru araç.
lirtosiast

5

Python 2 , 79 75 bayt

Xnor tarafından -4 bayt

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

Çevrimiçi deneyin!

Elde Edilen Chas Brown 'ın cevabı . Yardımcı işlev atlama sayısı g(i)olup olmadığını döndürür i. Bir sayının son iki basamağı nmutlak fark 1 ise, n%100%111 veya 10 olur, bu yüzden n%100%11%91 olur.


Güzel hile ile %11. Tek f=lambda n,i=1:n and-~f(n-g(i),i+1)endekslemeye geçerseniz bunu yapabilirsiniz .
xnor

4

APL (Dyalog Unicode) , 36 bayt SBCS

1 endeksli. Bu golf ile ilgili yardım için dzaima için teşekkürler.

Düzenleme: ngn'den -15 bayt.

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

Çevrimiçi deneyin!

açıklama

Biz f⍣g⍣holarak nerede, bir operatör olduğunu, APL bu çevirir (f⍣g)⍣h. ( 2×3+1Çevrilen fonksiyonların aksine 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

özyineleme yerine çok daha kısadır : {1+⍣{∧/1=|2-/⍎¨⍕⍺}⍣⍵⊢0}veya1+⍣{∧/1=|2-/⍎¨⍕⍺}⍣⎕⊢0
ngn

"⍣ bir işlenen" - bu bir "operatör" (i bu hata sohbet ve düzeltildi, ama ilk sürümü aldı gibi görünüyor. Üzgünüm)
ngn


3

Japt, 14 bayt

n1 endeksli birinci terim çıktısını verir .

_ì äa dÉ ªU´}f

Dene

(Biliyorum, biliyorum, mola vermem gerekiyor ama golf çekiminden çekiliyorum!)


Haha, belki de çekilmeni iyileştirmek için yeni bir golf dili öğren. : P
Quintec

3

Python 2 , 88 87 bayt

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)

Çevrimiçi deneyin!

0 ile işaretlenmiş atlama sayısını döndürür (yani f (0) => 1, vb.).


@lirtosiast: Sorun değil, lütfen cevabınızı en sevdiğiniz hayır kurumuna bağışlayın :). Ayrı bir yanıtı hak etmek için yeterince farklıdır (ayrıca diller arası uygun olmak).
Chas Brown

3

Haskell , 69 bayt

  • Zorlu kuralları uyguladığı ve üç bayt kaydettiği için Joseph Sible'a teşekkürler .
  • Sayesinde iki bayt tasarrufu Nimi kurtardı .
(filter(all((==1).abs).(zipWith(-)<*>tail).map fromEnum.show)[1..]!!)

Çevrimiçi deneyin!


1
Bu "bu bir atlama sayısı mı?" belirli bir girdi numarası için, bu zorluğun istediği şey değildir.
Joseph Sible-Reinstate Monica

@JosephSible Haklısınız. Kaydettiğiniz için teşekkürler.
Jonathan Frech

Ayrıca, şimdi düzeltildiğine göre, bunu ücretsiz olarak gyeniden yazarak ve daha sonra kullanarak 3 bayt kısaltabilirsiniz <*>:g=all((==1).abs).(zipWith(-)<*>tail).map(read.pure).show
Joseph Sible-

@JosephSible Teşekkür ederim.
Jonathan Frech

@nimi Bitti. Teşekkür ederim.
Jonathan Frech



1

Hızlı, 228 bayt

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)

Çevrimiçi deneyin!


1

Python 3 , 122121 bayt

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

Çevrimiçi deneyin!

fBaskıdan bir jeneratör işlevine geçerek -1 bayt .

gbir dizenin s"atlama dizesi" olup olmadığını belirleyen özyinelemeli bir yardımcı işlevdir (0 ile 9 arasındaki karakter kodları düzgün ve bitişik olduğu için çalışır).

fnilk natlama sayılarını alan ve veren bir jeneratör fonksiyonudur .


1

R , 85 bayt

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

Çevrimiçi deneyin!

Bu daha fazla golf olabilir şüpheli. Kullanarak sayıyı okur scan()ve uygun atlama sayısını verir.





Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.