สร้างรายการของหมายเลข snaking ต่ำกว่า 50,000


24

Snaking Number Challenge

ฉันสงสัยว่ามีจำนวนการจับงูอยู่ระหว่าง 1 ถึง 50,000?

งูบน Nokia

Snaking Numbers ในเกมนี้เป็นตัวเลขที่สามารถพิมพ์ได้บนแป้นตัวเลขแบบดั้งเดิม (รูปแบบด้านล่าง) โดยการเลื่อนหนึ่งคีย์ขึ้นลงซ้ายหรือขวา

7 8 9
4 5 6
1 2 3
 0

ตัวอย่างเช่นถ้าคุณเริ่มต้นด้วยหมายเลข 5 คุณสามารถเลือก 4, 6, 8, หรือ 2 เป็นการย้ายที่ถูกต้องครั้งต่อไปของคุณอย่างไรก็ตาม 7, 3, 9 และ 1 เป็นค่า จำกัด เนื่องจากตำแหน่งเหล่านี้อยู่ในแนวทแยงมุมกับปุ่มปัจจุบัน . ดังนั้นถ้าคุณมี 5, 2 แล้วตัวเลือกที่สำคัญที่คุณใช้งานได้ต่อไปคือ 0, 1, 3 หรือ 5 อีกครั้ง

ในแบบฝึกหัด Code Golf นี้คุณจะต้องแสดงรายการตัวเลขการจับยึดที่เป็นบวกทั้งหมดระหว่าง 1 ถึง 50k พร้อมกับการนับจำนวนสุดท้ายของตัวเลขทั้งหมดที่ตรงตามเกณฑ์

กฎระเบียบ

  1. ตัวเลขไม่สามารถเริ่มต้นด้วยศูนย์
  2. ตัวเลขต้องเป็นจำนวนเต็มบวกทั้งหมด
  3. แต่ละหมายเลขติดต่อกันอ่านจากซ้ายไปขวาต้อง "งู" รอบ ๆ ตัวเลข
  4. งูไม่สามารถเดินทางในแนวทแยงมุมข้ามกุญแจ
  5. หมายเลข 0 สามารถเข้าถึงได้จากทั้งหมายเลข 1 และ 2
  6. ไม่สามารถจับคู่หมายเลขได้ (เช่น: 22)

ตัวอย่างของหมายเลข Snaking ที่ถูกต้อง:

12369
45201
1254
10102
1
12
987

ตัวอย่างของตัวเลขที่ไม่ถูกต้อง

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

ตามรหัสของ Golf Golf เป้าหมายมีจุดมุ่งหมายน้อยที่สุด!

ตามคณิตศาสตร์และกฎของฉันคุณควรมีหมายเลข snaking ที่ถูกต้อง 670 รายการในรายการของคุณบวกด้วย 670 ตัวที่พิมพ์ออกมาเป็นหมายเลขสุดท้าย


2
ควรเรียงลำดับผลลัพธ์หรือไม่ หรืออนุญาตในลำดับใด ๆ
TSH

2
เมื่อเห็นว่าคุณกำลังขอให้เราส่งออกจำนวนเต็มคงที่และ จำกัด ฉันขอแนะนำให้รวมรายการทั้งหมดไว้ในข้อมูลจำเพาะ
Shaggy


4
นี้เป็นส่วนหนึ่งของA215009
bigyihsuan

จะเป็นไรไหมที่จะพิมพ์ 670 ก่อน ?
dana

คำตอบ:


14

K (ngn / k) , 60 57 ไบต์

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

ลองออนไลน์!

!50000รายการของ0..49999

1+ เพิ่ม 1 ทั้งหมด

{ }# ตัวกรองพร้อมฟังก์ชันใน { }

10\x ตัวเลขทศนิยมของอาร์กิวเมนต์

( )@ ใช้เป็นดัชนีใน ...

  • !3 3 คู่ของรายการ: (0 0 0 1 1 1 2 2 2;0 1 2 0 1 2 0 1 2)

  • 2* คูณทั้งหมดด้วย 2

  • 0 1,'เสริม0ไปที่รายการแรกและ1ที่สอง

  • +ไขว้ (รายการคู่ -> รายการคู่) นี่ทำให้เรามีปุ่มประสานประมาณ

-':ลบออกจากแต่ละคู่ของคู่ก่อนหน้า ใช้0 0เป็นองค์ประกอบจินตภาพก่อนหน้าแรก

1_ วางแรก

+ transpose

x*x:สแควร์ (กำหนดให้xและคูณด้วยx) นี่xคือรายการคู่ - ∆xs และ ∆ys

+/ รวมสองรายการ (องค์ประกอบโดยองค์ประกอบ)

5& ขั้นต่ำกับ 5

3! mod 3

1= รายการบูลีนที่ซึ่งมันเท่ากับ 1

*/ ผลิตภัณฑ์ (บูลีน "และ")

(x;#x: )ทำคู่ของผลลัพธ์และความยาว ( #) ของผลลัพธ์


9

เจลลี่ ,  24  23 ไบต์

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

โปรแกรมเต็มรูปแบบที่พิมพ์รายการผลลัพธ์ทั้งหมดแล้วตามด้วยจำนวนผลลัพธ์

ลองออนไลน์!

อย่างไร?

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

ฉันชอบที่จะรู้ว่าสิ่งนี้ทำงานอย่างไร โอกาสใดที่คุณสามารถแยกย่อยได้?
MightBeAlon

1
@MightBeAlon จะทำในภายหลัง ...
Jonathan Allan

ฉันอยากรู้ว่าจะ1.ประเมินได้1.5อย่างไร
ศูนย์รวมแห่งความไม่รู้

@EmbodimentofIgnorance ระหว่างการแยกวิเคราะห์ตัวอักษรที่หายไปหลังจากช่วงเวลาหนึ่งถือว่าเป็นห้า ดูประโยคสุดท้ายของ parse_literal ใน interpreter.py
Jonathan Allan

7

Python 3 , 140 ไบต์

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)

ลองออนไลน์!

ฉันมั่นใจว่าบางคนจะสามารถทำสิ่งนี้ได้ด้วยนิพจน์แทนที่จะเป็นสตริงการค้นหา


7

Python 2 , 101 ไบต์

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

ลองออนไลน์!

เลขฐานสิบหกเป็นทศนิยม10120214525632365878969854741ซึ่งเข้ารหัสทุกคู่ของตัวเลขที่สั่งซื้อซึ่งสามารถปรากฏขึ้นพร้อมกัน


5

JavaScript (V8) ,  112 106  104 ไบต์

บันทึก 2 ไบต์ขอบคุณ @NahuelFouilleul

โปรแกรมเต็มรูปแบบ

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

ลองออนไลน์!

หรือ96 ไบต์ถ้าเราสามารถส่งออกตัวเลขในลำดับย้อนกลับ:

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

ลองออนไลน์!


ผลงานการลบครั้งสุดท้าย3อาจ36เป็นเพราะมีอยู่แล้วในสาย
Nahuel Fouilleul

@NahuelFouilleul จับได้ดี ขอบคุณ!
Arnauld

1
ก็6589632145201478สั้นลงหนึ่งไบต์
Nahuel Fouilleul

4

Stax , 37 35 bytes

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

เรียกใช้และแก้ไขปัญหาได้ที่ staxlang.xyz!

มันดีและสั้นมากจนกระทั่งมันไม่

คลายการแพค (42 ไบต์) และคำอธิบาย

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 เข้ารหัสปุ่มกด ดูคู่ของตัวเลขที่อยู่ติดกัน บางทีถ้าฉันจะได้รับทางเลือกที่สั้น decently {{omที่จะไปในทั้งสองทิศทางสำหรับแต่ละคู่ผมสามารถตัดแปดไบต์

โดยไม่ต้องต่อท้ายที่ 670, กรองง่ายจะพอเพียง: แทนf..! {..C_Qf%pอาจมีวิธีที่ดีกว่าในการจัดการความผิดปกตินี้ ไม่ว่าในกรณีใดพฤติกรรมของช่วงตัวกรองนี้จะไม่มีเอกสาร


ขออภัยเกี่ยวกับช่องว่างเอกสาร FWIW นั้นจะอยู่ในรุ่นถัดไป 1.1.7 คุณสามารถดูตัวอย่างได้ที่stax.tomtheisen.comแต่เป็นความลับอย่าบอกใคร ;)
ซ้ำ

3

PHP , 145 ไบต์

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;

ลองออนไลน์!

สำหรับทุกหมายเลขตั้งแต่ 1 ถึง 50,000 ให้ตรวจสอบทุกหลักของตัวเลขนั้นจากซ้ายไปขวา หากตัวเลขทั้งหมดอยู่ในรายการของตัวเลขที่ถูกต้องของตัวเลขก่อนหน้าตัวเลขนั้นจะถูกพิมพ์ ในตอนท้ายพิมพ์ฮาร์ดโค้ด 670 เนื่องจากใช้เวลาน้อยกว่าการนับจริง


3

05AB1E , 23 ไบต์

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

ลองออนไลน์!

พอร์ตของโจนาธานอัลลันเป็นคำตอบวุ้น


1
อ่าฉลาดแค่อัด 50000 ใน 3 ไบต์ ฉันกำลังใช้₄50*หรือ4°5*เมื่อฉันพยายามก่อนหน้านี้ และในครั้งแรกที่ผมสับสนว่าทำไมคุณมี€OPแทนเพียงOPแต่แล้วฉันตระหนักตัวเลขหลักเดียว (เป็นรายการที่ว่างเปล่าหลังüα) แล้วก็จะแทน[] → 0 → 0 [] → [] → 1:)
Kevin Cruijssen

1
@KevinCruijssen ทำไม4°5*เมื่อคุณสามารถ5°;? ฉันชอบ ZAK ดีกว่า และใช่กรณีที่ขอบสำหรับตัวเลขหลักเดียวคือความเจ็บปวด
Grimmy

3

Perl 5 ( -M5.01), 96 , 92 ไบต์

-4 ไบต์ขอบคุณ @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

3

JavaScript (SpiderMonkey) , 179 173 151 129 ไบต์

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

ลองออนไลน์!

-22 bytes ขอบคุณ Arnauld -22 bytes ขอบคุณ dana

คำอธิบาย:

[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 ยังให้โซลูชัน 123 ไบต์หากเราสามารถพิมพ์ 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))

@Arnauld ขอบคุณฉันลืมกฎนี้
jonatjano



123ถ้า 640 สามารถพิมพ์ได้ก่อน
dana


2

Stax , 28 26 ไบต์

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

เรียกใช้และแก้ไขข้อบกพร่อง

คลายกล่อง ungolfed และแสดงความคิดเห็นมันมีลักษณะเช่นนี้

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:[/T8Z"ซอสลับอยู่ในตัวอักษรสตริง หลังจากที่ติดขัด codepoints 12360102589147845690ทั้งหมดเข้าด้วยกันคุณจะได้รับ คู่ที่มากขึ้นของสตริงนี้คือการเคลื่อนไหวของงูที่ถูกต้อง


1
15JJแทน219Jจะทำงานเช่นกัน แต่ผมไม่คิดว่าคุณสามารถกอล์ฟไบต์ใด ๆ จากที่นั่นเว้นแต่มีค่าคงที่ 1 15ไบต์สำหรับ
Arnauld

2

Haskell , 118 ไบต์

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

ลองออนไลน์!

ผ่านครั้งแรก; ฉันไม่เก่งเรื่องการบีบอัด

s=ไม่นับตั้งแต่ที่เราไม่จำเป็นต้องใช้จริงในการผูกผล

รหัสที่ไม่ได้รับการปรับปรุง


1

ถ่าน 42 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

≔ΦI…·¹×⁵⁰φ

ประมวลผลช่วงที่รวมจาก1เพื่อ50,000ส่งถึงสตริง

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

01478963202125458565236987410กรองจากผู้ที่มีคู่ของตัวเลขไม่ได้อยู่ในสายการบีบอัด

θILθ

เอาต์พุตอาร์เรย์ที่เหลือและความยาว



1

Perl 6 , 64 ไบต์

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

ลองออนไลน์!

คำอธิบาย

{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

มันน่าเสียดายที่~>ยังไม่ได้ใช้งานมิฉะนั้นคุณอาจทำได้โดยใช้ตัวดำเนินการแบบสตริงโดยที่บิตของบิตเป็นสตริง
โจคิง

1

Pyth , 68 65 45 ไบต์

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

ลองออนไลน์!

แรงบันดาลใจสำหรับกระบวนการค้นหาที่แก้ไขมาจากคำตอบของ Khuldraeseth na'Baryaไปให้พวกเขาโหวตขึ้น!


แก้ไข 2: เขียนใหม่เพื่อบันทึกเครือข่ายไบต์รุ่นก่อนหน้า:

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

แก้ไข: Golfed 3 ไบต์โดยใช้การค้นหาสตริงรุ่นก่อนหน้า:

l
f.Am}ed@sMMc"12 024 0135 26 157 2468 359 48 579 68";hdCtBjT;S50000
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.