Utwórz listę snakingowych liczb poniżej 50 000

24

Snaking Number Challenge

Zastanawiam się, ile liczb snakingowych jest między 1 a 50 000?

Snake on a Nokia

Snaking Numbers w tej grze to liczby, które można wpisać na tradycyjnej klawiaturze numerycznej (format poniżej), przesuwając jeden klawisz w górę, w dół, w lewo lub w prawo.

7 8 9
4 5 6
1 2 3
 0

Na przykład, jeśli zaczniesz od cyfry 5, możesz wybrać 4, 6, 8 lub 2 jako następny ważny ruch - jednak 7, 3, 9 i 1 są niedostępne, ponieważ są ustawione po przekątnej do bieżącego klucza . Tak więc, jeśli masz 5, a następnie 2, następnym możliwym do wyboru kluczem jest ponownie 0, 1, 3 lub 5.

W tym ćwiczeniu Code Golf masz wypisać listę wszystkich dodatnich liczb snakingowych od 1 do 50k, wraz z ostateczną liczbą wszystkich liczb, które spełniają kryterium.

Zasady

  1. Liczby nie mogą zaczynać się od zera.
  2. Liczby muszą być całymi dodatnimi liczbami całkowitymi.
  3. Każdy kolejny numer, odczytywany od lewej do prawej, musi „wąż” wokół klawiatury numerycznej.
  4. Wąż nie może podróżować po przekątnej przez klawisze
  5. Dostęp do cyfry 0 można uzyskać zarówno z liczb 1, jak i 2
  6. Liczb nie można sparować (np .: 22)

Przykłady prawidłowych liczb snakingowych:

12369
45201
1254
10102
1
12
987

Przykłady nieprawidłowych liczb

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

Jak w normalnych Code Golfs, celem jest jak najmniej bajtów!

Zgodnie z moją matematyką i zasadami na twojej liście powinieneś mieć 670 prawidłowych liczb węży oraz 670 wydrukowanych jako ostatni numer.

MightBeAlon
źródło
2
Czy dane wyjściowe powinny być sortowane? Czy jest to dozwolone w dowolnej kolejności?
tsh
2
Ponieważ prosisz nas o wyprowadzenie ustalonego i skończonego zestawu liczb całkowitych, sugeruję włączenie pełnej listy do specyfikacji.
Kudłaty
Powiązane
Arnauld
4
To jest podzbiór A215009 .
bigyihsuan
Czy dobrze byłoby najpierw wydrukować 670 ?
dana

Odpowiedzi:

14

K (ngn / k) , 60 57 bajtów

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

Wypróbuj online!

!50000lista 049999

1+ dodaj 1 do wszystkich

{ }# filtruj z funkcją w { }

10\x cyfry dziesiętne argumentu

( )@ używać jako wskaźników w ...

  • !3 3 para list: (0 0 0 1 1 1 2 2 2;0 1 2 0 1 2 0 1 2)

  • 2* pomnóż wszystko przez 2

  • 0 1,'dołączana 0do pierwszej listy i1 do drugiej

  • +transponuj (para list -> lista par). daje nam to przybliżone wartości przycisków.

-':odejmij od każdej pary poprzednią parę. posługiwać się0 0 jako elementu wyobrażonego przed pierwszym.

1_ upuść pierwszy

+ transponować

x*x:kwadrat (przypisz xi pomnóż x). tutajx para list - sxs i ∆ys

+/ zsumuj dwie listy (element po elemencie)

5& min z 5

3! mod 3

1= boolowska lista gdzie to jest równe 1

*/ produkt (logiczny ”i„)

(x;#x: )ułóż parę wyniku i długość ( #) wyniku

ngn
źródło
9

Galaretka ,  24  23 bajty

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

Pełny program, który drukuje listę wszystkich wyników, a następnie liczbę wyników.

Wypróbuj online!

W jaki sposób?

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
źródło
Chciałbym wiedzieć, jak to działa. Czy jest jakaś szansa na załamanie?
MightBeAlon
1
@MightBeAlon zrobi później ...
Jonathan Allan
Jestem ciekawy, jak 1.ocenia się 1.5?
Wcielenie nieznajomości
@EmbodimentofIgnorance podczas dosłownego analizowania brakującej cyfry po kropce jest traktowany jako pięć. Zobacz ostatnią klauzulę parse_literal w interpreter.py
Jonathan Allan
7

Python 3 , 140 bajtów

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)

Wypróbuj online!

Jestem pewien, że ktoś będzie mógł to zrobić za pomocą wyrażenia zamiast ciągu odnośnika.

Jitse
źródło
7

Python 2 , 101 bajtów

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

Wypróbuj online!

Liczba szesnastkowa jest dziesiętna 10120214525632365878969854741, co koduje każdą uporządkowaną parę cyfr, które mogą pojawić się obok siebie.

ujemna siódemka
źródło
5

JavaScript (V8) ,  112 106  104 bajtów

Zaoszczędzono 2 bajty dzięki @NahuelFouilleul

Pełny program.

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

Wypróbuj online!

Lub 96 bajtów, jeśli możemy wyprowadzić liczby w odwrotnej kolejności:

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

Wypróbuj online!

Arnauld
źródło
działa również usuwanie ostatniego 3może, ponieważ 36jest już w ciąg
Nahuel Fouilleul
@NahuelFouilleul Dobry połów. Dzięki!
Arnauld
1
6589632145201478jest także o jeden bajt krótszy
Nahuel Fouilleul
4

Stax , 37 35 bajtów

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

Uruchom i debuguj na staxlang.xyz!

Było tak miło i krótko, dopóki nie było.

Rozpakowano (42 bajty) i wyjaśnienie

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 koduje klawiaturę. Spójrz na pary sąsiednich cyfr. Być może gdybym mógł uzyskać przyzwoicie krótką alternatywę, która idzie w obie strony dla każdej pary, mógłbym wyciąć osiem bajtów{{om .

Bez tego końcowego 670 wystarczyłby prosty filtr: f..!zamiast {..C_Qf%p. Może istnieć lepszy sposób radzenia sobie z tą nieprawidłowością. W obu przypadkach takie zachowanie zakresu filtrów jest nieudokumentowane.

Khuldraeseth na'Barya
źródło
Przepraszamy za braki w dokumentacji. FWIW, ten będzie w następnej wersji, 1.1.7. Możesz zobaczyć podgląd na stax.tomtheisen.com , ale jest to tajemnica, więc nikomu nie mów. ;)
rekurencyjny
3

PHP , 145 bajtów

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;

Wypróbuj online!

Dla każdej liczby od 1 do 50 000 sprawdza każdą cyfrę tej liczby od lewej do prawej. Jeśli wszystkie cyfry znajdują się na liście prawidłowych cyfr poprzedniej cyfry, numer ten jest drukowany. Na końcu drukuje zakodowany kod 670, ponieważ zajmuje mniej bajtów niż faktyczne zliczanie.

Noc 2
źródło
3

05AB1E , 23 bajty

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

Wypróbuj online!

Port galaretki Jonathana Allana .

Ponury
źródło
1
Ach, sprytne po prostu skompresowanie 50000 w 3 bajtach. Używałem ₄50*lub 4°5*kiedy próbowałem wcześniej. I na początku byłem zdezorientowany, dlaczego miałeś €OPzamiast tego OP, ale potem zdałem sobie sprawę, że zamiast tego üαbyłyby liczby jednocyfrowe (będące pustą listą po ) . :)[] → 0 → 0[] → [] → 1
Kevin Cruijssen
1
@KevinCruijssen Dlaczego, 4°5*kiedy możesz 5°;? Jednak bardziej lubię ZAK. I tak, ten przypadek dla liczb jednocyfrowych jest uciążliwy.
Grimmy
3

Perl 5 ( -M5.01), 96 , 92 bajtów

-4 bajty dzięki @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
źródło
92
Xcali,
dzięki, zbyt skomplikowane, ponieważ pierwsza odpowiedź była pozytywna
Nahuel Fouilleul
3

JavaScript (SpiderMonkey) , 179 173 151 129 bajtów

[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)

Wypróbuj online!

-22 bajty dziękuję Arnauld -22 bajty dziękuję Dana

wyjaśnienie:

[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 dało również 123 bajtowe rozwiązanie, jeśli możemy najpierw wydrukować 670

[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
źródło
@Arnauld dziękuję Zapomniałem tej zasady
jonatjano
129 ?
dana
123 jeśli 640 można wydrukować jako pierwszy.
dana
2

Ruby , 99 bajtów

1.upto(5e4){|n|w,*x=n.digits;x.all?{|d|[6,21,43,68,162,340,552,272,672,320][w][w=d]>0}&&p(n)}
p 670

Wypróbuj online!

GB
źródło
2

Stax , 28 26 bajtów

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

Uruchom i debuguj

Rozpakowane, niepolowane i skomentowane, wygląda to tak.

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.

Uruchom ten

Tajny sos jest w dosłownym brzmieniu "{<f:[/T8Z". Po zablokowaniu wszystkich współrzędnych kodowych razem otrzymujesz 12360102589147845690. Rosnące pary w tym ciągu są prawidłowymi ruchami węża.

rekurencyjny
źródło
1
15JJzamiast 219Jby również działał, ale nie sądzę, że możesz zagrać w golfa z tego bajtu, chyba że istnieje stała 1-bajtowa dla 15.
Arnauld
2

Haskell , 118 bajtów

(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]

Wypróbuj online!

Pierwsze przejście; Nie jestem dobry w kompresji.

To s=się nie liczy, ponieważ tak naprawdę nie musimy wiązać wyniku.

Nieskluczony kod .

kapusta
źródło
1

Węgiel drzewny , 42 bajty

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

≔ΦI…·¹×⁵⁰φ

Przetwarzaj zakres obejmujący od 1do 50,000rzutowania na ciąg.

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

Odfiltruj te, które mają pary cyfr nie zawarte w skompresowanym ciągu 01478963202125458565236987410.

θILθ

Wyprowadza pozostałą tablicę i jej długość.

Neil
źródło
1

Perl 6 , 64 bajtów

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

Wypróbuj online!

Wyjaśnienie

{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
źródło
Szkoda, że ~>nie zostało jeszcze zaimplementowane, w przeciwnym razie możesz to zrobić za pomocą tylko operatorów ciągów, a pole bitowe to ciąg znaków
Jo King
1

Pyth , 68 65 45 bajtów

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

Wypróbuj online!

Inspiracja do skorygowanego procesu wyszukiwania pochodzi z odpowiedzi Stax Khuldraeseth na'Barya , idź, daj im głos!


Edycja 2: Przepisz, aby zapisać kilka bajtów, poprzednia wersja:

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

Edycja: Golfowane 3 bajty za pomocą wyszukiwania ciągów, poprzednia wersja:

l
f.Am}ed@sMMc"12 024 0135 26 157 2468 359 48 579 68";hdCtBjT;S50000
Sok
źródło