Найти слова одной рукой

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'

Прописные буквы считаются одноручными; буквы с диакритическими знаками считаются двуручными, поэтому слова, содержащие их, можно игнорировать.

Wim
источник
2
Нужны ли заглавные буквы двумя руками или одной? Я полагаю, что такие символы, как «é», нельзя набирать ни одной рукой, верно? Наконец, я предполагаю, что апостроф - это правильный правый ключ, верно?
Стивен Румбальски
4
Этот вопрос не является самостоятельным без определения левых и правых букв.
Питер Тейлор
4
Одна вещь, которая может помочь людям с помощью регулярных выражений: использовать [a-gq-tv-xz]для левых и ['h-puy]правых букв немного короче, чем выписывать их все.
Пол Престиж

Ответы:

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

Hasturkun
источник
7

Баш ( 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 для более коротких регулярных выражений.

Питер Тейлор
источник
1
"^ ([$ x]) * $" должно быть регулярным выражением
Роб
4

Баш, 86

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

Тейлорс for, мой эгреп, группа хронов из символов.

По определению, если вы печатаете двумя руками вслепую, если вы хотите создать заглавную букву, вы всегда используете левую руку для получения заглавной буквы правой руки и наоборот.

Конечно, вы можете изготовить заглавные буквы Wтолько левой рукой, но вы можете производить junkи левой рукой, если хотите.

Пользователь неизвестен
источник
Обыграй меня в группировке по буквам, отличная работа!
Роб
Это было состояние гонки между Питером Тейлором и мной. Его 100 (101?) Символьное решение было общедоступным, когда я начал свою должность и оптимизацию, но он закончил свое улучшение до меня, что я наблюдал после завершения своего собственного. Я не сделал бы сообщение на том же языке, только с egrep и без -i, но сделал бы комментарий вместо этого, если бы он был на несколько минут быстрее.
пользователь неизвестен
Я подумал об этом сразу после того, как сделал комментарий, исправляющий регулярное выражение, и ушел с работы, прежде чем у меня появилась возможность это сделать. Полностью забыл об этом к тому времени, как я вернулся домой.
Роб
Ваш последний абзац является причиной, по которой Стивен Румбальски и я потребовали разъяснений, а разъяснение о том, что прописные буквы считаются одноручными, было получено более чем за 24 часа до того, как вы опубликовали это, так что это не совсем спецификация.
Питер Тейлор
3

Bourne shell, 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как в некоторых дистрибутивах Linux, использовать другой Bourne-подобные оболочки , как 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 байт)

Вывод не совсем то же самое (обратные черты вместо пробелов), но это симптоматично, как 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 символов

skeevey
источник
Вы можете `$'i(&:')(min'')(+)(i:read0`:/usr/share/dict/words)in/:\:(x,upper x:"qwertasdfgzxcvb";y,upper y:"yuiophjklnm'")
сыграть в
1

Рубин, 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*' '}

Довольно простое решение на основе регулярных выражений. Как и с другими, вы можете сохранить некоторые символы, если вам разрешено передавать имя файла в 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
источник
Могу ли я взять одно из решений, размещенных здесь, сократить его и поместить в мой пост?
Снупунс
Если это просто небольшие улучшения, то удобнее оставлять комментарии. Если вы вносите существенные изменения, лучше опубликовать новый ответ, но приятно отдать должное ответу (ответам), на которых вы его основываете.
Гнибблер
1

Хаскелл (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 символов)

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 байта

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

бежать с perl words.pl /usr/share/dict/words

Hasturkun
источник
Я получаю синтаксическую ошибку: 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

Питон, 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]
блейзер
источник
Не могли бы вы превратить это в рабочую программу или удалить количество символов? В противном случае название вводит в заблуждение.
Стивен Румбальски
0

Q, 95 (111 с жестко закодированным диктовым трактом)

{`$'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'"
tmartin
источник
0

J, 109

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

Я уверен, что это можно сделать лучше, я не знаю, как делать манипуляции со строками :-(

ephemient
источник
0

Питон: 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

Идея в основном та же, что и у Диллона Кауэра, но я использую set(w)<=Sдля обозначения подмножества, а set(w)^S>=Sдля непересекающегося множества.

Bakuriu
источник