Tạo một danh sách các số rắn dưới 50.000


24

Thử thách số rắn

Tôi tự hỏi có bao nhiêu số rắn có từ 1 đến 50.000?

Rắn trên Nokia

Snakes Numbers, trong trò chơi này, là những số có thể được gõ trên bàn phím số truyền thống (định dạng bên dưới) bằng cách di chuyển một phím lên, xuống, sang trái hoặc phải.

7 8 9
4 5 6
1 2 3
 0

Ví dụ: nếu bạn bắt đầu với số 5, bạn có thể chọn 4, 6, 8 hoặc 2 làm bước di chuyển hợp lệ tiếp theo của mình - tuy nhiên 7, 3, 9 và 1 là ngoài giới hạn vì chúng được đặt theo đường chéo với khóa hiện tại . Vì vậy, nếu bạn có 5, sau đó 2, các lựa chọn khóa khả thi tiếp theo của bạn là 0, 1, 3 hoặc 5 một lần nữa.

Trong bài tập Code Golf này, bạn phải đưa ra một danh sách tất cả các số rắn tích cực trong khoảng từ 1 đến 50k, cùng với số đếm cuối cùng của tất cả các số đáp ứng tiêu chí.

Quy tắc

  1. Số không thể bắt đầu bằng số không.
  2. Số phải là số nguyên dương.
  3. Mỗi số liên tiếp, đọc từ trái sang phải, phải "rắn" xung quanh bàn phím số.
  4. Con rắn không thể đi theo đường chéo trên các phím
  5. Số 0 có thể được truy cập từ cả hai số 1 và 2
  6. Các số không thể được ghép nối (ví dụ: 22)

Ví dụ về số Snakes hợp lệ:

12369
45201
1254
10102
1
12
987

Ví dụ về các số không hợp lệ

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

Theo Code Golf thông thường, mục tiêu là ít byte nhất!

Theo toán học và quy tắc của tôi, bạn nên có 670 số bắt rắn hợp lệ trong danh sách của mình, cộng với số 670 được in là số cuối cùng.


2
Có nên sắp xếp đầu ra? Hoặc nó được cho phép theo thứ tự nào?
tsh

2
Thấy rằng bạn đang yêu cầu chúng tôi xuất ra một bộ số nguyên cố định và hữu hạn, tôi đề nghị bao gồm danh sách đầy đủ trong thông số kỹ thuật.
Xù xì


4
Đây là một tập hợp con của A215009 .
bigyihsuan

Nó có ổn không khi in 670 đầu tiên ?
dana

Câu trả lời:


14

K (ngn / k) , 60 57 byte

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

Hãy thử trực tuyến!

!50000danh sách của 0..49999

1+ thêm 1 cho tất cả

{ }# bộ lọc với chức năng trong { }

10\x chữ số thập phân của đối số

( )@ sử dụng như chỉ số trong ...

  • !3 3 một cặp danh sách: (0 0 0 1 1 1 2 2 2;0 1 2 0 1 2 0 1 2)

  • 2* nhân tất cả với 2

  • 0 1,' trả trước 0 danh sách đầu tiên và1 thứ hai

  • +chuyển vị (cặp danh sách -> danh sách các cặp). Điều này cung cấp cho chúng tôi các coords nút khoảng.

-':trừ đi từng cặp trước đó. sử dụng0 0 như một yếu tố tưởng tượng trước khi đầu tiên.

1_ thả cái đầu tiên

+ hoán vị

x*x:vuông (gán cho xvà nhân với x). đâyx là một cặp danh sách - ∆xs và ∆ys

+/ tổng hai danh sách (yếu tố theo yếu tố)

5& tối thiểu với 5

3! mod 3

1= danh sách boolean của nơi nó bằng 1

*/ sản phẩm (boolean "và")

(x;#x: )tạo một cặp kết quả và độ dài ( #) của kết quả


9

Thạch ,  24  23 byte

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

Một chương trình đầy đủ in ra một danh sách tất cả các kết quả và sau đó là số lượng kết quả.

Hãy thử trực tuyến!

Làm sao?

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

Tôi muốn biết làm thế nào điều này hoạt động. Bất kỳ cơ hội bạn có thể đưa ra một sự cố?
MightBeAlon

1
@MightBeAlon sẽ làm sau ...
Jonathan Allan

Tôi tò mò, làm thế nào để 1.đánh giá 1.5?
Hiện thân của sự thiếu hiểu biết

@EmbodimentofIgnorance trong khi phân tích cú pháp chữ số bị thiếu sau một khoảng thời gian được coi là năm. Xem mệnh đề khác cuối cùng của parse_literal trong phiên dịch
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)

Hãy thử trực tuyến!

Tôi tích cực, ai đó sẽ có thể làm điều này với một biểu thức thay vì chuỗi tra cứu.


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

Hãy thử trực tuyến!

Số hex là số thập phân 10120214525632365878969854741, mã hóa mọi cặp chữ số có thứ tự có thể xuất hiện liền kề nhau.


5

JavaScript (V8) ,  112 106  104 byte

Đã lưu 2 byte nhờ @NahuelFouilleul

Một chương trình đầy đủ.

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

Hãy thử trực tuyến!

Hoặc 96 byte nếu chúng ta có thể xuất các số theo thứ tự ngược lại:

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

Hãy thử trực tuyến!


các tác phẩm cũng loại bỏ cái cuối cùng 3có thể vì 36đã có trong chuỗi
Nahuel Fouilleul

@NahuelFouilleul Bắt tốt. Cảm ơn!
Arnauld

1
cũng 6589632145201478ngắn hơn một byte
Nahuel Fouilleul

4

Stax , 37 35 byte

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

Chạy và gỡ lỗi nó tại staxlang.xyz!

Nó thật đẹp và ngắn, cho đến khi nó không còn nữa.

Giải nén (42 byte) và giải thích

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 mã hóa bàn phím. Nhìn vào các cặp chữ số liền kề. Có lẽ nếu tôi có thể có được một sự thay thế ngắn gọn theo cả hai hướng cho mỗi cặp, tôi có thể cắt tám byte{{om .

Nếu không có 670 đó, một bộ lọc đơn giản sẽ đủ: f..!thay vì {..C_Qf%p. Có thể có một cách tốt hơn để xử lý sự bất thường này. Trong cả hai trường hợp, hành vi phạm vi bộ lọc này là không có giấy tờ.


Xin lỗi về các lỗ hổng tài liệu. FWIW, cái đó sẽ có trong phiên bản tiếp theo, 1.1.7. Bạn có thể xem bản xem trước tại stax.tomtheisen.com , nhưng đó là một bí mật vì vậy đừng nói cho ai biết. ;)
đệ quy

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;

Hãy thử trực tuyến!

Đối với mỗi số từ 1 đến 50.000, kiểm tra từng chữ số của số đó từ trái sang phải. Nếu tất cả các chữ số nằm trong danh sách các chữ số hợp lệ của chữ số trước đó, số đó sẽ được in. Cuối cùng, in một mã cứng 670 vì nó tốn ít byte hơn so với thực tế đếm nó.


3

05AB1E , 23 byte

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

Hãy thử trực tuyến!

Câu trả lời của Jonathan Jonathan Allan .


1
Ah, thông minh chỉ cần nén 50000 trong 3 byte. Tôi đã sử dụng ₄50*hoặc 4°5*khi tôi đang cố gắng trước đó. Và lúc đầu, tôi đã bối rối tại sao bạn lại €OPthay vì chỉ OP, nhưng sau đó tôi nhận ra các số có một chữ số (là một danh sách trống sau üα) sẽ [] → 0 → 0thay vì [] → [] → 1. :)
Kevin Cruijssen

1
@KevinCruijssen Tại sao 4°5*khi bạn có thể 5°;? Tôi thích ZAK hơn mặc dù. Và vâng, trường hợp cạnh đó cho các số có một chữ số là một nỗi đau.
Grimmy

3

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

-4 byte nhờ @Xcali

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

TIO



thực sự cảm ơn, quá phức tạp vì câu trả lời đầu tiên là trận đấu tích cực
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)

Hãy thử trực tuyến!

-22 byte cảm ơn Arnauld -22 byte cảm ơn dana

giải trình:

[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 cũng đưa ra giải pháp 123 byte nếu chúng ta có thể in 670 trước

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

@Arnauld cảm ơn tôi đã quên quy tắc này
jonatjano



123 nếu 640 có thể được in trước.
dana


2

Stax , 28 26 byte

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

Chạy và gỡ lỗi nó

Giải nén, không được chỉnh sửa và nhận xét, nó trông như thế này.

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.

Chạy cái này

Nước sốt bí mật là trong chuỗi chữ "{<f:[/T8Z". Sau khi gây nhiễu tất cả các mật mã với nhau, bạn nhận được 12360102589147845690. Các cặp tăng dần trong chuỗi này là di chuyển con rắn hợp lệ.


1
15JJthay vì 219Jsẽ hoạt động tốt, nhưng tôi không nghĩ bạn có thể chơi bất kỳ byte nào từ đó trừ khi có hằng số 1 byte cho 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]

Hãy thử trực tuyến!

Một vượt qua đầu tiên; Tôi không giỏi nén.

Các s= lượng không được tính, vì chúng ta thực sự không cần phải ràng buộc kết quả.

Mã mã .


1

Than , 42 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

≔ΦI…·¹×⁵⁰φ

Xử lý phạm vi bao gồm từ 1để 50,000đúc thành chuỗi.

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

Lọc ra những cái có cặp chữ số không có trong chuỗi nén 01478963202125458565236987410.

θILθ

Xuất ra mảng còn lại và chiều dài của nó.



1

Perl 6 , 64 byte

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

Hãy thử trực tuyến!

Giải trình

{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

Thật đáng tiếc ~>chưa được triển khai, nếu không, bạn có thể làm điều này chỉ với các toán tử chuỗi, với trường bit là một chuỗi
Jo King

1

Pyth , 68 65 45 byte

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

Hãy thử trực tuyến!

Cảm hứng cho quá trình tra cứu sửa đổi đến từ câu trả lời Stax của Khuldraeseth na'Barya , hãy cho họ một upvote!


Chỉnh sửa 2: Viết lại để lưu một loạt byte, phiên bản trước:

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

Chỉnh sửa: Đã đánh 3 byte bằng cách sử dụng tra cứu chuỗi, phiên bản trước:

l
f.Am}ed@sMMc"12 024 0135 26 157 2468 359 48 579 68";hdCtBjT;S50000
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.