ワンラインキーボード


20

チャレンジ

この課題の目標は、標準のUK QWERTYキーボードの1行のみを使用して、指定された文字列を入力できるかどうかを判断することです。

これはcode golfですので、バイト単位の最短ソリューションが勝ちです!


IO

入力は、32から126までのASCII 10進数範囲内の0個以上の文字の単一の文字列になります。このチャレンジでは、空の文字列は入力する必要がないため、1行で入力できると想定できます。

入力は、文字列、文字のリスト、または言語の同等の形式として取得できます。

出力は、単一の行を使用して入力できる文字列の場合は真の値、入力できない場合は偽の値である必要があります。


キーボード・レイアウト

標準のキーボードレイアウトが下にあるもののあいまいさを明確にするために、各行で使用可能なキーのリストを示します。これには、代替の上位キー(Shiftキーを使用してアクセス)が含まれます。

  • ライン1
    • 標準: `1234567890-=
  • 2行目
    • 標準: qwertyuiop[]
  • 3行目
    • 標準: asdfghjkl;'#
    • 大文字: ASDFGHJKL
    • スペシャル:Caps Lock
  • 行4
    • 標準: \zxcvbnm,./
    • 代わりの: |<>?
    • 大文字: ZXCVBNM
    • 特別:シフト
  • 5行目
    • スペシャル:スペースバー

代替の上部キーは、Shiftも同じ行にある場合にのみ押すことができ、大文字のキーにはCaps LockまたはShiftを介してのみアクセスできます。実際に使用できるのは、キーボードの1行だけです!


テストケース

            -> true     (empty string)
45-2=43     -> true     (line 1)
qwerty      -> true     (line 2)
tryitout    -> true     (line 2)
Qwerty      -> false    (no shift or caps on line 2)
#sad        -> true     (line 3)
AsDf        -> true     (caps lock used)
@sDF        -> false    (no shift for alternate upper)
zxcvbn?     -> true     (line 4)
zxc vbn     -> false    (spacebar on separate line)
123abc      -> false    (multiple lines)
            -> true     (just space bar)
!!!         -> false    (exclamation marks cannot be printed by a single line)

これは厳密に米国のキーボードレイアウトですか?(私は英国のレイアウトを持っています)。
ouflak

2
それは厳密にのみ英国QWERTYキーボードレイアウトですが、逆に@ouflak
ルーク・スティーヴンス

@アーナウルドはい、気づいてくれてありがとう!
ルークスティーブンス

ええ、私は両方を見始めましたが、あなたのレイアウトは米国のキーボードのレイアウトではなく、英国のキーボードのレイアウトに従っているようです。うーん...私のオーストリア人が比較してどのように見えるのだろうか。
ouflak

入力を文字のリストとして使用できますか、それとも文字列にする必要がありますか?
ケビンクルーイッセン

回答:


12

パイソン2130の 123 121 115バイト

lambda s:any(set(s)<=set(l+l.lower())for l in["`1234567890-=","eqwrtyuiop[]","ASDFGHJKL;'#","ZXCVBNM\,./|<>?"," "])

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


Python 3、111バイト

lambda s:any({*s}<={*l+l.lower()}for l in["`1234567890-=","eqwrtyuiop[]","ASDFGHJKL;'#","ZXCVBNM\,./|<>?"," "])

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

-4バイト、nedla2004のおかげ


1
Python 3を使用する場合は、111バイトまで減らすことができます
nedla2004

9

網膜0.8.272 71バイト

`^([-=\d`]+|[][eio-rtuwy]+|(?i)[adfghjkls;'#]+|[\\bcnmvxz,./|<>?]+| *)$

オンラインでお試しください!説明:各交替は、キーボードの異なる行に一致します。(?i)パターンの中央には、パターンの全体の残りの部分は大文字と小文字を区別せずに一致させます。編集:@KirillLのおかげで1バイトを保存しました。


opqro-r-1に変更できます。また、1行目のバックティックキャラクターを忘れましたか?
キリル

@KirillL。おっと、コピー/貼り付けの際に誤って選択し損ねたに違いありません。
ニール

素敵な[][...:)
狂気の

8

05AB1E66 47 バイト

žh…`-=«žS„[]«žTDu…;'#««žUDu"\,./|<>?"««ð)εISåP}O

入力を文字のリストとして受け取ります。

@Emignaのおかげで-19バイト。qwerty-keyboard定数の組み込み機能があることを完全に忘れていました。:D

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

žh                # Push "0123456789"
  …`-=            # Push "`-="
      «           # Merge them together
žS                # Push "qwertyuiop"
  „[]             # Push "[]"
     «            # Merge them togeter
žT                # Push "asdfghjkl"
  Du              # Duplicate, and toUppercase the copy
    …;'#          # Push ";'#"
        ««        # Merge all three together
žU                # Push "zxcvbnm"
  Du              # Duplicate, and toUppercase the copy
    "\,./|<>?"    # Push "\,./|<>?"
              ««  # Merge all three together
ð                 # Push a space
 )                # Wrap all string in an array
  ε   }           # Map each to:
   I              #  Take the input (list of characters)
    å             #  Check for each if it's in the current string of the map-iteration
     P            #  Take the product (1 if all are truthy, 0 otherwise)
       O          # Take the sum (either 1 or 0, so truthy/falsey), and output implicitly



5

JavaScript(Node.js)99 98 95バイト

x=>/^([-`=\d]+|[wetyuio-r[\]]+)$/.test(x)|/^([asdfghjkl;'#]+|[zxcvbnm,./<>?\\|]+| *)$/i.test(x)

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

Retina回答の@Kirill L.によるコメントから-1。
-3 @Ismael Miguelと@Arnauldの協力に感謝します。


なぜあなたは持っていないasdfghjklし、ASDFGHJKLそこに?iフラグを使用しないのはなぜx=>/.../i.test(x)ですか?
イスマエルミゲル

@IsmaelMiguel。これQWERTYUIOPは、正規表現と一致しないためです。追加のチェックは、大文字を正規表現に直接コーディングするよりも多くかかります。
朝琴シエル

気にせず、バグだらけです。x=>/^([-`=\d]+|[wetyuio-r\[\]]+)$/.test(x)||/^([asdfghjkl;'#]+|[zxcvbnm,.\/<>?\\|]+| *)$/i.test(x)同じ長さです
イスマエルミゲル

@IsmaelMiguelビット単位|を使用すると、1バイト節約されます。
アーナウルド

1
@IsmaelMiguelこれはECMAScript仕様の一部です。文字クラス内でエスケープする必要がある唯一の3文字は\ ]とです-(仕様のClassAtomNoDashを参照)。ダッシュは、最初または最後の文字の場合、エスケープされていないように見える場合もあります(そうでない場合、文字範囲の区切りとして解釈されます)。
アーナルド

5

Perl 6の102の101 100バイト

nwellnhofのおかげで-1バイト!

->\a{max map {a.combcomb $_~.lc:},|<eqwrtyuiop[] ASDFGHJKL;'# ZXCVBNM\,./|<>?>,' ',"`-="~[~] ^10}

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

かなり標準的な実装。おそらくこれには正規表現ベースの短いソリューションがありますが、Perl 6の正規表現を試してみるのに十分な知識がありません。


max代わりに?any(およびのmin代わりに?all)使用できます。
nwellnhof

1
それが価値がある場合、正規表現ベースのソリューションは、Perl 5の正規表現を使用して84バイトまたは80バイトになりますm:P5//。しかし、どちらも回答として投稿する価値はないと思います。
nwellnhof

4

ジャワ10、209の 208バイト

s->{int l=0,t;for(var p:s){t=p.matches("[[0-9]`\\-=]")?1:"qwertyuiop[]".contains(p)?2:p.matches("(?i)[asdfghjkl;'#]")?3:"\\zxcvbnm,./|<>?ZXCVBNM".contains(p)?4:p.equals(" ")?5:9;l=l<1?t:l!=t?9:l;}return l<6;}

@TFeldのおかげで-1バイト

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

説明:

s->{                    // Method with String-array parameter and boolean return-type
  int l=0,              //  Line-integer, starting at 0
      t;                //  Temp integer
  for(var p:s){         //  Loop over the characters
    t=p.matches("[[0-9]`\\-=]")?
                        //   If it's a character from the first line: 
       1                //    Set `t` to 1
      :"qwertyuiop[]".contains(p)?
                        //   Else-if it's a character from the second line:
       2                //    Set `t` to 2
      :p.matches("(?i)[asdfghjkl;'#]")?
                        //   Else-if it's a character from the third line
       3                //    Set `t` to 3
      :"\\zxcvbnm,./|<>?ZXCVBNM".contains(p)?
                        //   Else-if it's a character from the fourth line:
       4                //    Set `t` to 4
      :p.equals(" ")?   //   Else-if it's a space from the fifth line:
       5                //    Set `t` to 5
      :                 //   Else (invalid character):
       9;               //    Set `t` to 9
    l=l<1?              //   If `l` is still 0:
       t                //    Set it to `t`
      :l!=t?            //   Else-if `t` is a different line than `l`:
       9                //    Set `l` to 9 (non-existing line)
      :                 //   Else (`t` is the same line as `l`):
       l;}              //    Leave `l` the same
  return l<6;}          //  Return whether `l` is not 9

良い解決策ですが、!!!感嘆符が1行で印刷できないにもかかわらず、trueを返します。私はちょうどそのテストケースとして追加した
ルーク・スティーブンス

@LukeStevensああ、私は入力が5行のうちの1つに対して常に有効であると誤って仮定しました。ソリューションを変更します。それは簡単な修正です(しかし、いくつかのバイトを追加します。)
ケビンCruijssen

(?i)他の大文字に使用しないのはなぜですか?
ニール

@Neilスラッシュに必要なエスケープのため、これも209バイトです。
ケビンクルーイッセン

提案p==" "の代わりにp.equals(" ")
ceilingcat


4

ゼリー、55バイト

ØDW;Øq;Œu$€3,4¦;"“rɠ3“Ż²“¿µ|“aƲƘ0ÞḅzḂ»⁶ṭ
¢f€ẈṠSỊafƑ¢F¤$

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

1行目はキーボード行のリストを生成し、2行目はプログラム入力が単一(またはゼロ)行に含まれているかどうか、および入力できない文字(などQWE!@#)がないかどうかを確認します。


3

C、150バイト

x;f(char*s){for(x=0;*s;x|="@               "[*s++-32]);return!(x&x-1);}

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

賞品は獲得できませんが、これは楽しいアプローチです。キーボードの5行の文字をに、4 8 16 32 64無効な文字をすべてにマップし3ます。文字列の各文字の値をビット単位でORし、結果がを満たしているかどうかを確認しますx&(x-1) == 0。これはx2のべき乗またはゼロ、つまりx最大で1ビットが設定されている場合に真です。


2

LUA282の 262 259 270バイト

s=io.read()l=0
t=0
for c in s:gmatch"."do
f=c.find
t=f(c,"[0-9%`-=]")or 0|(f(c,"[qwertyuiop%[%]]")or 0)*2|(f(c,"[aAsSdDfFgGhHjJkKlL:'@#~]")or 0)*4|(f(c,"[\\zxcvbnm,./|<>?ZXCVBNM]")or 0)*8|(f(c," ")or 0)*16
t=t==0 and 17or t
l=l<1 and t or l~=t and 17or l
end
print(l<17)

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


2

PHP、98バイト

正規表現ほど短いものがないのは少し悲しいです。おそらく最速のソリューションではありません。

<?=preg_match("%^([`\d=-]*|[wetyuio-r[\]]*|(?i)[asdfghjkl;'#]*|[\\\zxcvbnm,./|<>?]*| *)$%",$argn);

でパイプとして実行する-F、オンラインで試してください


私が見つけた最短の非正規表現ソリューション(124バイト。読みやすくするために改行とタブ):

foreach(["`1234567890-=","qwertyuiop[]","asdfghjkl;'#ASDFGHJKL","zxcvbnm,./\|<>?ZXCVBNM"," "]as$d)
    trim($argn,$d)>""||die(1);

1偽りの0ために、真実のためのコードで終了します。でパイプとして実行し-Rます。
PHP 5.4以降が必要です。古いPHPの場合array(...)[...](+ 5バイト)の代わりに使用する
-nR、PHP <7でこれらの123バイトを使用します。

foreach(split(_,"`1234567890-=_qwertyuiop[]_asdfghjkl;'#ASDFGHJKL_zxcvbnm,./\|<>?ZXCVBNM_ ")as$d)
    trim($argn,$d)>""||die(1);

2

AWK163の 119 113バイト

これはAWKの回答であり、trueの場合は1文字列、falseの場合は0文字列を返します。(AWKがインタラクティブな使用のためにawk -fファイルとして呼び出すように書かれています。)

{print/^[-`1234567890=]*$/||/^[]qwertyuiop\[]*$/||/^[asdfghjkl;'#ASDFGHJKL]*$/||/^[zxcvbnm,.\/\|<>?ZXCVBNM]*$/||/^ *$/}

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

ただし、仕様の一部ではないとして書かれた(簡単な拡張子)TAB文字を処理しません。


4
「課題に対するすべての解決策は次のとおりです。(…)使用中の勝利基準の真剣な候補。 」– ヘルプセンターこれら2つの変数を宣言する必要はなく、文字列にする必要もありません。シングルprintで十分です:オンラインで試してみてください!
マナトワーク

ソリューションは真剣でなければならないというあなたのコメントは有効ですが、修正された05AB1E以降のソリューションは結果と一致しないか、より良い結果にならないため、無関係であると主張します。印刷を2回使用してtrueとfalseの両方を取得できないことはわかりません(入力の最後まで文字列を読み取るものについては確かです)。そして、当時最適化されていなかったと言った。あなたの考えのおかげで、143文字に減らすことができます。
フィルF

そして実際には、すべての方法で121文字になります...
フィル・F

2
code-golfは、全体として最短のコードを競うものではありませんが、言語にとっては最短のものです。ソリューションを改善できる場合は、そうすることをお勧めします
Jo King

@ジョーキング、あなたの説明をありがとう。改訂されたコード/可能性があります: {print/^[-```1234567890=]*$/||/^[]qwertyuiop\[]*$/||/^[asdfghjkl;'#ASDFGHJKL]*$/||/^[zxcvbnm,.\/\|<>?ZXCVBNM]*$/||/^ *$/}
フィル・F

1

バッシュ、119バイト

「読み取り可能な」出力を提供するエコーが含まれます。シェルの適切なラッパー(選択)を配置して印刷/出力を含めると、8バイトを節約できます。チャレンジを読んだところ、ソリューションが適切な出力表示を出力する必要があることが示唆されたため、119バイトのままにしました。

[[ "$@" =~ ^[asdfghjklASDFGHJKL\;\'#]*$|^[-\`0-9=]+$|^[]qwertyuiop\[]*$|^[zxcvbnm,./\|\<\>\?ZXCVBNM]*$|^\ *$ ]];echo $?

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


Bashソリューションは、my / @ manatwork AWKソリューションが113バイトに削減されることも意味することに注意してください。
フィルF
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.