ค้นหาคำด้วยมือเดียว


12

'เกินจริง' เป็นตัวอย่างของคำที่สามารถพิมพ์ทางซ้ายมือบนแผนที่แป้นพิมพ์แบบ qwerty ปกติ 'การผูกขาด' เป็นตัวอย่างสำหรับมือขวา

ค้นหาwordsไฟล์unix สำหรับคำที่สามารถพิมพ์ด้วยมือเดียว ผลลัพธ์ควรเป็นสองบรรทัด: เว้นวรรคคั่นรายการของคำดังกล่าวสำหรับมือซ้ายตามด้วยรายการสำหรับมือขวา เช่น

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
คำถามนี้ไม่ได้มีอยู่ในตัวเองโดยไม่มีคำจำกัดความของตัวอักษรซ้ายและขวา
Peter Taylor

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

Bash ( 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สำหรับ regexes สั้น


1
"^ ([$ x]) * $" ควรเป็น regex
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 ของฉัน, chrons จัดกลุ่มตัวอักษร

ตามคำนิยามหากคุณพิมพ์ด้วยมือสองมือตาบอดหากคุณต้องการสร้างตัวอักษรตัวพิมพ์ใหญ่คุณจะใช้มือซ้ายเพื่อสร้างตัวพิมพ์ใหญ่ของมือขวาและในทางกลับกัน

แน่นอนคุณอาจผลิตตัวพิมพ์ใหญ่Wด้วยมือซ้ายเท่านั้น แต่คุณสามารถผลิตjunkด้วยมือซ้ายได้เช่นกันหากคุณต้องการ


เอาชนะฉันไปที่การจัดกลุ่มตัวอักษรได้ดี!
Rob

มันเป็นสภาพการแข่งขันระหว่างปีเตอร์เทย์เลอร์กับฉัน วิธีแก้ปัญหาถ่าน 100 (101?) ของเขาเป็นสาธารณะเมื่อฉันเริ่มโพสต์และเพิ่มประสิทธิภาพของฉัน แต่เขาเสร็จการปรับปรุงของเขาก่อนที่ฉันซึ่งฉันสังเกตเห็นหลังจากเสร็จสิ้นของตัวเอง ฉันจะไม่โพสต์ในภาษาเดียวกันโดยมี egrep และไม่มี -i แต่จะแสดงความคิดเห็นแทนหากเขาใช้เวลาเร็วกว่านี้สักครู่
ผู้ใช้ที่ไม่รู้จัก

ฉันคิดเกี่ยวกับมันทันทีหลังจากที่ฉันได้แสดงความคิดเห็นแก้ไข regex และออกจากงานก่อนที่ฉันจะมีโอกาสทำ ลืมไปโดยสิ้นเชิงเมื่อถึงบ้าน
Rob

ย่อหน้าสุดท้ายของคุณคือเหตุผลที่ Steven Rumbalski และฉันผลักดันให้เกิดความกระจ่างและการชี้แจงที่ตัวพิมพ์ใหญ่นับว่าได้รับด้วยมือเดียวมากกว่า 24 ชั่วโมงก่อนที่คุณจะตีพิมพ์ดังนั้นจึงไม่ใช่เรื่องจริง
Peter Taylor

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เช่นเดียวกับลินุกซ์บางส่วนใช้อีกบอร์นเหมือนเปลือกเช่น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 ไบต์)

ผลลัพธ์ไม่เหมือนกันทุกประการ (backticks แทนช่องว่าง) แต่นี่เป็นอาการที่ 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*' '}

วิธีการแก้ปัญหา regex ที่เรียบง่าย เช่นเดียวกับคนอื่น ๆ คุณสามารถบันทึกอักขระบางตัวได้ถ้าคุณได้รับอนุญาตให้ส่งชื่อไฟล์ใน 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

หากเป็นการปรับปรุงเพียงเล็กน้อยก็สามารถโพสต์ความคิดเห็นได้ง่ายขึ้น หากคุณกำลังทำการเปลี่ยนแปลงที่สำคัญจะเป็นการดีกว่าที่จะโพสต์คำตอบใหม่ แต่ยินดีที่จะให้เครดิตกับคำตอบที่คุณอ้างอิง
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

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


ฉันได้รับข้อผิดพลาดทางไวยากรณ์: Bareword พบว่าผู้ดำเนินการคาดหวังที่ 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)

เรียกใช้: python onehanded.py > /usr/share/dict/wordsหรือไฟล์คำอื่น ๆ ที่มีคำที่คั่นด้วยบรรทัดใหม่

เก่า: 141 ตัวอักษรเพียงฟังก์ชั่นคำเดียว

ผลตอบแทน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]

คุณช่วยเปลี่ยนให้เป็นโปรแกรมทำงานหรือลบจำนวนตัวละครออกได้ไหม มิฉะนั้นชื่อนั้นจะทำให้เข้าใจผิด
Steven Rumbalski

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.