Temukan kata-kata satu tangan

12

'dilebih-lebihkan' adalah contoh kata yang dapat diketik di sebelah kiri, pada peta keyboard qwerty normal. 'monopoli' adalah contoh untuk tangan kanan.

Mencari wordsfile unix untuk kata-kata yang dapat diketik di satu tangan. Keluaran harus dua baris: daftar kata-kata yang dipisahkan oleh spasi untuk tangan kiri, diikuti oleh daftar untuk tangan kanan. misalnya

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

Huruf-huruf kiri adalah:

qwertasdfgzxcvb

Huruf kanan adalah:

yuiophjklnm'

Huruf besar dihitung dengan satu tangan; surat-surat dengan diakritik dianggap sebagai dua tangan dan karenanya kata-kata yang mengandungnya dapat diabaikan.

wim
sumber
2
Apakah huruf kapital memerlukan dua tangan atau satu? Saya kira karakter seperti "é" tidak dapat diketik dengan kedua tangan, bukan? Akhirnya, saya menganggap apostrof adalah kunci kanan yang valid, benar?
Steven Rumbalski
4
Pertanyaan ini tidak lengkap tanpa definisi huruf kiri dan kanan.
Peter Taylor
4
Satu hal yang mungkin membantu orang menggunakan ekspresi reguler: menggunakan [a-gq-tv-xz]untuk huruf kiri dan ['h-puy]untuk huruf kanan sedikit lebih pendek daripada menulis semuanya.
Paul Prestidge

Jawaban:

7

sed, 78 byte

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

membutuhkan GNU, jalankan dengan sed -n -f words.sed < /usr/share/dict/words

Hasturkun
sumber
7

Bash ( 100 89 karakter)

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

Perhatikan bahwa 21 karakter menuju ke path lengkap ke file words: jika kita diperbolehkan berasumsi bahwa pwd adalah / usr / share / dict maka 16 di antaranya dapat disimpan.

Kredit untuk chron untuk regex yang lebih pendek.

Peter Taylor
sumber
1
"^ ([$ x]) * $" harus menjadi 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 saya, chron mengelompokkan char.

Menurut definisi, jika Anda mengetik dengan dua tangan buta, jika Anda ingin menghasilkan huruf besar, Anda selalu menggunakan tangan kiri untuk menghasilkan karakter huruf besar dari tangan kanan dan sebaliknya.

Tentu saja Anda dapat menghasilkan huruf besar Whanya dengan tangan kiri, tetapi Anda juga bisa memproduksi junkdengan tangan kiri, jika Anda mau.

Pengguna tidak diketahui
sumber
Kalahkan aku sampai pada pengelompokan surat-surat itu, kerja bagus!
Rob
Sudah kondisi ras antara Peter Taylor dan saya. Solusi 100 (101?) Char-nya bersifat publik, ketika saya memulai posting dan optimisasi saya, tetapi dia menyelesaikan peningkatannya sebelum saya, yang saya amati setelah menyelesaikan sendiri. Saya tidak akan membuat posting dalam bahasa yang sama, hanya dengan egrep dan tanpa -i, tetapi akan membuat komentar, jika dia beberapa menit lebih cepat.
pengguna tidak dikenal
Saya memikirkannya tepat setelah saya membuat komentar memperbaiki regex, dan meninggalkan pekerjaan sebelum saya memiliki kesempatan untuk melakukannya. Benar-benar lupa tentang hal itu pada saat saya tiba di rumah.
Rob
Paragraf terakhir Anda adalah alasan Steven Rumbalski dan saya mendorong untuk klarifikasi, dan klarifikasi yang dianggap sebagai huruf besar satu tangan diterima lebih dari 24 jam sebelum Anda menerbitkan ini, jadi itu tidak benar-benar spesifik.
Peter Taylor
3

Bourne shell, 55 karakter

(Atau shell seperti Bourne tetapi bash, zshatau yash)

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

Disebut sebagai sh -f words.sh /usr/share/dict/words. (tentu saja, pada sistem di mana shsebenarnya bashseperti pada beberapa distribusi Linux, menggunakan lain Bourne-seperti shell seperti ash, ksh, mksh, pdksh, posh...)

sch
sumber
2

Javascript (simpul), 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)

Ini mungkin dapat ditulis ulang ke versi yang jauh lebih pendek dalam bahasa lain, tetapi saya hanya ingin mencoba node.

Jalankan dengan node words.js < /usr/share/dict/words

salinan
sumber
1

Q ( 121 140 Bytes)

Output tidak persis sama (backticks bukannya spasi) tetapi ini merupakan gejala bagaimana Q menampilkan tipe string.

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: Harus menangani case campuran, +20 karakter

skeevey
sumber
Anda bisa bermain golf ini selama 111.`$'i(&:')(min'')(+)(i:read0`:/usr/share/dict/words)in/:\:(x,upper x:"qwertasdfgzxcvb";y,upper y:"yuiophjklnm'")
tmartin
1

Ruby, 112 92 karakter

EDIT: Ini lebih pendek, meskipun tidak menyenangkan:

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

Asli:

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

Solusi berbasis regex yang cukup sederhana. Seperti yang lain, Anda dapat menyimpan beberapa karakter jika Anda diizinkan untuk melewatkan nama file di ARGV atau jika itu diasumsikan berada di direktori Anda saat ini.

Paul Prestidge
sumber
1

Python, 130 Bytes

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

Jalankan dengan python one_handed_words.py < /usr/share/dict/words

snupuns
sumber
Apakah saya diperbolehkan mengambil salah satu solusi yang diposting di sini, mempersingkat, dan memasukkannya ke dalam posting saya?
snupuns
Jika itu hanya perbaikan kecil, lebih ramah untuk mengirim komentar. Jika Anda membuat perubahan signifikan, lebih baik memposting jawaban baru, tetapi senang memberi kredit untuk jawaban yang mendasari Anda.
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
marinus
sumber
1

Python 2.7 (139 karakter)

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])
Dillon Cower
sumber
1

Perl, 72 byte

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

jalankan bersama perl words.pl /usr/share/dict/words

Hasturkun
sumber
Saya mendapatkan kesalahan sintaksis: Bareword ditemukan di mana operator diharapkan pada words.pl baris 1, dekat "tr / \ n / / rfor"
wim
1
Ini berfungsi untuk saya pada perl 5.14.2, dan membutuhkan perl 5.14 dan lebih tinggi (yang mana bendera pengganti non-destruktif rditambahkan)
Hasturkun
0

Python - 152 137 karakter (belum diuji)

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)

sunting: menangani huruf besar dan apostrof.

Steven Rumbalski
sumber
0

Python, 243 karakter

sunting: inilah program yang lebih sesuai dengan pertanyaan:

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)

aktifkan: python onehanded.py > /usr/share/dict/wordsatau file kata lain dengan kata-kata yang dipisahkan baris

lama: 141 karakter, hanya fungsi satu kata

kembali rightatau leftjika wdigunakan satu tangan, dan bothjika kedua tangan digunakan.

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]
Jaket
sumber
Bisakah Anda mengubahnya menjadi program kerja atau menghapus jumlah karakter? Kalau tidak, judulnya menyesatkan.
Steven Rumbalski
0

Q, 95 (111 dengan jalur dict hardcoded)

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

pemakaian

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 karakter lagi jika Anda meng-hardcode-nya

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

J, 109

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

Saya yakin ini bisa dilakukan dengan lebih baik, saya tidak tahu bagaimana melakukan manipulasi string :-(

singkat
sumber
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)

Diluncurkan dengan:

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

Idenya sebagian besar sama dengan Dillon Cower, tapi saya gunakan set(w)<=Suntuk menunjukkan subset sementara set(w)^S>=Suntuk set terpisah.

Bakuriu
sumber