ค้นหาคำ Numpad


20

รับจำนวนเต็มตั้งแต่ 1 ถึง 999 รวมเอาท์พุทค่าความจริงถ้ามันปรากฏในแนวนอนแนวตั้งหรือแนวทแยงมุมทั้งไปข้างหน้าหรือข้างหลังทุกที่ในตาราง 3x3 ของตัวเลข 1-9 บนแป้นตัวเลขมาตรฐาน:

789
456
123

หากหมายเลขไม่ปรากฏขึ้นให้ส่งออกค่าเท็จ

ตัวเลข 65 ตัวที่คุณต้องใช้ในการบอกความจริงคือ:

1
2
3
4
5
6
7
8
9
12
14
15
21
23
24
25
26
32
35
36
41
42
45
47
48
51
52
53
54
56
57
58
59
62
63
65
68
69
74
75
78
84
85
86
87
89
95
96
98
123
147
159
258
321
357
369
456
654
741
753
789
852
951
963
987

ทุกอย่างอื่นเป็นเท็จ

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ



อินพุตอาจมี 0 มันสามารถเป็นสตริงได้
งานอดิเรกของ Calvin

ฉันเห็นหลุยส์เมนโดปรากฏขึ้นพร้อมคำตอบ MATL ในอนาคตอันใกล้นี้
Magic Octopus Urn

คำตอบ:


16

JavaScript (ES6), 83 ... 74 73 ไบต์

รับอินพุตเป็นสตริง

n=>1/([a,b,c]=[...n].map(v=>--v+v/3|0))||45242>>(a^b)&(~c&&n<99|b*2==a+c)

บันทึกแล้ว 3 ไบต์ด้วย ETHproductions

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

เราเปลี่ยนตัวเลขโดยใช้การชดเชยให้กับแต่ละหลักตามแถวที่เป็นของ:

  • +1 สำหรับแถวบนสุด
  • 0 สำหรับแถวกลาง
  • -1 สำหรับแถวล่าง

รหัสทั้งหมดด้านล่างแสดงเป็นเลขฐานสิบหก

7 8 9      8 9 A  (+1)
4 5 6  =>  4 5 6  (unchanged)
1 2 3      0 1 2  (-1)

ลองพิจารณาการรวม XOR ทั้งหมดของรหัสคีย์ใหม่เหล่านี้ ปุ่มที่อยู่ติดกันจะถูกเน้นด้วยเครื่องหมายวงเล็บ

XOR|  0   1   2   4   5   6   8   9   A 
---+------------------------------------
 0 |  0  [1]  2  [4] [5]  6   8   9   A 
 1 | [1]  0  [3] [5] [4] [7]  9   8   B 
 2 |  2  [3]  0   6  [7] [4]  A   B   8 
 4 | [4] [5]  6   0  [1]  2  [C] [D]  E 
 5 | [5] [4] [7] [1]  0  [3] [D] [C] [F]
 6 |  6  [7] [4]  2  [3]  0   E  [F] [C]
 8 |  8   9   A  [C] [D]  E   0  [1]  2 
 9 |  9   8   B  [D] [C] [F] [1]  0  [3]
 A |  A   B   8   E  [F] [C]  2  [3]  0 

เราจะเห็นว่าสองปุ่มมีความต่อเนื่องกันหากหากว่า XOR รหัสของพวกเขานำไปสู่หนึ่งในค่าต่อไปนี้:

1, 3, 4, 5, 7, C, D, F

รายการนี้สามารถบรรจุลงในรูปแบบไบนารีต่อไปนี้:

  FEDCBA9876543210
  ----------------
0b1011000010111010 = 0xB0BA = 45242

ดังนั้นการทดสอบเพื่อตรวจสอบว่าสองรหัสคีย์ (a, b) สอดคล้องกับสองคีย์ที่อยู่ติดกัน:

45242 >> (a ^ b) & 1

สำหรับรหัสสามรหัส (a, b, c) เราจำเป็นต้องมีการทดสอบเพิ่มเติมนี้:

b * 2 == a + c

ตัวอย่าง:

a = 0xA
b = 0x6
c = 0x2

0xB0BA >> (0xA ^ 0x6) & 1 == 0xB0BA >> 0xC & 1 == 1
=> 0xA and 0x6 are contiguous key codes

0x6 * 2 == 0xA + 0x2
=> 0xA, 0x6 and 0x2 are contiguous key codes on the same row, column or diagonal

การสาธิต

ตัวอย่างนี้แสดงรายการค่าความจริง


การขู่เข็ญคือเพื่อนของคุณที่นี่: a-.5คืนค่าจริงสำหรับอาร์เรย์ใด ๆaที่มี (ศูนย์หรือ) หนึ่งจำนวนเต็ม n=>([a,b,c]=[...n].map(v=>--v+v/3|0))-.5||n%10&&n<100|b*2==a+c&&45242&1<<(a^b)
ETHproductions

@ ETHproductions อ่าดี! 1/aสั้นกว่าและควรใช้งานได้เช่นกันฉันคิดว่า
Arnauld

5

Python3, 72 ไบต์

lambda n,s="123 456 789 741 852 963 42 753 86 26 159 84 ":n in s+s[::-1]

อินพุตถูกใช้เป็นสตริง

ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ! : D


สิ่งนี้ใช้ตัวเลขเป็นสตริงหรือไม่?
FlipTack

@ Flp.Tkc ใช่มันเป็นเช่นนั้น ฉันจะพูดถึงว่าในโพสต์ ขอบคุณ!
Yytsi

@TuukkaX มีช่องว่างเพิ่มเติมในสตริงsคุณสามารถบันทึก 1 ไบต์
Gurupad Mamadapur

@GurupadMamadapur ฉันไม่เห็นสาเหตุที่ฉันจะเปลี่ยน 72 72 คำตอบปัจจุบันของคุณเป็นวิธีแก้ปัญหา 74 ไบต์ของคุณ ... : D และถ้าคุณอ้างถึงสตริงของฉันsซึ่งมีช่องว่างหลังจาก84นั้นคุณไม่ถูกต้องเพราะมันต้อง หากไม่มีช่องว่างสตริงผลลัพธ์จะมีเชน '8448' ซึ่งจะนำไปสู่การทดสอบที่ล้มเหลว ขอบคุณสำหรับคำแนะนำว่า!
Yytsi

@TuukkaX ใช่คุณสิทธิกำลังเกี่ยวกับช่องว่างพิเศษพลาดที่หนึ่ง :)
Gurupad Mamadapur

4

Befunge, 169 161 159 bytes

38*:2+"*0>DTV{51"3*\3*"kV"3*\3*"{w"3*\3*"mr"v
v:\&+*83:++66:+"c":+"?":+"$":++66:+"W":*6\*4<
_v#:\_v#*-+%+55g00*+55g02\*-g02\*-g00\`9::::p02/+55p00%"d":
0<@.!!<

ลองออนไลน์!

สองบรรทัดแรกเพียงแค่กดรายการหมายเลขทดสอบลงบนสแต็ก สิ่งนี้ทำตามลำดับเนื่องจากบางครั้งมันอาจจะง่ายกว่าที่จะสร้างตัวเลขเป็นอ็อฟเซ็ตจากอันก่อนหน้านี้ในซีรีส์แทนที่จะสร้างจากรอยขีดข่วน เมื่อเราไปถึงตัวเลขที่มากขึ้นบางครั้งเราสามารถบันทึกไบต์ด้วยการสร้างเป็นคู่เช่น"kV"3*\3*ให้ 258 และ 321 ในเก้าไบต์ซึ่งแต่ละพวกเขาจะใช้ห้าไบต์แต่ละ

วนรอบหลักอยู่บนบรรทัดที่สามเรียกใช้จากขวาไปซ้ายด้วยการล้อมรอบ ซึ่งจะวนซ้ำผ่านหมายเลขทดสอบทั้งหมดบนสแต็กการเปรียบเทียบค่าของตัวเองค่า% 100 และค่า / 10 ถ้าสิ่งใดตรงกับหมายเลขอินพุตหรือหมายเลข <= 9 เราจะออก 1 และออก หากไม่มีการแข่งขันเราจะทำการวนซ้ำต่อไป หากเราใช้หมายเลขทดสอบในสแต็คเราจะแสดง 0 และออก

ขอบคุณMistah Figgins ที่ช่วยฉันสักสองสามไบต์


ฉันคิดว่าคุณสามารถเปลี่ยนบรรทัดสุดท้าย0<@.!!<เป็นบันทึก 2 ไบต์ สิ่งนี้ขึ้นอยู่กับด้านบนของสแต็กที่ไม่ใช่ศูนย์เมื่อ IP ลงบนลูกศรที่สอง ลองออนไลน์!
MildlyMilquetoast

3

เยลลี่ , 29 24 19 ไบต์

ที่บันทึกไว้ 5 ไบต์ขอบคุณที่ @ ข้อเสนอแนะของเดนนิสของและKƓ

9s3µUŒD;;Z;ŒDµ;UKƓẇ

ลองออนไลน์!

คำอธิบาย

9Rs3µUŒD;;Z;ŒDµ;UKƓẇ  Main link. Argument: number
9s3                   Split [1..9] into [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
   µ                  New monadic chain
    U                 Reverse the rows
     ŒD               Take the diagonals of the result
       ;              Append the original rows
        ;Z            Append the original columns
          ;ŒD         Append the original diagonals
             µ        New monadic chain
              ;U      Append the reverse of everything
                K     Join by spaces
                 Ɠẇ   Check if a line from STDIN is in the result

หากคุณอ่านอินพุตจาก STDIN 9s3µUŒD;;Z;ŒDµ;UKƓẇจะบันทึก 5 ไบต์
Dennis

คุณต้องการกลับแถวหรือไม่ พวกเขาสามารถปรากฏไปข้างหน้าหรือข้างหลังดังนั้น123,456,789ควรจะเหมือนกับ789,456,123
Riley

@Riley ฉันย้อนกลับแต่ละแถวไม่ใช่แถวเป็นอาร์เรย์ ฉันเดาว่าฉันคงชัดเจนกว่านี้ อย่างไรก็ตามมันทำเพื่อที่จะได้ครึ่งหนึ่งของเส้นทแยงมุม
PurkkaKoodari

2

Ruby, 77 ไบต์

->n{!!((s='123 456 789 147 258 369 753 951 86 62 24 48 ')+s.reverse)["#{n}"]}

คุณกำลังสร้างสตริงที่ '123 456 789 147 258 369 753 951' + กลับสตริงเดียวกันและตรวจสอบว่าพารามิเตอร์ที่พบในสตริงใช่ไหม? หากเป็นเช่นนั้นแสดงว่าโซลูชันนี้ไม่ถูกต้อง ตัวอย่างเช่น86และ24จะล้มเหลว
Yytsi

กฎบอกว่าคุณต้องการเพียงแค่ส่งออกค่าจริงหรือเท็จดังนั้นคุณจึงไม่จำเป็นต้อง!!หรือวงเล็บผู้ดูแล
จอร์แดน

0

ทุบตี, 75

printf %s\\n 123 456 789 741 852 963 42 753 86 26 159 84|tee >(rev)|grep $1

ส่งออกบางสิ่งบางอย่างและส่งกลับ 0 สำหรับค่าทั้งหมดในรายการนั้น

พิมพ์อะไรและส่งกลับ 1 ในกรณีอื่น ๆ ทั้งหมด


0

Java, 397 ไบต์

public class Numpad {public static void main(String[] args){Scanner input=new Scanner(System.in);int in=input.nextInt();int h=in/100;int u=in%10;int t=(in%100)/10;boolean out=false;input.close();if(in<10)out=true;else if( h==0){int decider=Math.abs(t-u);if((decider==1)||(decider==3)||(decider==4))out=true;}else{if ( Math.abs(h-t) == Math.abs(t-u))out=true;}System.out.println("RESULT : "+out);}}

ฉันใหม่สำหรับสิ่งนี้กรุณาแก้ตัวการให้อภัยใด ๆ
Nefi Knomore

สวัสดีและยินดีต้อนรับสู่เว็บไซต์! ฉันได้แก้ไขโพสต์ของคุณเพื่อให้ส่วนรหัสแสดงเป็นรหัสและเพิ่มจำนวนไบต์ซึ่งเป็นมาตรฐานสำหรับคำตอบที่นี่ การแข่งขันครั้งนี้เป็นการแข่งขันกอล์ฟรหัสซึ่งหมายความว่าเป้าหมายสูงสุดคือการทำให้รหัสของคุณสั้นที่สุด ตัวอย่างเช่นคุณสามารถใช้ชื่อตัวแปรแบบสั้นและกำหนดฟังก์ชั่นแทนคลาสแบบเต็ม ฉันไม่ดีที่ Java แต่บางเคล็ดลับเพิ่มเติมมีอยู่ที่นี่ คุณควรพยายามทำให้รหัสของคุณสั้นลงแล้วแก้ไขเวอร์ชันใหม่ในโพสต์ของคุณ
DJMcMayhem
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.