Buat daftar angka mengular di bawah 50.000

24

Tantangan Nomor Snaking

Saya bertanya-tanya berapa banyak angka yang ada antara 1 dan 50.000?

Ular pada Nokia

Snaking Numbers, dalam game ini, adalah angka yang dapat diketik pada papan angka tradisional (format di bawah) dengan menggerakkan satu tombol ke atas, bawah, kiri, atau kanan.

7 8 9
4 5 6
1 2 3
 0

Misalnya, jika Anda mulai dengan angka 5, Anda dapat memilih 4, 6, 8, atau 2 sebagai langkah valid berikutnya - namun 7, 3, 9, dan 1 terlarang karena diposisikan secara diagonal ke kunci saat ini . Jadi, jika Anda memiliki 5, maka 2, pilihan kunci Anda berikutnya yang layak adalah 0, 1, 3, atau 5 lagi.

Dalam latihan Code Golf ini, Anda harus menampilkan daftar semua bilangan ular positif antara 1 dan 50k, bersama dengan penghitungan akhir dari semua angka yang memenuhi kriteria.

Aturan

  1. Angka tidak bisa dimulai dengan Nol.
  2. Bilangan harus berupa bilangan bulat positif.
  3. Setiap angka berurutan, baca dari kiri ke kanan, harus "ular" di sekitar panel angka.
  4. Ular tidak dapat berjalan secara diagonal melintasi kunci
  5. Angka 0 dapat diakses dari angka 1 dan 2
  6. Angka tidak dapat dipasangkan (mis .: 22)

Contoh Nomor Ular yang valid:

12369
45201
1254
10102
1
12
987

Contoh angka yang tidak valid

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

Seperti Golf Code normal, tujuannya adalah byte paling sedikit!

Menurut matematika dan aturan saya, Anda harus memiliki 670 angka snaking yang valid dalam daftar Anda, ditambah 670 itu sendiri dicetak sebagai angka terakhir.

MightBeAlon
sumber
2
Haruskah output diurutkan? Atau diizinkan dalam urutan apa pun?
tsh
2
Melihat saat Anda meminta kami untuk mengeluarkan satu set bilangan bulat yang tetap dan terbatas, saya sarankan menyertakan daftar lengkap dalam spesifikasi.
Shaggy
Terkait
Arnauld
4
Ini adalah subset dari A215009 .
bigyihsuan
Apakah lebih baik mencetak 670 dulu ?
dana

Jawaban:

14

K (ngn / k) , 60 57 byte

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

Cobalah online!

!50000daftar 0..49999

1+ tambahkan 1 ke semua

{ }# filter dengan fungsi dalam { }

10\x digit desimal dari argumen

( )@ gunakan sebagai indeks di ...

  • !3 3 sepasang daftar: (0 0 0 1 1 1 2 2 2;0 1 2 0 1 2 0 1 2)

  • 2* kalikan semua dengan 2

  • 0 1,'tambahkan 0ke daftar pertama dan 1ke yang kedua

  • +transpose (pasangan daftar -> daftar pasangan). ini memberi kita tombol kira-kira coords.

-':kurangi dari masing-masing pasangan pasangan sebelumnya. gunakan 0 0sebagai elemen imajiner sebelum yang pertama.

1_ jatuhkan dulu

+ mengubah urutan

x*x:kuadrat (tetapkan ke xdan kalikan dengan x). di sini xadalah sepasang daftar - ∆xs dan ∆ys

+/ jumlah kedua daftar (elemen demi elemen)

5& min dengan 5

3! mod 3

1= daftar boolean di mana itu sama dengan 1

*/ produk (boolean "dan")

(x;#x: )buat pasangan hasil dan panjang ( #) dari hasil

ngn
sumber
9

Jelly ,  24  23 byte

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

Program lengkap yang mencetak daftar semua hasil dan kemudian jumlah hasil.

Cobalah online!

Bagaimana?

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
sumber
Saya ingin tahu bagaimana cara kerjanya. Apakah ada kemungkinan Anda bisa memberikan rincian?
MightBeAlon
1
@MightBeAlon akan melakukannya nanti ...
Jonathan Allan
Saya ingin tahu, bagaimana cara 1.mengevaluasi 1.5?
Perwujudan Ketidaktahuan
@EmbodimentofIgnorance selama parsing digit yang hilang setelah periode diperlakukan sebagai lima. Lihat klausa final lain dari parse_literal di interpreter.py
Jonathan Allan
7

Python 3 , 140 byte

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)

Cobalah online!

Saya yakin seseorang akan dapat melakukan ini dengan ekspresi daripada string pencarian.

Jitse
sumber
7

Python 2 , 101 byte

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

Cobalah online!

Nomor hex adalah desimal 10120214525632365878969854741, yang menyandikan setiap pasangan angka yang terurut yang dapat tampak berdekatan satu sama lain.

negatif tujuh
sumber
5

JavaScript (V8) ,  112 106  104 byte

Disimpan 2 byte berkat @NahuelFouilleul

Program lengkap.

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

Cobalah online!

Atau 96 byte jika kita dapat menampilkan angka dalam urutan terbalik:

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

Cobalah online!

Arnauld
sumber
bekerja juga menghapus yang terakhir 3mungkin karena 36sudah dalam string
Nahuel Fouilleul
@NahuelFouilleul Tangkapan yang bagus. Terima kasih!
Arnauld
1
juga 6589632145201478satu byte lebih pendek
Nahuel Fouilleul
4

Stax , 37 35 byte

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

Jalankan dan debug di staxlang.xyz!

Itu sangat bagus dan pendek, sampai tidak.

Dibongkar (42 byte) dan penjelasan

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 menyandikan keypad. Lihatlah pasangan digit yang berdekatan. Mungkin jika saya bisa mendapatkan alternatif pendek yang layak yang berjalan di kedua arah untuk setiap pasangan, saya bisa memotong delapan byte{{om .

Tanpa trailing 670 itu, filter sederhana akan cukup: f..!alih-alih {..C_Qf%p. Mungkin ada cara yang lebih baik untuk menangani penyimpangan ini. Dalam kedua kasus, perilaku rentang filter ini tidak berdokumen.

Khuldraeseth na'Barya
sumber
Maaf tentang celah dokumentasi. FWIW, yang akan ada di rilis berikutnya, 1.1.7. Anda dapat melihat pratinjau di stax.tomtheisen.com , tapi ini rahasia jadi jangan beri tahu siapa pun. ;)
rekursif
3

PHP , 145 byte

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;

Cobalah online!

Untuk setiap angka dari 1 hingga 50.000, periksa setiap digit dari angka itu dari kiri ke kanan. Jika semua digit ada dalam daftar digit yang valid dari digit sebelumnya, angka itu dicetak. Pada akhirnya mencetak 670 kode keras karena itu membutuhkan lebih sedikit byte daripada benar-benar menghitungnya.

Night2
sumber
3

05AB1E , 23 byte

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

Cobalah online!

Port of Jonathan Jonathan menjawab Jelly .

Grimmy
sumber
1
Ah, pintar hanya memampatkan 50.000 dalam 3 byte. Saya menggunakan ₄50*atau 4°5*ketika saya mencoba sebelumnya. Dan pada awalnya saya bingung mengapa Anda tidak €OPhanya adil OP, tetapi kemudian saya menyadari angka satu digit (menjadi daftar kosong setelah üα) kemudian akan menjadi [] → 0 → 0bukan [] → [] → 1. :)
Kevin Cruijssen
1
@KevinCruijssen Mengapa 4°5*kapan Anda bisa 5°;? Saya suka ZAK lebih baik. Dan ya, kasing tepi untuk angka satu digit itu menyusahkan.
Grimmy
3

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

-4 byte terima kasih kepada @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
sumber
92
Xcali
terima kasih memang, terlalu rumit karena jawaban pertama adalah pertandingan positif
Nahuel Fouilleul
3

JavaScript (SpiderMonkey) , 179 173 151 129 byte

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

Cobalah online!

-22 byte terima kasih kepada Arnauld -22 byte terima kasih untuk dana

penjelasan:

[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 juga memberikan solusi 123 byte jika kita dapat mencetak 670 terlebih dahulu

[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
sumber
@Arnauld terima kasih saya lupa aturan ini
jonatjano
129 ?
dana
123 jika 640 dapat dicetak terlebih dahulu.
dana
2

Ruby , 99 byte

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

Cobalah online!

GB
sumber
2

Stax , 28 26 byte

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

Jalankan dan debug itu

Dibongkar, tidak diserang, dan dikomentari, sepertinya ini.

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.

Jalankan yang ini

Saus rahasianya ada dalam string literal "{<f:[/T8Z". Setelah menyatukan semua codepoint bersama, Anda dapatkan 12360102589147845690. Pasangan naik dalam string ini adalah gerakan ular yang valid.

rekursif
sumber
1
15JJbukannya 219Jakan bekerja dengan baik, tapi saya tidak berpikir Anda bisa golf byte apa pun dari sana kecuali ada konstanta 1-byte untuk 15.
Arnauld
2

Haskell , 118 byte

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

Cobalah online!

Lulus pertama; Saya tidak pandai kompresi.

Tidak s=masuk hitungan, karena kita sebenarnya tidak perlu mengikat hasilnya.

Kode tidak dikunci .

cole
sumber
1

Arang , 42 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

≔ΦI…·¹×⁵⁰φ

Proses kisaran inklusif dari 1ke 50,000pemain string.

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

Saring yang memiliki pasangan angka yang tidak terkandung dalam string yang dikompresi 01478963202125458565236987410.

θILθ

Keluarkan array yang tersisa dan panjangnya.

Neil
sumber
1

Perl 6 , 64 byte

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

Cobalah online!

Penjelasan

{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
sumber
Sayang sekali ~>belum diimplementasikan, jika tidak, Anda mungkin dapat melakukan ini hanya dengan operator string, dengan bidang bit menjadi string
Jo King
1

Pyth , 68 65 45 byte

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

Cobalah online!

Inspirasi untuk proses pencarian yang direvisi datang dari jawaban Stax Khuldraeseth na'Barya , pergi beri mereka dukungan!


Sunting 2: Menulis ulang untuk menyimpan banyak byte, versi sebelumnya:

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

Sunting: Golf 3 byte dengan menggunakan pencarian string, versi sebelumnya:

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