Tek elle kullanılan kelimeleri bulma


12

'abartılı', sol taraftan, normal qwerty klavye haritasında yazılabilen bir kelimeye örnektir. 'tekel' sağ el için bir örnektir.

wordsBir yandan yazılabilen sözcükleri unix dosyasında arama . Çıktı iki satır olmalıdır: sol el için bu tür kelimelerin boşlukla ayrılmış listesi, ardından sağ el için liste. Örneğin

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

Soldaki harfler:

qwertasdfgzxcvb

Sağdaki harfler:

yuiophjklnm'

Büyük harfler tek elle sayılır; Aksan harfleri iki elli sayılır ve bu nedenle bunları içeren sözcükler yok sayılabilir.


2
Büyük harfler iki veya bir el gerektiriyor mu? Sanırım "é" gibi karakterler iki elinizle de yazılamaz, değil mi? Son olarak, kesme işaretinin geçerli bir sağ anahtar olduğunu varsayıyorum, değil mi?
Steven Rumbalski

4
Sol ve sağ harflerin tanımı olmadan bu soru kendi kendine yetmez.
Peter Taylor

4
İnsanlara düzenli ifadeler kullanmalarında yardımcı olabilecek bir şey vardır: [a-gq-tv-xz]sol harfleri ve ['h-puy]sağ harfleri kullanmak, hepsini yazmaktan biraz daha kısadır.
Paul Prestidge

Yanıtlar:


7

sed, 78 bayt

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

GNU sed gerektirir, koşmak sed -n -f words.sed < /usr/share/dict/words


7

Bash ( 100 89 karakter)

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

21 karakterin kelimeler dosyasının tam yoluna gittiğini unutmayın: Eğer pwd'nin / usr / share / dict olduğunu varsayabilirsek, bunlardan 16'sı kaydedilebilir.

Daha kısa regex'ler için kron kredisi .


1
"^ ([$ x]) * $" normal ifade olmalı
Rob

4

Bash, 86

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

Taylors for, benim egrep, karakterlerin gruplandırılması.

Tanım olarak, iki el ile kör yazarsanız, büyük harf üretmek istiyorsanız, her zaman sol eli sağ elin büyük harf karakterini üretmek için kullanırsınız;

Tabii ki Wsadece sol el ile bir büyük harf üretebilirsiniz , ancak isterseniz junksol el ile de üretebilirsiniz .


Harfler üzerinde gruplanmama beni yendi, iyi iş çıkardın!
Rob

Peter Taylor ve benim aramda bir yarış koşulu. Görevime ve optimizasyonuma başladığımda 100 (101?) Char çözümü halka açıktı, ancak kendimi bitirdikten sonra gözlemlediğim gelişmesini benden önce tamamladı. Gönderiyi sadece egrep ile ve -i olmadan aynı dilde yapmazdım, ancak birkaç dakika daha hızlı olsaydı bunun yerine bir yorum yapardım.
kullanıcı bilinmiyor

Normal ifadeyi düzelten yorumu yaptıktan hemen sonra düşündüm ve bunu yapma şansım olmadan önce işten ayrıldım. Eve geldiğimde bunu tamamen unuttum.
Rob

Son paragrafınız Steven Rumbalski ve ben açıklığa kavuşturmak için ittiğimiz nedendir ve tek elli olarak büyük harflerin sayıldığına dair açıklama, bunu yayınlamanızdan 24 saatten daha uzun bir süre önce alınmıştır, bu yüzden gerçekten şartname değildir.
Peter Taylor

3

Bourne kabuğu, 55 karakter

(Veya Bourne benzeri herhangi bir kabuk ama bash, zshveya yash)

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

Denir sh -f words.sh /usr/share/dict/words. (tabii ki sistemlerde shaslında bashbazı Linux dağıtımlarında olduğu gibi, kullandığınız başka Bourne benzeri gibi kabuk ash, ksh, mksh, pdksh, posh...)


2

Javascript (düğüm), 201 bayt

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)

Bu muhtemelen başka bir dilde çok daha kısa bir sürüme yeniden yazılabilir, ancak sadece düğümü denemek istedim.

Şununla koş: node words.js < /usr/share/dict/words


1

Q ( 121140 Bayt)

Çıktı tam olarak aynı değildir (boşluklar yerine backticks), ancak Q'nun dize türlerini nasıl görüntülediğinin belirtisidir.

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: karışık durumda işlemek zorunda kaldı, +20 chars


Bunu 111 için önemli ölçüde golf `$'i(&:')(min'')(+)(i:read0`:/usr/share/dict/words)in/:\:(x,upper x:"qwertasdfgzxcvb";y,upper y:"yuiophjklnm'")
oynayabilirsiniz.

1

Ruby, 112 92 karakter

EDIT: Bu daha kısa olsa da, neredeyse eğlenceli değil:

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

Orijinal:

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

Normal regex tabanlı çözüm. Diğerlerinde olduğu gibi, dosya adını ARGV'ye geçirmenize izin verilirse veya geçerli dizininizde olduğu varsayılırsa bazı karakterler kaydedebilirsiniz.


1

Python, 130 Bayt

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

Şununla koş: python one_handed_words.py < /usr/share/dict/words


Burada yayınlanan çözümlerden birini almam, kısaltmam ve gönderime eklememe izin veriliyor mu?
snupuns

Sadece küçük gelişmeler varsa, yorum göndermek daha kolay. Önemli bir değişiklik yapıyorsanız, yeni bir yanıt göndermek daha iyidir, ancak temel aldığınız yanıtlara yanıt vermek güzeldir.
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 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])

1

Perl, 72 bayt

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

ile koş perl words.pl /usr/share/dict/words


Sözdizimi hatası alıyorum: Bareword, operatörün "tr / \ n / / rfor" yakınındaki words.pl satır 1'de beklendiği yerde bulundu
wim

1
Bu benim için 5.14.2 perl üzerinde çalışıyor ve perl 5.14 ve üstü (tahribatsız ikame bayrağının reklendiği yer) gerektiriyor
Hasturkun

0

Python - 152 137 karakter (denenmemiş)

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)

edit: büyük harf ve kesme işareti kullanın.


0

Python, 243 karakter

edit: İşte soruya göre daha uyumlu bir program:

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)

invoke: python onehanded.py > /usr/share/dict/wordsveya yeni satırla ayrılmış kelimeler içeren başka bir kelime dosyası

eski: 141 karakter, sadece tek kelimelik bir işlev

döner rightveya lefteğer wtek elli edilir ve bothher iki el kullanılırsa.

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]

Bunu çalışan bir programa dönüştürür müsünüz veya karakter sayısını kaldırır mısınız? Aksi takdirde, başlık yanıltıcıdır.
Steven Rumbalski

0

Q, 95 (sabit kodlu dikte yoluyla 111)

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

kullanım

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

Sabit kodluyorsanız 14 karakter daha

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

Eminim bu daha iyi yapılabilir, nasıl dize manipülasyon yapmak bilmiyorum :-(


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)

Başlatılan:

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

Fikir çoğunlukla Dillon Cower'ınkiyle aynı, ancak ayrık bir set için bir set(w)<=Salt kümeyi belirtmek için kullanıyorum set(w)^S>=S.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.