Zahlen springen


12

Eine Sprungzahl ist definiert als eine positive Zahl n, bei der sich alle Paare aufeinanderfolgender Dezimalstellen um 1 unterscheiden. Außerdem werden alle einstelligen Zahlen als Sprungzahlen betrachtet. z.B. 3, 45676, 212 sind Sprungzahlen, 414 und 13 jedoch nicht. Die Differenz zwischen 9 und 0 wird nicht als 1 betrachtet

Die Herausforderung Erstellen Sie ein Programm, das eines der folgenden Ergebnisse ausgibt:

  • Bei einer Eingabe nwerden die ersten Sprungzahlen ausgegeben n.
  • Bei einer Eingabe nwird der ndritte Term der Sequenz ausgegeben .

Hinweis

  • Jedes gültige E / A-Format ist zulässig
  • 1-Index oder 0-Index ist erlaubt (bitte angeben)

Hier sind einige springende Zahlen:

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

Dies ist auch A033075


Ist diese 0 oder 1 indiziert?
Taylor Scott

1
@TaylorScott Die Sequenz besteht nur aus positiven Zahlen. Wenn Sie den Input meinen, ndann liegt es an Ihnen.
Luis Felipe De Jesus Munoz

Ich vermute, "Jedes gültige E / A-Format ist zulässig" beinhaltet die Ausgabe der Zahlen als Listen mit Dezimalstellen, wollte aber nur bestätigen -?
Jonathan Allan

Yes @JonathanAllan
Luis Felipe De Jesus Munoz

Antworten:



6

Gelee , 8 Bytes

1DI*`ƑƊ#

Ein vollständiges Programm, das eine Ganzzahl nvon STDIN akzeptiert und eine Liste der ersten npositiven Sprungzahlen druckt .

Probieren Sie es online!

Wie?

Akzeptable inkrementelle Unterschiede zwischen den Ziffern sind 1und -1während andere [-9,-2]+[2,9]nicht sind. Dies stimmt mit ganzen Zahlen überein, die unveränderlich sind, wenn sie zu sich selbst erhoben werden. dh xx=x seit:

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 Byte

Die Eingabe ist 1-indiziert.

Code:

µN¥ÄP

Verwendet die 05AB1E- Codierung. Probieren Sie es online!


Erläuterung

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

Richtiges Werkzeug für den Job.
Lirtosiast

5

Python 2 , 79 75 Bytes

-4 Bytes von 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

Probieren Sie es online!

Abgeleitet von Chas Brown ‚s Antwort . Die Hilfsfunktion gibt g(i)zurück, ob ies sich um eine springende Zahl handelt. Aus den letzten beiden Ziffern einer Zahln die absolute Differenz 1 haben, ist n%100%11sie entweder 1 oder 10, also n%100%11%91.


Netter Trick mit dem %11. Sie können dies tun, f=lambda n,i=1:n and-~f(n-g(i),i+1)wenn Sie auf eine Indizierung umstellen.
Xnor

4

APL (Dyalog Unicode) , 36 Byte SBCS

1-indiziert. Vielen Dank an dzaima für ihre Hilfe beim Golfen.

Edit: -15 Bytes von ngn.

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

Probieren Sie es online!

Erläuterung

Wir haben f⍣g⍣h, wo, wie ein Betreiber, APL dies übersetzt (f⍣g)⍣h. (Im Gegensatz zu Funktionen, bei denen 2×3+1übersetzt wird 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

Es ist viel kürzer mit statt Rekursion: {1+⍣{∧/1=|2-/⍎¨⍕⍺}⍣⍵⊢0}oder1+⍣{∧/1=|2-/⍎¨⍕⍺}⍣⎕⊢0
ngn

"⍣ ist ein Operand" - es ist ein "Operator" (ich habe diesen Fehler im Chat korrigiert, aber anscheinend haben Sie die ursprüngliche Version übernommen. Entschuldigung)
ngn



3

Python 2 , 88 87 Bytes

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)

Probieren Sie es online!

Gibt die 0-indizierte Sprungzahl zurück (dh f (0) => 1 usw.).


@lirtosiast: Das ist OK, bitte spende deine Antwort an deine Lieblings-Wohltätigkeitsorganisation :). Es ist ausreichend anders, um eine separate Antwort zu verdienen (und auch sprachübergreifend).
Chas Brown

3

Haskell , 69 Bytes

  • Vielen Dank an Joseph Sible für die Durchsetzung der Herausforderungsregeln und das Speichern von drei Bytes.
  • Zwei Bytes dank nimi gespart .
(filter(all((==1).abs).(zipWith(-)<*>tail).map fromEnum.show)[1..]!!)

Probieren Sie es online!


1
Dies scheint die Frage zu beantworten "Ist dies eine springende Zahl?" für eine gegebene Eingabenummer, was nicht das ist, wonach die Herausforderung gefragt hat.
Joseph Sible-Reinstate Monica

@ JosephSible Sie sind richtig. Vielen Dank für die Kenntnisnahme.
Jonathan Frech

gNachdem dies behoben wurde, können Sie 3 Bytes kürzer machen, indem Sie es so umschreiben, dass es keine Punkte enthält, und dann Folgendes verwenden <*>:g=all((==1).abs).(zipWith(-)<*>tail).map(read.pure).show
Joseph Sible-Reinstate Monica

@ JosephSible Vielen Dank.
Jonathan Frech

@nimi Fertig. Vielen Dank.
Jonathan Frech



1

Schnell, 228 Bytes

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)

Probieren Sie es online!


1

Python 3 , 122 121 Bytes

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

Probieren Sie es online!

-1 Byte durch Umschalten fvom Drucken auf eine Generatorfunktion.

g ist eine rekursive Hilfsfunktion, die feststellt, ob eine Zeichenfolge vorhanden ist s eine "springende Zeichenfolge" ist (dies funktioniert, da die Zeichencodes für 0 bis 9 in Reihenfolge und zusammenhängend sind).

fist eine Generatorfunktion, die ndie ersten nSprungzahlen aufnimmt und liefert .


1

R , 85 Bytes

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

Probieren Sie es online!

Ich vermute, das kann mehr golfen werden. Liest die Nummer mit scan()und gibt die entsprechende Sprungnummer aus.





Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.