片手で単語を見つける


12

「誇張された」は、通常のqwertyキーボードマップで左手に入力できる単語の例です。「独占」は右手の例です。

words一方で入力できる単語をUNIX ファイルで検索します。出力は2行である必要があります。そのような単語の左手用のスペースで区切られたリストの後に、右手用のリストが続きます。例えば

a abaft abase abased abases abate abated abates abbess abbesses ...
h hi hill hilly him hip hippo hippy ho hokum ...

左側の文字は次のとおりです。

qwertasdfgzxcvb

右側の文字は次のとおりです。

yuiophjklnm'

大文字は片手としてカウントされます。分音記号の付いた文字は両手とみなされるため、それらを含む単語は無視できます。


2
大文字には両手または片手が必要ですか?「é」などの文字はどちらの手でも入力できないと思いますよね?最後に、アポストロフィは有効な右手キーだと思いますか?
— スティーブンランバルスキー

4
この質問は、左手と右手の文字の定義がなければ自己完結型ではありません。
— ピーターテイラー

4
正規表現を使用している人々を助けるかもしれない1つのこと:[a-gq-tv-xz]左手文字と右手文字に使用することは、['h-puy]それらをすべて書き出すよりもわずかに短いです。
— ポール・プレスティッジ

回答:


7

sed、78バイト

1{x;s/^/! /;x};/^['h-puy]*$/IH;/^[a-gq-tv-xz]*$/I{G;x};${x;y/\n/ /;s/! */\n/p}

GNU sedを必要とし、実行 sed -n -f words.sed < /usr/share/dict/words


7

バッシュ(100 89文字)

for x in a-gq-tvwxz h-puy\'
do grep -iE ^[$x]*$ /usr/share/dict/words|tr '
' \ 
echo
done

21文字が単語ファイルへのフルパスに移動することに注意してください。pwdが/ usr / share / dictであると想定できる場合、そのうち16文字を保存できます。

短い正規表現はchronにクレジットされます。


1
「^([$ x])* $」は正規表現である必要があります
— ロブ

4

バッシュ、86

for x in a-gq-tvwxz h-pyu\'
do egrep ^[$x]*$ /usr/share/dict/words|tr '
' \ 
echo
done

Taylors for、私のegrep、charsのchronsグループ化。

定義上、両手でブラインド入力する場合、大文字を作成したい場合は、常に左手を使用して右手の大文字を作成し、その逆も同様です。

もちろんW、左手だけで大文字を作成することもできますがjunk、必要に応じて左手でも作成できます。


文字でのグループ分けに私を打ち負かし、良い仕事だ!
— ロブ

ピーター・テイラーと私との間の競合状態でした。私の投稿と最適化を開始したとき、彼の100(101?)文字ソリューションは公開されていましたが、彼は私の前に改善を終えました。egrepを使用して-iを使用せずに同じ言語で投稿することはしませんでしたが、数分速くなった場合は代わりにコメントを作成しました。
— ユーザー不明

正規表現を修正するコメントを作成した直後に考え、それを行う機会ができる前に仕事を辞めました。家に帰る頃には完全に忘れていました。
— ロブ

最後の段落は、Steven Rumbalskiと私が説明を求めた理由であり、大文字が片手としてカウントされるという説明は、これを公開する24時間以上前に受け取られたので、実際には仕様にはなりません。
— ピーターテイラー

3

ボーンシェル、55文字

(または任意のシェルボーンのようなもののbash、zshもしくはyash)

w=$1;f()echo `grep -ixe[$1]*<$w`;f a-gq-tvwxz;f h-puy\'

と呼ばれsh -f words.sh /usr/share/dict/wordsます。(もちろん、システム上でsh実際にbashいくつかのLinuxディストリビューション上のように、同様に他のボーンのようなシェルを使用してash、ksh、mksh、pdksh、posh...)


2

Javascript(ノード)、201バイト

f=require('fs');c=d='';r=(a=f.readFileSync('/dev/stdin')+c).split('\n');a.
replace(/[aqzxswcdevfrbgt]/ig,'').split('\n').map(function(k,i){k==r[i]&&(
d+=k+' ');!k.length&&(c+=r[i]+' ')});console.log(c,d)

これはおそらく別の言語ではるかに短いバージョンに書き換えることができますが、ノードを試してみたかっただけです。

で実行 node words.js < /usr/share/dict/words


1

Q(121 140バイト)

出力はまったく同じではありません(スペースではなくバックティック)が、これはQが文字列タイプを表示する方法の徴候です。

i:read0`:/usr/share/dict/words;
0N!/:i:`$/:i where each (min each) each flip i in/:\:(x,upper x:"qwertasdfgzxcvb";y,upper y:"yuiophjklnm");

編集:大文字と小文字が混在する、+ 20文字を処理する必要がありました


これを111でかなりゴルフできます`$'i(&:')(min'')(+)(i:read0`:/usr/share/dict/words)in/:\:(x,upper x:"qwertasdfgzxcvb";y,upper y:"yuiophjklnm'")
— 。– tmartin

1

ルビー、112 92文字

編集:これは短いですが、それほど面白くありません:

puts %w(a-gq-tv-xz 'h-puy).map{|r|File.read('/usr/share/dict/words').scan(/^[#{r}]+$/i)*' '}

元の:

puts File.read('/usr/share/dict/words').scan(/(^[a-gq-tv-xz]+$)|(^['h-puy]+$)/i).transpose.map{|w|w.compact*' '}

非常に単純な正規表現ベースのソリューション。他の場合と同様に、ARGVでファイル名を渡すことが許可されている場合、または現在のディレクトリにあると想定される場合は、一部の文字を保存できます。


1

Python、130バイト

a="\n"
b=""
try:
 while 1:v=raw_input();m=[x.lower()in"yuiophjklnm'"for x in v];v+=" ";a+=v*all(m);b+=0**any(m)*v
except:print b+a

で実行 python one_handed_words.py < /usr/share/dict/words


ここに投稿されたソリューションのいずれかを使用して短縮し、投稿に含めることはできますか?
— スヌープン

ほんの少しの改善であれば、コメントを投稿する方が簡単です。大幅な変更を行っている場合は、新しい回答を投稿することをお勧めしますが、基にしている回答にクレジットを与えると便利です。
— ニブラー

1

ハスケル(191)

import Char
g x=all(`elem`x)
f m[]=m
f[x,y](w:ws)|g"quertasdfgzxcvb"w=f[w:x,y]ws|g"yuiophjklnm'"w=f[x,w:y]ws|1<2=f[x,y]ws
main=getContents>>=mapM(putStrLn.unwords).f[[],[]].lines.map toLower

1

Python 2.7(139文字)

import os
a=set("yuiophjklnm'")
c=os.read(0,9**9).lower().split()
print'\n'.join([' '.join(filter(x,c))for x in a.isdisjoint,a.issuperset])

1

Perl、72バイト

$a{/^['h-puy]+$/i-/^[a-gq-tv-xz]+$/i}.=y/\n/ /rfor<>;print@a{1,-1,$,=$/}

と走る perl words.pl /usr/share/dict/words


私は、構文エラーを取得:裸の単語が近く、オペレータwords.plライン1で予想どこた「TR / \ N / / rfor」
— WIM

1
これはperl 5.14.2で機能し、perl 5.14以降(非破壊置換フラグrが追加された場所)が
— 必要です-Hasturkun

0

Python-152 137文字(未テスト)

r,a,b=set("YUIOPHJKLNM'"),[],[]
try:
 while 1:
  w=raw_input()
  s=set(w.upper())
  if r|s==r:a+=w
  if s-r==s:b+=w
except:for x in a,b:print' '.join(x)

編集:大文字とアポストロフィを処理します。


0

Python、243文字

編集:質問によると、より準拠したプログラムは次のとおりです。

import sys
def o(w):
 r="yuiophjklnm'";f=2;w=w.lower()
 for l in w:
  if(f==1)&(l in r)|(f==0)&(l not in r):return 2
  f=l not in r
 return f
y=[[],[],[]]
for w in sys.stdin.read().split('\n'):y[o(w)].append(w)
for i in y[0:2]:print' '.join(i)

invoke:python onehanded.py > /usr/share/dict/wordsまたは改行で区切られた単語を含む他の単語ファイル

old:141文字、1ワードの関数のみ

が返されるrightかleft、w片手で、both両手が使用されている場合。

def o(w):
 r="yuiophjklnm'";f=2
 for l in w:
  if(f==1)&(l in r)|(f==0)&(l not in r):f=2;break
  f=[1,0][l in r]
 return'rlbieogfththt'[f::3]

それを親切に機能するプログラムに変えるか、文字数を削除しますか?それ以外の場合、タイトルは誤解を招きます。
— スティーブンランバルスキー

0

Q、95(111のハードコードされたdictパス)

{`$'e[(w(&)l(w)in .Q.a except a)],(e:enlist)w(&)(l:all')(w:(_)read0 -1!`$x)in a:"yuiophjklnm'"}

使用法

q){`$'e[(w(&)l(w)in .Q.a except a)],(e:enlist)w(&)(l:all')(w:(_)read0 -1!`$x)in a:"yuiophjklnm'"} "/usr/share/dict/words"
`a`a`aa`aa`aaa`aaa`aaaa`aaaaaa`aaas`aaberg`aae`aaee`aaf`aag`aar`aara`aarc`aas..
`h`h`hh`hi`hi`hi`hih`hiko`hikuli`hili`hill`hill`hillo`hilly`hilly`hilo`hilum`..

ハードコーディングするとさらに14文字

`$'e[(w(&)l(w)in .Q.a except a)],(e:enlist)w(&)(l:all')(w:(_)read0`:/usr/share/dict/words)in a:"yuiophjklnm'"

0

J、109

1!:2&2;:^:_1('qwertasdfgzxcvb';'yuiophjkl''nm')((#@[>[:>./i.)&>/#]);:1!:1<'/usr/share/dict/words'[9!:37]0,3$_

私はこれがもっとうまくできると確信しています、私は文字列操作を行う方法がわかりません:-(


0

Python:122

import os
S=set("yuiophjklnm'")
c=os.read(0,9**9).lower().split()
print"\n".join(w for w in c if set(w)<=S or set(w)^S>=S)

で起動:

python name_of_program.py < /usr/share/dict/words

アイデアはほとんどDillon Cowerのものと同じですが、私は、素set(w)<=S集合のset(w)^S>=Sためにサブセットを示すために使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.