Знайдіть слова однією рукою


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
Чи потрібні великі літери дві руки чи одна? Я вважаю, що такі символи, як "é", не можна вводити ні однією рукою, правда? Нарешті, я припускаю, що апостроф є дійсним ключем правої руки, правильно?
Стівен Румбальський

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


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 з них можна зберегти.

Кредит Хроні для коротких регулярних виразів.


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

Оболонка Борна, 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");

EDIT: Доводилося обробляти змішану справу, +20 символів


Можна значно `$'i(&:')(min'')(+)(i:read0`:/usr/share/dict/words)in/:\:(x,upper x:"qwertasdfgzxcvb";y,upper y:"yuiophjklnm'")
пограти в

1

Рубі, 112 92 символи

EDIT: Це коротше, хоча і не так весело:

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

Пітон, 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

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 знайшов там, де очікується оператор у word.pl рядок 1, біля "tr / \ n / / rfor"
wim

1
Це працює для мене на perl 5.14.2, і вимагає perl 5.14 і вище (саме там rбуло додано прапор неруйнівної заміни )
Hasturkun

0

Пітон - 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'"

0

J, 109

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

Я впевнений, що це можна зробити краще, я не знаю, як зробити маніпуляцію з рядком :-(


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

Ідея здебільшого така ж, як у Dillon Cower, але я використовую set(w)<=Sдля позначення підмножини в той час як set(w)^S>=Sдля розрізненого набору.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.