อัศวินหมายเลขของ Numpad


33

สำหรับตัวเลขที่ไม่เป็นศูนย์บนnumpadมาตรฐาน

789
456
123

พิจารณาวางอัศวินหมากรุกที่ตัวเลขใด ๆ และเคลื่อนไปรอบ ๆ ด้วยการกระโดดรูปตัว L ปกติจำนวนใด ๆ ติดตามจำนวนเต็มทศนิยมบวก จำนวนเต็มบวกใดที่สามารถแสดงออกได้ในลักษณะนี้?

หนึ่งในนั้นคือ38ตั้งแต่อัศวินสามารถเริ่มต้นบนและเลื่อนไปทางซ้ายและขึ้นไป3 และยังเป็นไปได้8381383

3ตัวเองเป็นไปได้ถ้าไม่มีการกระโดด (ซึ่งได้รับอนุญาต) 5เป็นเช่นกัน แต่ไม่สามารถเข้าถึงตัวเลขอื่น ๆ ได้จาก5ดังนั้นจึงเป็นหมายเลขเดียวที่ตัวเลขนั้น5ปรากฏขึ้น

เขียนโปรแกรมหรือฟังก์ชั่นที่รับค่าจำนวนเต็มฐานสิบบวก (คุณอาจใช้มันเป็นสตริงได้หากต้องการ) และพิมพ์หรือส่งกลับค่าความจริงหากตัวเลขสามารถแสดงได้โดยอัศวินบนเลขฐานแปดตามวิธีที่อธิบายไว้falsyค่า

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ Tiebreaker เป็นคำตอบก่อนหน้า

ตัวอย่าง

Truthy:

1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 18, 38, 61, 81, 294, 349, 381, 383, 729, 767, 38183, 38383, 18349276, 183492761, 618349276

Falsy:

10, 11, 50, 53, 55, 65, 95, 100, 180, 182, 184, 185, 186, 187, 188, 189, 209, 305, 2009, 5030, 3838384, 4838383, 183492760


1
คำแนะนำ: ถ้าคุณเขียนตัวเลขออกมาเป็นเส้นการพันแล้วอัศวินก็จะกระโดดสี่ช่องตามเข็มนาฬิกาหรือสี่ช่องว่างเสมอ ฉันไม่รู้ว่าสิ่งนี้มีประโยชน์หรือไม่
คดีฟ้องร้องกองทุนโมนิก้า

3
@LuisMendo Wrapping เช่นเดียวกับในกรณีที่คุณปฏิบัติต่อผู้อื่นอย่างไม่สิ้นสุด78963214ให้ทำซ้ำซ้ำแล้วซ้ำอีก นับระยะทาง - เป็นสี่เสมอไม่ทางใดก็ทางหนึ่ง ฉันควรจะชัดเจนและพูดอย่างชัดเจนว่าคุณต้องเขียนมันในลำดับวงกลม
คดีฟ้องร้องกองทุนโมนิก้า

@QPaysTaxes โอ้ฉันคิดว่าคุณหมายวงกลม 123...9แต่ ขออภัย
Luis Mendo

@LuisMendo ไม่ต้องกังวล อย่างที่ฉันพูดฉันควรจะชัดเจนเกี่ยวกับสิ่งที่ฉันหมายถึง
คดีฟ้องร้องกองทุนโมนิก้า

คำตอบ:


16

เยลลี่, 19 15 14 ไบต์

Doȷ’d3ạ2\P€=2P

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

มันทำงานอย่างไร

Doȷ’d3ạ2\P€=2P  Main link. Argument: n (integer)

D               Convert n to base 10 (digit array).
  ȷ             Yield 1000.
 o              Logical OR. This replaces each 0 with 1000.
   ’            Decrement each digit.
    d3          Divmod; replace each digit k with [k:3, k%3].
      ạ2\       Pairwise reduce by absolute difference.
                For each pair of adjacent digits [i, j], this computes
                [abs(i:3 - j:3), abs(i%3 - j%3)].
         P€     Compute the product of each result.
                n is a Numpad's Knight Number iff all products yield 2.
           =2   Compare each product with 2.
             P  Multiply the resulting Booleans.

18

Python 2, 52 ไบต์

f=lambda n:n<6or`n%100`in'18349276167294381'*f(n/10)

'18349276167294381'ตรวจสอบว่ามีตัวเลขสองหลักติดต่อกันในสตริง เพื่อให้ได้ตัวเลขที่ต่อเนื่องกันแทนที่จะทำเช่นzip(`n`,`n`[1:])นั้นฟังก์ชั่นจะตรวจสอบตัวเลขสองหลักสุดท้ายและลบตัวเลขสุดท้าย


13

เรติน่า58 58ไบต์

ขอบคุณ Sp3000 ที่แนะนำแนวคิดนี้:

M&!`..
O%`.
A`16|18|27|29|34|38|49|67
^$

ลองออนไลน์! (แก้ไขเล็กน้อยเพื่อรันชุดทดสอบทั้งหมดในครั้งเดียว)

พิมพ์1เพื่อความจริงและ0เพื่อผลลัพธ์ที่ผิดพลาด

คำอธิบาย

M&!`..

ค้นหาการจับคู่ที่ทับซ้อนกันทั้งหมด..เช่นคู่ของตัวเลขที่ต่อเนื่องกันทั้งหมดและเข้าร่วมกับ linefeeds

O%`.

จัดเรียงตัวเลขในแต่ละบรรทัดเพื่อให้เราตรวจสอบเพียงครึ่งเดียวให้มากที่สุด

A`16|18|27|29|34|38|49|67

ลบบรรทัดทั้งหมดที่สอดคล้องกับการย้ายที่ถูกต้อง

^$

นับการแข่งขันของ regex นี้ นั่นคือถ้าลบบรรทัดทั้งหมดแล้วสิ่งนี้จะจับคู่กับสตริงว่างที่เกิดขึ้นครั้งเดียวไม่เช่นนั้นจะไม่สามารถจับคู่และให้ศูนย์แทนได้



7

Ruby, 57 ไบต์

ฟังก์ชั่นไม่ระบุชื่อ อาร์กิวเมนต์เป็นสตริง

->n{(0..n.size).count{|i|!"16729438183492761"[n[i,2]]}<1}

โปรแกรมพร้อมชุดทดสอบ:

f=->n{(0..n.size).count{|i|!"16729438183492761"[n[i,2]]}<1}

a=%w{1 2 3 4 5 6 7 8 9 16 18 38 61 81 294 349 381 383 729 767 38183 38383 18349276 183492761 618349276
10 11 50 53 55 65 95 100 180 182 184 185 186 187 188 189 209 305 2009 5030 3838384 4838383 183492760}

a.each {|e|p [e, f[e]]}

ฉันเพิ่งเข้ารหัสอัศวินที่เป็นไปได้ทั้งหมดย้ายเข้ามาในสายอักขระแล้วตรวจสอบว่ามีตัวเลข 2 หลักภายในอินพุตอยู่ในสตริงนั้นหรือไม่


โอ้สตริงการค้นหานั้นจะช่วยฉันได้ 17 ไบต์ คุณจะรังเกียจไหมถ้าฉันใช้มันสำหรับคำตอบที่เรตินา?
Martin Ender

ไปเลย! แค่ให้เครดิตฉันเดา
หมึกมูลค่า

ขอบคุณ แต่ผมจบลงด้วยการแก้ปัญหาแม้สั้นขึ้นอยู่กับข้อเสนอแนะโดย SP3000 :)
มาร์ตินเอนเดอร์

6

grep 58 ไบต์

grep "^((?=18|16|29|27|34|38|49|43|61|67|72|76|81|83|94|92).)*.$"

เพราะจริงๆถ้าคุณไม่สามารถเอาชนะ grep ...


2
ทั้ง5มิได้185ปล่อย1มีบรรทัดคำสั่งของคุณในขณะ5ที่อยู่ใน truthy และ185ในรายการ falsy
Guntram Blohm รองรับโมนิก้า

1
@GuntramBlohm คงที่ - ได้หลงทางไปเป็นประจำ
Yakk

6

Haskell 46 ไบต์

q=zip<*>tail
all(`elem`q"16729438183492761").q

ตัวอย่างการใช้: all(`elem`q"16729438183492761").q $ "183492761"->True

วิธีการทำงาน: มันใช้สตริงการค้นหาที่พบในคำตอบ @ Kevin Lau ของ ทำให้รายการของคู่ของตัวอักษรที่อยู่ติดกันจากสตริงเช่นq q "1672" -> [('1','6'),('6','7'),('7','2')]ฟังก์ชันจะคืนค่าเป็นจริงถ้าคู่ทั้งหมดจากอินพุตปรากฏในคู่จากสตริงการค้นหา qเปลี่ยนอินพุตหลักเดียวให้เป็นรายการว่างดังนั้นจึงelemประสบความสำเร็จเสมอ


ทำไมzip<*>tailทำงานเหมือนรุ่นพลิกของzip=<<tail? ฉันคิดว่าฉันไม่เข้าใจสิ่งที่ผู้สมัครทั่วไปพูดถึง
xnor

@xnor: ฉันแค่ใช้มัน ถูกกำหนดให้เป็น<*> (<*>) f g x = f x (g x)
nimi

6

JavaScript (ES6), 65 62 ไบต์

s=>[...s].every((c,i)=>!i|"16729438183492761".match(s[i-1]+c))

ส่งคืนจริงหรือเท็จ ฉันเคยลองใช้โซลูชันแบบเรียกซ้ำซึ่งใช้เวลา 63 ไบต์และmapและถึงแม้ว่าreduceพวกเขาจะใช้ฉัน 73 ไบต์

แก้ไข: บันทึกแล้ว 3 ไบต์ด้วย @ user81655


ทำไม่ได้ดีกว่านี้แล้วความพยายามที่ดีที่สุดของฉันคือที่ 88 ไบต์ ไชโย!
Naouak

@ user81655 คุณหมายถึงmatchผลงานแทน~search(แต่ไม่ว่าด้วยวิธีใดก็ตามนั่นเป็นเรื่องลับๆจริง ๆ ) และ|สามารถแทนที่||(แต่ไม่ใช่ในเวอร์ชันแบบเรียกซ้ำด้วยความเศร้า)
Neil

@ user81655 ฉันหมายถึงวิธีการ!i|...matchทำงานเพราะผลการแข่งขันถ้าประสบความสำเร็จเป็นอาร์เรย์ของสตริงเดียวสองหลักซึ่ง|ผู้ประกอบการสิ้นสุดลงบังคับเป็นจำนวนเต็มที่ถูกต้อง
Neil

@Neil Ah ใช่
user81655

6

C, 85 81 ไบต์

แข็งแรงเล่นกอล์ฟ:

i;f(char*b){i=*b++-49;return*b?(*b=="8749x7214"[i]||*b=="6983x1632"[i])&&f(b):1;}

รุ่นที่ไม่ใช่แบบเรียกซ้ำ (85 ไบต์):

i;f(char*b){for(;(i=*b++-49),*b&&*b=="8749x7214"[i]||*b=="6983x1632"[i];);return!*b;}

รหัสเก่าที่มีพื้นที่สีขาวและโปรแกรมหลัก:

i;
f(char*b){
    for (; (i=*b++-49), *b     // i = index of digit + 1 in following arrays
        &&*b=="8749x7214"[i]   // 1st possible jump for 1..9
        ||*b=="6983x1632"[i];  // 2nd possible jump for 1..9
    );
    return !*b;
}

main(){
    char b[16];
    while(scanf("%s", b) == 1) printf("%d",f(b));
    return 0;
}

ยอมรับหมายเลขที่คั่นด้วยช่องว่างผ่านทางอินพุตมาตรฐานและเอาต์พุต 0 ถ้าไม่ใช่ -numpad-knight หรือ 1 เป็นอย่างอื่น

เวอร์ชั่นแบบซ้ำขนาด 81- ไบต์จะโกนได้ 4 ไบต์


5

MATL , 38 37 29 ไบต์

การใช้งานนี้@QPaysTaxes ความคิด

I:8JK5:7Pvj!Uttnqh?)d|2:EQm}h

เอาต์พุตเป็นอาร์เรย์ 2 มิติที่ซับซ้อนและไม่ว่างเปล่า มันเป็นความจริงหากค่าทั้งหมดมีส่วนที่ไม่ใช่ศูนย์จริงและเป็นเท็จอย่างอื่น

ลองออนไลน์!


1
อนุญาตให้ใช้นี้หรือไม่?
CalculatorFeline

คำถามที่ถามtruthy หรือค่า falsy ไม่อาร์เรย์ทั้งหมด
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

2
@CatsAreFluffy นี่คือความหมายของเราในความเป็นจริง / เท็จ เช่นเดียวกับใน MATLAB / Octave อาร์เรย์มีความจริงใน MATL ถ้าองค์ประกอบทั้งหมดเป็นจริง ( ตัวอย่าง )
Dennis

CC @ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
Dennis


4

MATL, 25 24 33 26 ไบต์

ลบออก 1 ไบต์ด้วย @LuisMendo!
@Dennis พบข้อบกพร่องแล้วแก้ไขมัน! ขอบคุณ!

'bSVYXbTUZW'j47-)d2^48\1=A

ใช้จำนวนเต็มเป็นอินพุต เอาต์พุต 1/0

ลองออนไลน์!


@ LuisMendo ถูกต้องทั้งสองขอขอบคุณ!
บีกเกอร์

@Dennis Updated และหวังว่าจะได้รับการแก้ไข ขอบคุณสำหรับความช่วยเหลือของคุณ.
บีกเกอร์

ฉันไม่คิดว่าคุณต้องการAในตอนท้าย เวกเตอร์ของ MATL นั้นเป็นจริงถ้ามันไม่มี 0
เดนนิส

4

C, 140 92 ไบต์

c;L(char*i){while(*i&&(!c||*i=="6743x1212"[c-49]||*i=="8989x7634"[c-49]))c=*i++;return !*i;}

สมมติว่า ASCII

รายละเอียด ลองที่นี่

// valid transition from x to n[x-'1'][0 or 1]

int n[9][2] =
{
    {'6','8'},{'7','9'},{'4','8'},
    {'3','9'},{'x','x'},{'1','7'},
    {'2','6'},{'1','3'},{'2','4'}
};

// i is a pointer to where to start on a string

bool L(char * i)
{
    char c = 0;

    // move if not \0 and (not-first-char or is a valid move)

    while((*i) && (!c || (*i)==n[c-'1'][0] || (*i)==n[c-'1'][1]))
    {
        c = (*i++);
    }

    return !(*i); // success if it's \0
}

ตารางค้นหาเหล่านั้นใหญ่มาก คุณสามารถปรับปรุงคะแนนของคุณได้มากหากคุณกำจัดตัวคั่นทั้งหมด{,}[]และเข้ารหัสเป็นchar*สตริงแทน นอกจากนี้โปรดทราบว่าการใช้งานของคุณ#defineไม่คุ้มค่าเมื่อคุณใช้งานเพียงสองครั้ง: การลบออกจะช่วยให้คุณประหยัดได้ 4 ไบต์
tucuxi

@tucuxi ขอบคุณสำหรับเคล็ดลับฉันจัดการเพื่อนำมันลงไปที่ 92 เนื่องจาก\0ภายในอาร์เรย์ทำให้เกิดพฤติกรรมที่ไม่ได้กำหนดดังนั้นฉันจึงแทนที่ด้วยx
Khaled.K

ดี - อย่าลืมที่จะใช้<s>oldscore</s> newscoreเมื่อแก้ไขเพื่อสะท้อนการปรับปรุงคะแนนและ<!-- language-all: lang-c -->ก่อนที่รหัสของคุณจะเริ่มแก้ไขการเน้นไวยากรณ์ ฉันยังสามารถลดจำนวนไบต์ของฉันได้ด้วยการลดลูปทั้งหมด
tucuxi

'รายละเอียด' ของคุณดูแตกต่างอย่างมากจากการขยายตัวของรหัสสนามกอล์ฟ ( nในรุ่นสั้น ๆ อยู่ที่ไหน) นอกจากนี้คุณอาจต้องพูดถึงว่าคุณกำลังสมมติการเข้ารหัส ASCII - คุณจะได้รับตัวเลขที่แตกต่างกันในเครื่อง EBCDIC
Toby Speight

@TobySpeight รายละเอียดรุ่นควรจะแสดงให้เห็นว่ามันถูกสร้างขึ้นโดยทั่วไปใช่ฉันสมมติว่า ASCII ซึ่งเป็นกรณีทั่วไปใน C.
Khaled.K

3

Julia, 51 49 ไบต์

n->diff(["@1634@8725"...][digits(n)+1]).^2%48⊆1

การตรวจสอบ

julia> f=n->diff(["@1634@8725"...][digits(n)+1]).^2%48⊆1
(anonymous function)

julia> all(map(f,(1,2,3,4,5,6,7,8,9,16,18,38,61,81,294,349,381,383,729,767,38183,38383,18349276,183492761,618349276)))
true

julia> any(map(f,(10,11,50,53,55,65,95,100,180,182,184,185,186,187,188,189,209,305,2009,5030,3838384,4838383,183492760)))
false

3

ที่จริงแล้ว 30 ไบต์

;#pXZdX`Σ"67294381";'1+R+íu`Mπ

รับอินพุตเป็นสตริง ส่งออกจำนวนเต็มบวกสำหรับจริงและ 0 สำหรับเท็จ

ลองออนไลน์!

คำอธิบาย:

;#pXZdX`Σ"67294381";'1+R+íu`Mπ
                                 (implicit) push input
;#pXZdx                         push zip(n[:-1], n[1;]) (pairs of digits)
       `Σ"67294381";'1+R+íu`M   map:
        Σ                         join digits
         "67294381";'1+R+         push "16729438183492761" (the magic string used in many other solutions)
                         íu       0-based index (-1 if not found), increment so 0 is not found and >=1 is the 1-based index
                             π  product

3

PowerShell v2 +, 105 96 ไบต์

param($a)((1..$a.length|%{'27618349294381672'.IndexOf($a[$_-1]+$a[$_])+1})-join'*'|iex)-or$a-eq5

วนซ้ำผ่านอินพุต (ซึ่งต้องถูกห่อหุ้มด้วย"") โดยตรวจสอบว่าดัชนีของคู่อักขระตามลำดับใด ๆ อยู่ในสตริงการค้นหาที่ถูกต้อง ฉันเห็น Kevin Lau มีบางอย่างที่คล้ายกันแต่ฉันมาด้วยตนเองนี้ แต่ละดัชนีเหล่านั้นจะถูกเพิ่มด้วย+1เนื่องจาก.IndexOf()ฟังก์ชันจะส่งคืน-1หากไม่พบสตริง นี้จะเปิด "ไม่พบ" s 0เข้าไป

เรา-joinทุกคนแล้วค่าจำนวนเต็มผลลัพธ์กับ*และท่อที่ไปiex(คล้ายกับeval) นี่จะหมายถึงหากไม่พบดัชนีใด ๆ นิพจน์ทั้งหมดจะส่งผลให้0ที่ไม่พบการแสดงออกทั้งจะส่งผลให้ ที่ถูกห่อหุ้มใน parens และ-or'd $a-eq5สำหรับกรณีพิเศษของอินพุต"5"เพื่อให้ได้ผลลัพธ์ผลลัพธ์ของเรา

ทดสอบการทำงาน

PS C:\Tools\Scripts\golfing> 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 18, 38, 61, 81, 294, 349, 381, 383, 729, 767, 38183, 38383, 18349276, 183492761, 618349276 | %{.\numpad-knight-numbers.ps1 "$_"}
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True

PS C:\Tools\Scripts\golfing> 10, 11, 50, 53, 55, 65, 95, 100, 180, 182, 184, 185, 186, 187, 188, 189, 209, 305, 2009, 5030, 3838384, 4838383, 183492760 | %{.\numpad-knight-numbers.ps1 "$_"}
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False

2

C, 78 ไบต์

char*a="9614397052";f(x){int b=x/10;return!b||abs(a[x%10]-a[b%10])%6==1&f(b);}

เนื่องจากทุกคนป้อนข้อมูลเป็นสตริงฉันจึงลองทำเป็นจำนวนเต็ม มันทำงานซ้ำจากหลักสำคัญน้อยที่สุด (a%10 ); หากเป็นเลขตัวเดียวก็ให้คืนค่าจริง มิฉะนั้นส่งคืนค่าจริงหากb%10ไม่สามารถเข้าถึงหลักสิบ ( ) จากหลักหน่วยและ (เรียกซ้ำ) ส่วนอินพุตที่เหลือเป็นไปตามการทดสอบเดียวกัน

การทดสอบความสามารถในการเข้าถึงได้ทำงานโดยการเข้ารหัสทัวร์ของอัศวินเป็นเส้นตรงและแปลงแต่ละหลักให้อยู่ในตำแหน่ง (ศูนย์ถึงเจ็ด) ในการเดินทาง สำหรับตัวเลข0และ5เรากำหนดตำแหน่งที่เก้าซึ่งตัดการเชื่อมต่อจากตำแหน่งอื่น จากนั้นตัวเลขที่เข้าถึงได้ซึ่งกันและกันจะแตกต่างกันไปหนึ่ง (mod แปด) นั่นa[x%10]-a[b%10]คือ± 1 หรือ± 7 ดังนั้นเราจึงทดสอบความแตกต่างที่แน่นอน (mod 6) กับ 1

วิธีนี้ใช้ได้กับการเข้ารหัสอักขระใด ๆ ที่ใช้ได้สำหรับ C (เช่นตัวเลขมีรหัสที่ต่อเนื่องกันได้ตั้งแต่ 0 ถึง 9)


1

Java 8, 179 167 ไบต์

วางหมายเลขแผ่นภายใน (ลบ 5 และ 0) ในวงกลม lเก็บดัชนีวงกลมของ int เหล่านี้ หากความแตกต่างของสองดัชนีคือ +/- 3 mod 8 ดังนั้นจะมีอัศวินเคลื่อนที่ระหว่าง ints ที่สอดคล้องกับดัชนีเหล่านั้น โปรดทราบว่าเป็นxint[]

x->{if(x.length<2)return 1;int[] l={0,0,1,2,7,0,3,6,5,4};int o=l[x[1]];for(int i:x){int n=l[i];if(i%5==0||(Math.abs(n-o)!=3&&Math.abs(n-o)!=5))return 0;o=n;}return 1;}

ปรับปรุง

  • -11 [16-12-10] เปลี่ยนเป็นแลมบ์ดา
  • -1 [16-12-10] ใช้<2แทน==1
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.