Numpad Kelime Arama


20

999 dahil, çıkış 1 arasında bir tamsayıyı verilen bir truthy değeri yatay, dikey ya da çapraz ileri ya da geri belirirse, herhangi bir yerde bir standart ile basamak 1-9 3x3 kare sayısal tuş takımı :

789
456
123

Sayı görünmezse, bir falsy değeri verin.

Gerçeğe uygun çıktı almanız gereken tam 65 sayı:

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

Diğer her şey sahtedir.

Bayt cinsinden en kısa kod kazanır.



Giriş 0 içerebilir, bir dize olabilir.
Calvin'in Hobileri

Luis Mendo'nun yakın gelecekte bir MATL cevabı verdiğini görüyorum heh.
Sihirli Ahtapot Urn

Yanıtlar:


16

JavaScript (ES6), 83 ... 74 73 bayt

Girişi dize olarak alır.

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

ETHproductions sayesinde 3 bayt tasarruf

Nasıl çalışır

Sayısal tuş takımını, ait olduğu satıra göre her basamağa bir ofset uygulayarak dönüştürürüz:

  • Üst sıra için +1
  • Orta sıra için 0
  • Alt satır için -1.

Aşağıdaki tüm kodlar onaltılı olarak gösterilir.

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

Bu yeni anahtar kodlarının tüm XOR kombinasyonlarını ele alalım. Bitişik tuşlar parantezle vurgulanır.

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 

İki anahtarın, yalnızca XORing kodları aşağıdaki değerlerden birine götürürse bitişik olduğunu görebiliriz:

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

Bu liste aşağıdaki ikili maskeye paketlenebilir:

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

Bu nedenle, iki anahtar kodun (a, b) iki bitişik anahtara karşılık gelip gelmediğini belirleme testi:

45242 >> (a ^ b) & 1

Üç anahtar kod (a, b, c) için bu ek teste ihtiyacımız var:

b * 2 == a + c

Örnek:

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

gösteri

Bu pasaj doğruluk değerleri listesinin çıktısını verir.


Zorlama burada arkadaşınızdır: (sıfır veya) bir tam sayı içeren a-.5herhangi bir dizi için true değerini döndürür 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 Ah, güzel! 1/adaha da kısa ve aynı şekilde çalışması gerektiğini düşünüyorum.
Arnauld

5

Python3, 72 bayt

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

Giriş bir dize olarak alınır.

Golf önerileri hoş geldiniz! : D


Bu numarayı dize olarak alıyor mu?
FlipTack

@ Flp.Tkc Evet öyle. Bunu yazıda anlatacağım. Teşekkürler!
Yytsi

@TuukkaX dizede ek bir alan var, s1 bayt kaydedebilirsiniz.
Gurupad Mamadapur

@GurupadMamadapur Şu anki 72 bayt çözümümü neden 74 bayt çözümünüze değiştireceğimi anlamıyorum ...: D Ve ssonra boşluk olan dizgime başvurursanız, o zaman yanlışsınız 84, çünkü gerekli. Bir boşluk içermezse, sonuçta elde edilen dize '8448' zincirine sahip olur ve bu da başarısız test senaryolarına yol açar. Yine de öneriler için teşekkürler!
Yytsi

@TuukkaX Evet ekstra boşluk konusunda haklısın, bunu özledim :)
Gurupad Mamadapur

4

Befunge, 169 161 159 bayt

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<@.!!<

Çevrimiçi deneyin!

İlk iki satır sadece test numaraları listesini yığının üzerine itiyor. Bu, boyut sırasına göre yapılır, çünkü bazen sıfırdan üretmek yerine dizide öncekinden ofset olarak bir sayı oluşturmak daha kolay olabilir. Daha büyük sayılara ulaştığımızda, bazen bir baytı çiftler halinde oluşturarak kaydedebiliriz, ör."kV"3*\3* dokuz bize 258 ve 321 verir, burada ayrı ayrı her biri beş bayt alırlar.

Ana döngü üçüncü satırda, sağdan sola sarma ile çalışıyor. Bu, yığındaki tüm test numaralarını yineleyerek, değerin kendisini,% 100 değerini ve / 10 değerini karşılaştırır. Bunlardan herhangi biri giriş numarası veya <= 9 sayısıyla eşleşirse, 1 çıkarır ve çıkarız. Eşleşme yoksa, döngüye devam ediyoruz. Yığında test numaralarının bitmesi durumunda 0 çıkarır ve çıkarız.

Beni birkaç bayt kurtardığı için Mistah Figgins'e teşekkürler .


Bence 0<@.!!<2 bayt tasarruf etmek için son satırı değiştirebilirsiniz . Bu, IP ikinci oka indiğinde, yığının üst kısmının sıfır olmamasına dayanır. Çevrimiçi deneyin!
MildlyMilquetoast

3

Jöle , 29 24 19 bayt

Kaydedilen 5 Dennis'in önerisi @ sayesinde bayt Kve Ɠ.

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

Çevrimiçi deneyin!

açıklama

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

Girişi STDIN'den okursanız, 9s3µUŒD;;Z;ŒDµ;UKƓẇ5 bayt kaydeder.
Dennis

Satırları ters çevirmeniz mi gerekiyor? İleri veya geri görünebilirler, bu yüzden 123,456,789aynı olmalıdır789,456,123
Riley

@Riley Satırları dizi olarak değil, her satırı tersine çeviririm. Sanırım orada daha açık olabilirdim. Her neyse, köşegenlerin yarısını almak için yapılır.
PurkkaKoodari

2

Ruby, 77 bayt

->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' + aynı dize ters çevrilmiş bir dize oluşturuyorsunuz ve parametrenin dizede bulunup bulunmadığını kontrol ediyorsunuz, değil mi? Öyleyse, bu çözüm geçersizdir. Örneğin, 86ve 24başarısız olur.
Yytsi

Kurallar, yalnızca doğruluk veya falsey değeri çıkarmanız gerektiğini, bu nedenle !!veya parantezlere ihtiyacınız olmadığını söylüyor .
Ürdün,

0

bash, 75

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

bir şey çıktılar ve o listedeki tüm değerler için 0 döndürür

hiçbir şey yazdırmaz ve diğer tüm durumlarda 1 döndürür


0

Java, 397 bayt

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);}}

Ben buna yeniyim.
Nefi knomore

Merhaba, siteye hoş geldiniz! Kod bölümünün kod olarak görüntülenmesi ve burada yanıtlar için standart olan bir bayt sayısı eklenmesi için yayınınızı düzenledim. Bu yarışma bir kod-golf yarışmasıdır, yani nihai amaç kodunuzu mümkün olduğunca kısa yapmaktır. Örneğin, kısa değişken adları kullanabilir ve tam sınıf yerine bir işlev tanımlayabilirsiniz. Java'da harika değilim, ancak burada daha fazla ipucu var . Kodunuzu kısaltmaya çalışmalı ve ardından yeni sürümü yayınınızda düzenlemelisiniz .
DJMcMayhem
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.