テンキーの単語検索


20

1から999までの整数が与えられた場合、標準の数字パッドの 3〜3桁の数字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を含めることができ、文字列にすることができます。
カルビンの趣味

近い将来、ルイスメンドーがMATLの回答を見せてくれるのを見ています。
魔法のタコUr

回答:


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)

ETHproductionsのおかげで3バイト節約

使い方

各数字に属する行に従ってオフセットを適用することにより、数字パッドを変換します。

  • 一番上の行に+1
  • 中央の行には0
  • 最下行の場合は-1。

以下のすべてのコードは16進数で表されます。

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が次の値のいずれかになる場合にのみ、2つのキーが連続していることがわかります。

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

このリストは、次のバイナリマスクにパックできます。

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

したがって、2つのキーコード(a、b)が2つの連続したキーに対応するかどうかを判断するテスト:

45242 >> (a ^ b) & 1

3つのキーコード(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

デモ

このスニペットは、真理値のリストを出力します。


ここでの強制はあなたの友人です:(ゼロまたは)1つの整数を含むa-.5配列に対してtrueを返しますan=>([a,b,c]=[...n].map(v=>--v+v/3|0))-.5||n%10&&n<100|b*2==a+c&&45242&1<<(a^b)
ETHproductions 16

@ETHproductionsああ、いいね!1/aさらに短く、同様に機能するはずです。
アーナルド

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 16

@ Flp.Tkcはい、できます。これについては投稿で言及します。ありがとう!
Yytsi

@TuukkaX string sに追加のスペースがあり、1バイト節約できます。
グルパッドママダプール16

@GurupadMamadapur現在の72バイトのソリューションを74バイトのソリューションに変更する理由がわかりません...:Dそして、s84に空白が含まれている私の文字列を参照すると、必要であるため、間違っています。空白が含まれていない場合、結果の文字列にはチェーン '8448'が含まれ、テストケースが失敗します。提案をありがとう!
Yytsi

@TuukkaXええ、あなたは余分な空白について正しいです、その1つを逃しました:)
Gurupad Mamadapur

4

Befunge、169の 161 159バイト

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

オンラインでお試しください!

最初の2行は、テスト番号のリストをスタックにプッシュするだけです。これは、最初から生成するよりも、シリーズの前の数値からのオフセットとして数値を生成する方が簡単な場合があるため、サイズの順に行われます。大きい数字に到達したら、ペアで生成することでバイトを節約することもできます。たとえば、"kV"3*\3*258と321を9バイトで提供します。

メインループは3行目にあり、右から左へラップアラウンドで実行されます。これは、スタック上のすべてのテスト番号を反復処理し、値自体、value%100、およびvalue / 10を比較します。これらのいずれかが入力番号または9以下の番号と一致する場合、1を出力して終了します。一致するものがない場合、ループを継続します。スタックのテスト番号を使い果たすと、0を出力して終了します。

数バイト節約してくれたMistah Figginsに感謝します。


最後の行を変更して0<@.!!<2バイト節約できると思います。これは、IPが2番目の矢印に到達したときに、スタックの最上位がゼロ以外になっていることに依存しています。オンラインでお試しください!
MildlyMilquetoast

3

ゼリー29 24 19 バイト

@DennisのKand の提案のおかげで5バイト節約されましたƓ

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バイト節約されます。
デニス

行を逆にする必要がありますか?前方または後方に表示される可能性があるため123,456,789、同じになるはずです789,456,123
ライリー

@Riley配列としての行ではなく、各行を逆にします。私はそこでもっと明確にできたと思います。とにかく、それは対角線の半分を得るために行われました。
PurkkaKoodari 16

2

ルビー、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

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

私はこれに新しいです..忘却を親切に言い訳します。
ネフィノモア16

こんにちは、サイトへようこそ!コードセクションがコードとして表示され、ここでの回答の標準であるバイトカウントが追加されるように、投稿を編集しました。この競争はコードとゴルフの競争であり、究極の目標はコードをできるだけ短くすることです。たとえば、短い変数名を使用して、完全なクラスの代わりに関数を定義できます。私はJavaが得意ではありませんが、他にもいくつかのヒントがあります。コードを短くして、新しいバージョンを投稿に編集してください。
DJMcMayhem
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.