Erstellen Sie eine Liste mit Zahlen unter 50.000

24

Snaking Number Challenge

Ich frage mich, wie viele Schlangenzahlen es zwischen 1 und 50.000 gibt.

Schlange auf einem Nokia

Snaking Numbers sind in diesem Spiel Zahlen, die auf einem herkömmlichen Nummernblock (Format unten) eingegeben werden können, indem eine Taste nach oben, unten, links oder rechts bewegt wird.

7 8 9
4 5 6
1 2 3
 0

Wenn Sie beispielsweise mit der Zahl 5 beginnen, können Sie 4, 6, 8 oder 2 als nächsten gültigen Zug auswählen. 7, 3, 9 und 1 sind jedoch nicht zulässig, da sie diagonal zur aktuellen Taste positioniert sind . Wenn Sie also 5, dann 2 haben, sind Ihre nächsten möglichen Schlüsselwahlen wieder 0, 1, 3 oder 5.

In dieser Code-Golf-Übung geben Sie eine Liste aller positiven Snaking-Zahlen zwischen 1 und 50.000 sowie eine endgültige Zählung aller Zahlen aus, die das Kriterium erfüllen.

Regeln

  1. Zahlen können nicht mit einer Null beginnen.
  2. Zahlen müssen ganze positive ganze Zahlen sein.
  3. Jede fortlaufende Nummer, die von links nach rechts gelesen wird, muss sich um den Nummernblock "schlängeln".
  4. Die Schlange kann nicht diagonal über Tasten laufen
  5. Auf die Nummer 0 kann von den Nummern 1 und 2 zugegriffen werden
  6. Nummern können nicht gepaart werden (zB: 22)

Beispiele für gültige Snaking Numbers:

12369
45201
1254
10102
1
12
987

Beispiele für ungültige Nummern

1238 - 8 is not connected
0001 - multiple leading 0s
0101 - leading 0
159  - snake cannot travel diagonally
4556 - duplicate 5

Wie bei normalen Code Golfs ist das Ziel die kleinste Anzahl von Bytes!

Nach meiner Mathematik und meinen Regeln sollten Sie 670 gültige Snaking-Nummern in Ihrer Liste haben, plus 670 selbst, die als letzte Nummer gedruckt werden.

MightBeAlon
quelle
2
Soll die Ausgabe sortiert werden? Oder ist es in beliebiger Reihenfolge erlaubt?
Dienstag,
2
Da Sie uns auffordern, einen festen und endlichen Satz von Ganzzahlen auszugeben, würde ich vorschlagen, die vollständige Liste in die Spezifikation aufzunehmen.
Shaggy
Related
Arnauld
4
Dies ist eine Teilmenge von A215009 .
Bigyihsuan
Wäre es in Ordnung, zuerst 670 zu drucken ?
dana

Antworten:

14

K (NGN / k) , 60 57 Bytes

(x;#x:{*/1=3!5&+/x*x:+1_-':(+0 1,'2*!3 3)@10\x}#1+!50000)

Probieren Sie es online!

!50000liste von 0..49999

1+ addiere 1 zu allen

{ }# Filter mit der Funktion in { }

10\x Dezimalstellen des Arguments

( )@ Verwendung als Indizes in ...

  • !3 3 ein paar Listen: (0 0 0 1 1 1 2 2 2;0 1 2 0 1 2 0 1 2)

  • 2* multiplizieren Sie alle mit 2

  • 0 1,'0der ersten und 1der zweiten Liste voranstellen

  • +transponieren (Listenpaar -> Liste der Paare). Dies gibt uns die ungefähren Knopfkoordinaten.

-':subtrahieren Sie von jedem Paar das vorherige Paar. verwenden 0 0als imaginäres Element vor dem ersten.

1_ Lass den ersten fallen

+ transponieren

x*x:Quadrat (Zuordnen zu xund Multiplizieren mit x). Hier xsind zwei Listen - --xs und ∆ys

+/ Summiere die beiden Listen (Element für Element)

5& min mit 5

3! mod 3

1= Boolesche Liste, wo es gleich 1 ist

*/ Produkt (Boolesches "und")

(x;#x: )Machen Sie ein Paar aus dem Ergebnis und der Länge ( #) des Ergebnisses

ngn
quelle
9

Gelee ,  24  23 Bytes

5ȷ4µDo1.’d3ZIASĊ’ẸµÐḟṄL

Ein vollständiges Programm, das eine Liste aller Ergebnisse und anschließend die Anzahl der Ergebnisse druckt.

Probieren Sie es online!

Wie?

5ȷ4µDo1.’d3ZIASĊ’ẸµÐḟṄL - Main Link: no arguments
5ȷ4                     - 5*10^4 = 50000
   µ              µÐḟ   - filter discard those for which this is truthy:
                        -                  e.g.: 8520        ... or           4559 
    D                   -   decimal digits       [8,5,2,0]                    [4,5,5,9]
      1.                -   literal 1.5
     o                  -   logical OR           [8,5,2,1.5]                  [4,5,5,9]
        ’               -   decrement            [7,4,1,0.5]                  [3,4,4,8]
         d3             -   div-mod by 3         [[2,1],[1,1],[0,1],[0,0.5]]  [[1,0],[1,1],[1,1],[2,2]]
           Z            -   transpose            [[2,1,0,0],[1,1,1,0.5]]      [[1,1,1,2],[0,1,1,2]]
            I           -   deltas               [[-1,-1,0],[0,0,-0.5]]       [[0,0,1],[1,0,1]]
             A          -   absolute value       [[1,1,0],[0,0,0.5]]          [[0,0,1],[1,0,1]]
              S         -   sum (vectorises)     [1,1,0.5]                    [1,0,2]
               Ċ        -   ceiling              [1,1,1]                      [1,0,2]
                ’       -   decrement            [0,0,0]                      [0,-1,1]
                 Ẹ      -   any?                 0 (i.e. keep)                1 (i.e. discard)
                     Ṅ  - print and yield
                      L - length
                        - implicit print
Jonathan Allan
quelle
Ich würde gerne wissen, wie das funktioniert. Haben Sie eine Chance, eine Panne zu geben?
MightBeAlon
1
@MightBeAlon wird später tun ...
Jonathan Allan
Ich bin gespannt, wie 1.bewertet man das 1.5?
Verkörperung der Ignoranz
@EmbodimentofIgnorance beim wörtlichen Parsen einer fehlenden Ziffer nach einem Punkt wird als Fünf behandelt. Siehe die letzte else-Klausel von parse_literal in interpreter.py
Jonathan Allan
7

Python 3 , 140 Bytes

f=lambda s:''==s[1:]or s[1]in'10021234562216565878 43 749 9   5  8'[int(s[0])::10]and f(s[1:])
print(*filter(f,map(str,range(1,50000))),670)

Probieren Sie es online!

Ich bin mir sicher, dass dies jemand mit einem Ausdruck anstelle einer Suchzeichenfolge tun kann.

Jitse
quelle
7

Python 2 , 101 Bytes

print[n for n in range(1,50000)if all(`n`[i:i+2]in`0x20b33ec8bc49a10589e76b15`for i in range(4))],670

Probieren Sie es online!

Die Hex-Zahl ist eine Dezimalzahl 10120214525632365878969854741, die jedes geordnete Ziffernpaar codiert, das nebeneinander erscheinen kann.

negative sieben
quelle
5

JavaScript (V8) ,  112 106  104 Byte

2 Bytes dank @NahuelFouilleul gespeichert

Ein volles Programm.

for(n=0;++n<5e4;)[...n+''].every(x=>'6589632145201478'.match(x+p+'|'+p+(p=x)),p='')&&print(n)
print(670)

Probieren Sie es online!

Oder 96 Bytes, wenn wir die Zahlen in umgekehrter Reihenfolge ausgeben können:

for(n=5e4;n--;)[...n+''].every(x=>'6589632145201478'.match(x+p+'|'+p+(p=x)),p='')&&print(n||670)

Probieren Sie es online!

Arnauld
quelle
funktioniert auch das letzte entfernen 3vielleicht weil 36es schon in string ist
nahuel fouilleul
@NahuelFouilleul Guter Fang. Vielen Dank!
Arnauld
1
Auch 6589632145201478ist ein Byte kürzer
Nahuel Fouilleul
4

Stax , 37 35 Bytes

ü╞╡~▄ⁿ♪eµïê◙ü╔ï▼ΔJr¥æ≤PH╟♀I♣Δz8─¶Γ╞Ç▓

Führen Sie es aus und debuggen Sie es unter staxlang.xyz!

Es war so schön und kurz, bis es nicht mehr war.

Entpackt (42 Bytes) und Erklärung

49999{E2B{{om"#qYY>!(AFI"%A|E2B{{om-C_Qf%p
49999{                                 f      Filter range [1..49999]:
      E2B                                       All adjacent pairs of digits
         {{om                                   Each sorted
             "#qYY>!(AFI"%A|                    Literal 2012365478963258741
                            E2B{{om             Pairs of digits, each sorted
                                   -            Set difference
                                    C           Cancel block execution if any remain
                                     _Q         Print current value
                                        %p    Print length

2012365478963258741 codiert die Tastatur. Schauen Sie sich Paare benachbarter Ziffern an. Wenn ich eine anständige kurze Alternative bekommen könnte, die für jedes Paar in beide Richtungen geht, könnte ich vielleicht die acht Bytes von kürzen {{om.

Ohne diese nachgestellte 670 würde ein einfacher Filter ausreichen: f..!statt {..C_Qf%p. Es könnte einen besseren Weg geben, um mit dieser Unregelmäßigkeit umzugehen. In beiden Fällen ist dieses Filterbereichsverhalten nicht dokumentiert.

Khuldraeseth na'Barya
quelle
Entschuldigen Sie die Dokumentationslücken. FWIW, das wird in der nächsten Version 1.1.7 sein. Sie können eine Vorschau auf stax.tomtheisen.com sehen , aber es ist ein Geheimnis, also sagen Sie es niemandem. ;)
rekursiver
3

PHP , 145 Bytes

for(;$i++<5e4;$f&&print$i._)for($f=1,$l=b;''<$d=("$i")[$$i++];$l=$d)$f&=$l>a||strstr([12,240,1053,26,157,2468,359,48,579,68][$l],$d)>'';echo 670;

Probieren Sie es online!

Überprüfen Sie für jede Zahl von 1 bis 50.000 jede Ziffer dieser Zahl von links nach rechts. Wenn sich alle Ziffern in der Liste der gültigen Ziffern der vorherigen Ziffer befinden, wird diese Nummer gedruckt. Am Ende wird ein fest codierter 670 gedruckt, da er weniger Bytes benötigt, als er tatsächlich zählt.

Night2
quelle
3

05AB1E , 23 Bytes

ŽÅKLʒSÌYX;:3‰üαï€OP}=g=

Probieren Sie es online!

Port of Jonathan Allans Gelee Antwort .

Grimmig
quelle
1
Ah, klug, nur die 50000 in 3 Byte zu komprimieren. Ich habe verwendet ₄50*oder 4°5*als ich einen früheren Versuch unternommen habe. Und zuerst war ich verwirrt, warum Sie €OPstatt nur hatten OP, aber dann wurde mir klar, dass die einstelligen Zahlen (eine leere Liste nach der üα) dann [] → 0 → 0anstelle von sein würden [] → [] → 1. :)
Kevin Cruijssen
1
@ KevinCruijssen Warum, 4°5*wenn Sie können 5°;? ZAK gefällt mir allerdings besser. Und ja, diese Randbedingung für einstellige Zahlen ist ein Schmerz.
Grimmy
3

Perl 5 ( -M5.01), 96 , 92 Bytes

-4 Bytes dank @Xcali

$r=join"|",map$t++."[^$_]",12,240,1350,26,157,2648,359,48,579,68;map/$r/||say,1..5e4;say 670

TIO

Nahuel Fouilleul
quelle
92
Xcali
danke in der Tat zu kompliziert, weil die erste Antwort positiv war
Nahuel Fouilleul
3

JavaScript (SpiderMonkey) , 179 173 151 129 Bytes

[12,240,1350,26,157,2468,359,48,579,68].map((_,i,l)=>i&&(f=(v,t)=>print(v)|v<5e3&&[...l[t]+''].map(k=>f(v+k,k)))(i,i)),print(670)

Probieren Sie es online!

-22 bytes danke an Arnauld -22 bytes danke an dana

Erläuterung:

[12,240,1350,26,157,2468,359,48,579,68] 
// an array where keys are current position and values, the possible destinations
.map((_,i,l)=>                    // loop over it
    i&&(                          // if key is not 0
        f=(v,t)=>                 // create a function
                 print(v)|        // which print the value
                          v<5e3&& // and if the limit is not attained
                                 [...l[t]+''].map(k=>f(v+k,k)) 
                    // recurcively call itself with for each destinations
                                                              )(i,i)),
                    // make the first call with each digit
print(670) // finally print 670

@dana gab auch eine 123-Byte-Lösung an, wenn wir zuerst 670 drucken können

[21,420,5310,62,751,8642,953,84,975,86].map((_,i,a)=>(f=(v,t)=>print(i?v:640)|i&v<5e3&&[...a[t]+''].map(k=>f(v+k,k)))(i,i))
jonatjano
quelle
@ Arnauld danke ich habe diese Regel vergessen
Jonatjano
129 ?
Dana
123, wenn 640 zuerst gedruckt werden kann.
dana
2

Stax , 28 26 Bytes

Δh┤♣É╦&·é╝n$K»à¶▲v═NÆ;↨m≥8

Führen Sie es aus und debuggen Sie es

Ausgepackt, ungolfed und kommentiert sieht es so aus.

G               Call to unbalanced trailing '}', then resume here
670P            Print 670
}               Call target
219J            219 squared (47961)
f               Filter 1-based range by the rest of the program; implicitly output
  $2B           Convert to string and get adjacent pairs; e.g. 213 -> ["21", "13"]
  O             Push 1 under list of pairs
  F             Iterate over pairs, using the rest of the program
    o           Order each pair; e.g. "21" -> "12"
    "{<f:[/T8Z" string literal with code points [123 60 102 58 91 47 84 56 90]
    $           concate as string i.e. "12360102589147845690"
    s#          How many times does the current pair appear in the constant string?
    *           Multiply this by running total.  Any zero will cause the result to be zero.

Führen Sie dieses aus

Die geheime Sauce steht im String-Literal "{<f:[/T8Z". Nachdem Sie alle Codepunkte zusammengesteckt haben, erhalten Sie 12360102589147845690. Die aufsteigenden Paare in dieser Zeichenfolge sind die gültigen Schlangenbewegungen.

rekursiv
quelle
1
15JJanstatt 219Jwürde auch funktionieren, aber ich glaube nicht, dass Sie von dort aus jedes Byte golfen können, es sei denn, es gibt eine 1-Byte-Konstante für 15.
Arnauld
2

Haskell , 118 Bytes

(filter(and.(zipWith elem.tail<*>map f).show)[1..50000],670)
f c=words"12 024 0135 26 157 2468 359 48 579 68"!!read[c]

Probieren Sie es online!

Ein erster Durchgang; Ich kann nicht gut komprimieren.

Das s=zählt nicht, da wir das Ergebnis eigentlich nicht binden müssen.

Ungolfed Code .

cole
quelle
1

Holzkohle , 42 Bytes

≔ΦI…·¹×⁵⁰φ⬤ι№”)¶∧XRτ_ΠGêR⁵m⎇λ”✂ιμ⁺²μ¹θθILθ

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

≔ΦI…·¹×⁵⁰φ

Verarbeiten des inklusiven Bereich von 1bis 50,000Guss zu bespannen.

⬤ι№”)¶∧XRτ_ΠGêR⁵m⎇λ”✂ιμ⁺²μ¹θ

Filtern Sie diejenigen heraus, deren Ziffernpaare nicht in der komprimierten Zeichenfolge enthalten sind 01478963202125458565236987410.

θILθ

Geben Sie das verbleibende Array und seine Länge aus.

Neil
quelle
1

Perl 6 , 64 Bytes

{670,grep {[+&](:36<12HGX91H8VCL3MG0FDVQ>X+>m:ov/../)%2},1..5e4}

Probieren Sie es online!

Erläuterung

{670,grep {...},1..5e4}  # Meet questionable output requirements

# Actual decision problem

     :36<12HGX91H8VCL3MG0FDVQ>  # Bit field of allowed transitions
                                # encoded in base 36
                                 m:ov/../  # All 2-digit substrings
                              X+>  # Right shift by each substring
                                   # (implicitly converted to an integer)
[+&](                                    )  # Binary and
                                          %2  # Modulo 2
nwellnhof
quelle
Es ist schade, dass ~>es noch nicht implementiert ist, sonst könnten Sie dies nur mit String-Operatoren tun, wobei das Bit-Feld ein String ist
Jo King,
1

Pyth , 68 65 45 Bytes

l
f.Am}dCtB+J`65874589632012541_PJCtB`TS50000

Probieren Sie es online!

Inspiration für die überarbeitete Nachschlageprozess kam von Khuldraeseth na'Barya der Stax Antwort , so dass sie eine upvote gehen zu geben!


Edit 2: Umschreiben, um ein paar Bytes zu speichern, frühere Version:

l
f.Am}ed@c"12 024 0135 26 157 2468 359 48 579 68";shdCtB`TS50000

Bearbeiten: 3 Bytes mit String-Lookups abgelegt, Vorgängerversion:

l
f.Am}ed@sMMc"12 024 0135 26 157 2468 359 48 579 68";hdCtBjT;S50000
Sok
quelle