Encuentra palabras con una mano

12

'exagerado' es un ejemplo de una palabra que se puede escribir en la mano izquierda, en un mapa de teclado qwerty normal. 'monopolio' es un ejemplo para la mano derecha.

Buscando en el wordsarchivo unix palabras que puedan escribirse con una mano. La salida debe ser dos líneas: lista separada por espacios de tales palabras para la mano izquierda, seguida de la lista para la mano derecha. p.ej

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

Las letras de la izquierda son:

qwertasdfgzxcvb

Las letras de la derecha son:

yuiophjklnm'

Las letras mayúsculas cuentan como una mano; Las letras con signos diacríticos cuentan como a dos manos y, por lo tanto, las palabras que las contienen pueden ignorarse.

wim
fuente
2
¿Las letras mayúsculas requieren dos manos o una? Supongo que caracteres como "é" no se pueden escribir con ninguna mano, ¿verdad? Finalmente, supongo que el apóstrofe es una clave válida de la derecha, ¿correcto?
Steven Rumbalski
44
Esta pregunta no es autónoma sin una definición de las letras izquierda y derecha.
Peter Taylor
44
Una cosa que podría ayudar a las personas que usan expresiones regulares: usar [a-gq-tv-xz]para las letras de la izquierda y ['h-puy]para las letras de la derecha es un poco más corto que escribirlas todas.
Paul Prestidge

Respuestas:

7

sed, 78 bytes

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

requiere GNU sed, ejecuta con sed -n -f words.sed < /usr/share/dict/words

Hasturkun
fuente
7

Bash ( 100 89 caracteres)

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

Tenga en cuenta que 21 caracteres van a la ruta completa al archivo de palabras: si se nos permite suponer que pwd es / usr / share / dict, se pueden guardar 16 de ellos.

Crédito a cron para las expresiones regulares más cortas.

Peter Taylor
fuente
1
"^ ([$ x]) * $" debería ser la expresión regular
Rob
4

Bash, 86

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

Taylors for, mi egrep, agrupación crónica de caracteres.

Por definición, si escribe con las dos manos ciegas, si desea producir una letra mayúscula, siempre usa la mano izquierda para producir un carácter en mayúscula de la mano derecha y viceversa.

Por supuesto, puede producir mayúsculas Wsolo con la mano izquierda, pero también puede producir junkcon la mano izquierda, si lo desea.

usuario desconocido
fuente
Vence a la agrupación en las letras, ¡buen trabajo!
Rob
Ha sido una condición de carrera entre Peter Taylor y yo. Su solución de 100 (101?) Char era pública, cuando comencé mi publicación y optimización, pero él terminó su mejora antes que yo, lo que observé después de terminar la mía. No habría hecho la publicación en el mismo idioma, solo con egrep y sin -i, sino que habría hecho un comentario si hubiera sido unos minutos más rápido.
Usuario desconocido
Lo pensé justo después de haber hecho el comentario corrigiendo la expresión regular, y dejé el trabajo antes de tener la oportunidad de hacerlo. Lo olvidé por completo cuando llegué a casa.
Rob
Su último párrafo es la razón por la cual Steven Rumbalski y yo pedimos una aclaración, y la aclaración de que las mayúsculas cuentan como una mano se recibió más de 24 horas antes de que publicara esto, por lo que no es realmente una especificación.
Peter Taylor
3

Bourne shell, 55 caracteres

(O cualquier shell similar a Bourne pero bash, zsho yash)

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

Llamado como sh -f words.sh /usr/share/dict/words. (por supuesto, en sistemas donde shen realidad es bashigual que en algunas distribuciones de Linux, utilice otro Bourne-como la cáscara como ash, ksh, mksh, pdksh, posh...)

sch
fuente
2

Javascript (nodo), 201 bytes

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)

Esto probablemente se puede volver a escribir en una versión mucho más corta en otro idioma, pero solo quería probar el nodo.

Corre con node words.js < /usr/share/dict/words

Copiar
fuente
1

Q ( 121 140 bytes)

La salida no es exactamente la misma (backticks en lugar de espacios), pero esto es sintomático de cómo Q muestra los tipos de cadena.

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

EDITAR: tuvo que manejar mayúsculas y minúsculas, +20 caracteres

skeevey
fuente
Puedes jugar al golf considerablemente por 111.`$'i(&:')(min'')(+)(i:read0`:/usr/share/dict/words)in/:\:(x,upper x:"qwertasdfgzxcvb";y,upper y:"yuiophjklnm'")
tmartin
1

Ruby, 112 92 caracteres

EDITAR: Esto es más corto, aunque no tan divertido:

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

Original:

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

Solución bastante simple basada en expresiones regulares. Al igual que con los demás, puede guardar algunos caracteres si puede pasar el nombre de archivo en ARGV o si se supone que está en su directorio actual.

Paul Prestidge
fuente
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

Corre con python one_handed_words.py < /usr/share/dict/words

snupuns
fuente
¿Puedo tomar una de las soluciones publicadas aquí, acortarla y ponerla en mi publicación?
Snupuns
Si solo se trata de pequeñas mejoras, es más fácil publicar comentarios. Si está haciendo un cambio significativo, es mejor publicar una nueva respuesta, pero es bueno dar crédito a la (s) respuesta (s) en la que lo basa.
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
fuente
1

Python 2.7 (139 caracteres)

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
fuente
1

Perl, 72 bytes

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

corre con perl words.pl /usr/share/dict/words

Hasturkun
fuente
Me sale un error de sintaxis: se encontró una palabra desnuda donde el operador esperaba en la línea 1 de words.pl, cerca de "tr / \ n / / rfor"
wim
1
Esto funciona para mí en perl 5.14.2, y requiere perl 5.14 en adelante (que es donde rse agregó la bandera de sustitución no destructiva )
Hasturkun
0

Python - 152137 caracteres (sin probar)

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)

editar: manejar mayúsculas y apóstrofo.

Steven Rumbalski
fuente
0

Python, 243 caracteres

editar: aquí hay un programa más compatible de acuerdo con la pregunta:

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)

invocar: python onehanded.py > /usr/share/dict/wordso cualquier otro archivo de palabras con palabras separadas por nueva línea

antiguo: 141 caracteres, solo una función de una sola palabra

regresa righto leftsi wes de una mano, y bothsi se usan ambas manos.

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]
Chaqueta de sport
fuente
¿Podría convertir eso en un programa de trabajo o eliminar el recuento de caracteres? De lo contrario, el título es engañoso.
Steven Rumbalski
0

Q, 95 (111 con ruta dict codificada)

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

uso

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 caracteres más si lo codifica

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

J 109

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

Estoy seguro de que esto se puede hacer mejor, no sé cómo manipular cadenas :-(

efímero
fuente
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)

Lanzado con:

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

La idea es principalmente la misma que la de Dillon Cower, pero uso set(w)<=Spara indicar un subconjunto mientras que set(w)^S>=Spara un conjunto disjunto.

Bakuriu
fuente