查找单手单词


12

“夸大”是一个单词的示例,可以在普通的qwerty键盘图的左手输入。“垄断”就是右手的一个例子。

在unix words文件中搜索可以输入的单词。输出应为两行:左手用空格分隔的单词列表,后用右手列表。例如

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
可以帮助人们使用正则表达式的一件事:[a-gq-tv-xz]用于左手字母和['h-puy]用于右手字母的时间比全部写出来的时间短。
Paul Prestidge'2

Answers:


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个字符。

感谢代上的短正则表达式。


1
“ ^([$ x])* $”应该是正则表达式
Rob

4

巴什86

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

Taylors for,我的egrep,按字符的时间分组。

根据定义,如果您用两只手盲打,如果您想产生一个大写字母,则总是使用左手来产生右手的大写字符,反之亦然。

当然,您可能W只用左手产生一个大写字母,但是如果愿意,您也可以junk用左手产生一个大写字母。


打败我,按字母分组,干得好!
罗布(Rob)2012年

彼得·泰勒(Peter Taylor)和我之间一直是比赛条件。当我开始我的文章和优化时,他的100(101?)char解决方案是公开的,但是他在我之前完成了他的改进,我在完成自己的改进后就观察到了。如果使用egrep和不使用-i,我不会用相同的语言发布帖子,但是如果他快了几分钟,我会发表评论。
用户未知

我在对正则表达式发表评论后立即考虑了此事,并在我有机会这样做之前放弃了工作。我到家的时候完全忘记了。
罗布

您的最后一段是我和史蒂芬·鲁姆巴尔斯基(Steven Rumbalski)推动进行澄清的原因,而大写字母是单手的澄清是在您发布此书的24小时之前收到的,因此这并不是真的。
彼得·泰勒

3

伯恩贝壳,55个字符

(或任何类似Bourne外壳,但bashzsh还是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发行版,使用其他类似Bourne像贝壳ashkshmkshpdkshposh...)


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。

与运行 node words.js < /usr/share/dict/words


1

Q(121140字节)

输出并不完全相同(反引号而不是空格),但这是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

Ruby,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


我是否可以接受此处发布的解决方案之一,将其缩短并放入我的帖子中?
snupuns 2012年

如果只是小小的改进,发表评论会更友好。如果您要进行重大更改,最好发布一个新答案,但是最好将您所基于的答案归功于此。
gnibbler 2013年

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”
维姆

1
这在perl 5.14.2上对我有效,并且需要perl 5.14及更高版本(在该位置添加了非破坏性替换标志r
Hasturkun 2012年

0

Python-152137 字符(未经测试)

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)

调用:python onehanded.py > /usr/share/dict/words或任何其他用换行符分隔的单词的单词文件

旧版:141个字符,只是一个单字功能

返回rightleftif 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]

您是否可以将其转换为工作程序或删除字符数?否则,标题会产生误导。
Steven Rumbalski'2

0

Q,95(111,带有硬编码的字典路径)

{`$'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

蟒蛇: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不连续集的一个子集。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.