Tìm từ một tay


12

'phóng đại' là một ví dụ về một từ có thể được gõ ở bên tay trái, trên bản đồ bàn phím qwerty bình thường. "Độc quyền" là một ví dụ cho bàn tay phải.

Tìm kiếm wordstệp unix cho các từ có thể được gõ bằng một tay. Đầu ra phải là hai dòng: danh sách phân tách không gian của các từ như vậy cho tay trái, theo sau là danh sách cho tay phải. ví dụ

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

Các chữ cái bên trái là:

qwertasdfgzxcvb

Các chữ cái bên phải là:

yuiophjklnm'

Chữ in hoa được tính là một tay; các chữ cái có dấu phụ được tính là hai tay và do đó các từ có chứa chúng có thể bị bỏ qua.


2
Chữ in hoa yêu cầu hai tay hay một tay? Tôi cho rằng các ký tự như "é" không thể được gõ bằng một trong hai tay, phải không? Cuối cùng, tôi cho rằng dấu nháy đơn là một phím bên phải hợp lệ, đúng không?
Steven Rumbalski

4
Câu hỏi này không khép kín nếu không có định nghĩa về chữ cái bên trái và bên phải.
Peter Taylor

4
Một điều có thể giúp mọi người sử dụng các biểu thức thông thường: sử dụng [a-gq-tv-xz]cho các chữ cái bên trái và ['h-puy]cho các chữ cái bên phải ngắn hơn một chút so với viết tất cả chúng ra.
Paul Prestidge

Câu trả lời:


7

sed, 78 byte

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

yêu cầu GNU sed, chạy với sed -n -f words.sed < /usr/share/dict/words


7

Bash ( 100 89 ký tự)

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

Lưu ý rằng 21 ký tự đi đến đường dẫn đầy đủ đến tệp từ: nếu chúng tôi được phép giả sử rằng pwd là / usr / share / dict thì 16 trong số đó có thể được lưu.

Tín dụng để chron cho các regexes ngắn hơn.


1
"^ ([$ x]) * $" phải là biểu thức chính thức
Rob

4

Bash, 86

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

Taylors for, egrep của tôi, chron nhóm các ký tự.

Theo định nghĩa, nếu bạn gõ bằng hai bàn tay mù, nếu bạn muốn tạo một chữ cái viết hoa, bạn luôn sử dụng tay trái để tạo ra một ký tự viết hoa của bàn tay phải và ngược lại.

Tất nhiên bạn có thể tạo ra một chữ hoa Wchỉ bằng tay trái, nhưng bạn cũng có thể sản xuất junkbằng tay trái, nếu bạn muốn.


Đánh tôi để nhóm các chữ cái, công việc tốt!
Cướp

Đó là một điều kiện cuộc đua giữa Peter Taylor và tôi. Giải pháp char 100 (101?) Của anh ấy đã được công khai, khi tôi bắt đầu bài đăng và tối ưu hóa, nhưng anh ấy đã hoàn thành sự cải thiện của mình trước tôi, điều mà tôi đã quan sát thấy sau khi hoàn thành. Tôi sẽ không thực hiện bài viết bằng cùng một ngôn ngữ, chỉ với egrep và không có -i, nhưng sẽ đưa ra nhận xét thay vào đó, nếu anh ấy đã nhanh hơn vài phút.
người dùng không xác định

Tôi đã nghĩ về nó ngay sau khi tôi đưa ra nhận xét sửa lỗi regex, và rời bỏ công việc trước khi tôi có cơ hội để làm điều đó. Hoàn toàn quên nó khi tôi về đến nhà.
Cướp

Đoạn cuối cùng của bạn là lý do Steven Rumbalski và tôi thúc đẩy để làm rõ, và sự làm rõ rằng chữ hoa được tính là một tay đã được nhận hơn 24 giờ trước khi bạn xuất bản nó, vì vậy nó không thực sự để thông số.
Peter Taylor

3

Vỏ Bourne, 55 ký tự

(Hoặc bất kỳ vỏ nào giống Bourne nhưng bash, zshhoặc yash)

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

Gọi là sh -f words.sh /usr/share/dict/words. (tất nhiên, trên các hệ thống mà shlà thực sự bashnhư trên một số bản phân phối Linux, dùng thêm Bourne giống như vỏ như ash, ksh, mksh, pdksh, posh...)


2

Javascript (nút), 201 byte

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)

Điều này có thể có thể được viết lại thành một phiên bản ngắn hơn nhiều bằng ngôn ngữ khác, nhưng tôi chỉ muốn thử nút.

Chạy với node words.js < /usr/share/dict/words


1

Q ( 121 140 byte)

Đầu ra không giống nhau (backticks thay vì dấu cách) nhưng đây là triệu chứng của cách Q hiển thị các loại chuỗi.

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");

EDIT: Phải xử lý trường hợp hỗn hợp, +20 ký tự


Bạn có thể chơi golf đáng kể trong 111.`$'i(&:')(min'')(+)(i:read0`:/usr/share/dict/words)in/:\:(x,upper x:"qwertasdfgzxcvb";y,upper y:"yuiophjklnm'")
tmartin

1

Ruby, 112 92 ký tự

EDIT: Điều này ngắn hơn, mặc dù gần như không vui vẻ:

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

Nguyên:

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

Giải pháp dựa trên regex khá đơn giản. Cũng như những người khác, bạn có thể lưu một số ký tự nếu bạn được phép chuyển tên tệp trong ARGV hoặc nếu nó được giả sử là trong thư mục hiện tại của bạn.


1

Python, 130 byte

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

Chạy với python one_handed_words.py < /usr/share/dict/words


Tôi có được phép lấy một trong những giải pháp được đăng ở đây, rút ​​ngắn nó và đưa nó vào bài viết của mình không?
snupun

Nếu đó chỉ là những cải tiến nhỏ, nó sẽ thân thiện hơn để đăng bình luận. Nếu bạn đang thực hiện một thay đổi đáng kể, tốt hơn là đăng một câu trả lời mới, nhưng thật tuyệt khi ghi công cho câu trả lời mà bạn đang dựa vào đó.
gnibbler

1

Haskell (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 ký tự)

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 byte

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

chạy với perl words.pl /usr/share/dict/words


Tôi nhận được lỗi cú pháp: bareword tìm thấy nơi khai thác dự kiến tại dòng words.pl 1, gần "tr / \ n / / rfor"
Wim

1
Điều này hoạt động với tôi trên perl 5.14.2, và yêu cầu perl 5.14 trở lên (đó là nơi cờ thay thế không phá hủy rđược thêm vào)
Hasturkun

0

Python - 152 137 ký tự (chưa được kiểm tra)

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)

chỉnh sửa: xử lý chữ hoa và dấu nháy đơn.


0

Python, 243 ký tự

chỉnh sửa: đây là một chương trình phù hợp hơn theo câu hỏi:

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)

gọi: python onehanded.py > /usr/share/dict/wordshoặc bất kỳ tập tin từ nào khác với các từ được phân tách bằng dòng mới

cũ: 141 ký tự, chỉ là một chức năng từ đơn

trả về righthoặc leftnếu wlà một tay, và bothnếu cả hai tay được sử dụng.

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]

Bạn có vui lòng biến nó thành một chương trình làm việc hoặc loại bỏ số lượng nhân vật không? Nếu không, tiêu đề là sai lệch.
Steven Rumbalski

0

Q, 95 (111 với đường dẫn mã hóa cứng)

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

sử dụng

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`..

Thêm 14 ký tự nếu bạn mã hóa nó

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

Tôi chắc chắn rằng điều này có thể được thực hiện tốt hơn, tôi không biết cách thực hiện thao tác chuỗi :-(


0

Con trăn: 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)

Ra mắt với:

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

Ý tưởng này hầu hết giống với Dillon Cower, nhưng tôi sử dụng set(w)<=Sđể chỉ ra một tập hợp con trong khi set(w)^S>=Scho một tập hợp rời rạc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.