한손으로 단어 찾기


12

'과장'은 일반적인 쿼티 키보드 맵에서 왼쪽에 입력 할 수있는 단어의 예입니다. '독점'은 오른손의 예입니다.

words한 손으로 입력 할 수있는 단어를 찾기 위해 유닉스 파일을 검색합니다 . 출력은 두 줄로 이루어져야합니다. 왼손에는 공백으로 구분 된 단어 목록과 오른손에는 목록이 있습니다. 예 :

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

왼쪽 글자는 다음과 같습니다.

qwertasdfgzxcvb

오른쪽 글자는 다음과 같습니다.

yuiophjklnm'

대문자는 한손으로 간주됩니다. 분음 부호가있는 문자는 양손으로 계산되므로이를 포함하는 단어는 무시할 수 있습니다.


2
대문자는 두 손 또는 하나를 필요로합니까? "é"와 같은 문자를 양손으로 입력 할 수 없다고 생각합니다. 마지막으로 아포스트로피가 올바른 오른손 키라고 가정합니다.
Steven Rumbalski

4
이 질문은 왼손잡이와 오른 손잡이의 정의 없이는 포함되지 않습니다.
피터 테일러

4
정규식을 사용하는 사람들에게 도움이 될 수있는 한 가지 방법 [a-gq-tv-xz]은 왼쪽 글자와 ['h-puy]오른쪽 글자를 모두 사용하는 것보다 약간 짧습니다.
Paul Prestidge

답변:


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

for내 egrep 인 Taylors 는 문자 그룹을 크로싱합니다.

정의에 따라 두 손으로 맹목적으로 입력하는 경우 대문자를 생성하려면 항상 왼손을 사용하여 오른손의 대문자를 생성하고 그 반대도 마찬가지입니다.

물론 W왼손만으로 대문자 를 만들 수도 있지만 junk원하는 경우 왼손으로도 만들 수 있습니다.


편지 그룹화로 나를 이길, 잘 했어!
Rob

피터 테일러와 저 사이의 경쟁 조건이었습니다. 그의 100 (101?) 숯 솔루션은 공개 및 최적화를 시작했을 때 공개되었지만 내 앞에서 자신의 개선을 마쳤습니다. 나는 egrep과 -i없이 같은 언어로 게시물을 만들지 않았지만, 몇 분 더 빠르면 대신 의견을 말했을 것입니다.
사용자가 알 수 없음

나는 정규 표현식을 수정하는 논평을 한 직후에 그것을 생각하고 그것을 할 기회를 갖기 전에 일을 떠났다. 내가 집에 도착할 때까지 그것을 완전히 잊었다.
Rob

마지막 단락은 Steven Rumbalski와 내가 설명을 요구 한 이유이며, 한 손으로 대문자로 계산되는 설명은이를 게시하기 24 시간 전에 접수되었으므로 실제로 사양이 아닙니다.
Peter Taylor

3

본 쉘, 55 자

(또는 Bourne과 같은 쉘이지만 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어떤 리눅스 배포판처럼 사용하는 다른 Bourne 씨처럼 같은 쉘 ash, ksh, mksh, pdksh, posh...)


2

자바 스크립트 (노드), 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 ( 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

루비, 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

파이썬, 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

조금만 개선 된 경우 의견을 게시하는 것이 더 친절합니다. 크게 변경하는 경우 새 답변을 게시하는 것이 좋지만 답변의 기초가되는 답변을 제공하는 것이 좋습니다.
gnibbler 2016 년

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

펄, 72 바이트

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

와 실행 perl words.pl /usr/share/dict/words


구문 오류가 발생했습니다. "tr / \ n / / rfor"근처에서 words.pl 행 1에서 연산자가 예상되는 위치에 Bareword가 있습니다.
wim

1
이것은 perl 5.14.2에서 저에게 효과적이며 perl 5.14 이상이 필요합니다 (비파괴 대체 플래그 r가 추가 된 위치)
Hasturkun

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

파이썬, 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또는 개행으로 분리 된 단어가있는 다른 단어 파일

old : 141 자, 단일 단어 함수

반환 right또는 left경우 wonehanded하고, 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

0

Q, 95 (하드 코드 dict 경로를 사용하는 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.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.