Найдовше слово за допомогою одного рядка клавіатури qwerty


30

Ці три ряди QWERTY - клавіатура qwertyuiop, asdfghjklі zxcvbnm. Ваше завдання - знайти найдовше слово, яке можна набрати за допомогою лише одного рядка клавіатури, із заданого списку слів.

Зразок введення 1

artist
home
gas
writer
geology
marine
twerp

Вихідні дані

writer

(З поданих слів лише gas, writerі twerpїх можна записати за допомогою одного рядка, і writerце найдовший)

Слова можуть не бути фактичними словами (тому не вважайте, що третій рядок є недійсним). Однак ви можете припустити, що відповідь завжди буде точно одна (ні більше, ні менше).

Зразок введення 2

wrhuji
bxnzmmx
gllwssjjd
vnccbb
lrkjhgfdsa
tttttt

Вихідні дані

bxnzmmx

Додаткові розділові знаки та пробіли можуть бути надані у вводі (відповідно до вимог мови). Однак додаткового результату не слід давати. Вхідні та вихідні великі регістри. Найкоротший код виграє.


@ MartinBüttner Я дуже хотів би побачити, як це можна вирішити за допомогою Retina. Як ви вважаєте, це легко зробити?
Джеррі Єремія

Чи завжди вхідні слова є малими літерами?
німі

@nimi Так, вони є.
ghosts_in_the_code

@ghosts_in_the_code Слід зазначити, що у виклику на ясність
Луїс Мендо

6
Відповідне xkcd: what-if.xkcd.com/75
Джон Дворак

Відповіді:


18

Пітон 2, 84 байти

lambda l:max(l,key=lambda w:(-len({"asdfghjklzxcvbnm".find(c)/9for c in w}),len(w)))

Знаходить maxвхід, порівнюючи менший ряд рядків клавіатури, а потім збільшуючи довжину. Значення рядка на клавіатурі вилучається через "asdfghjklzxcvbnm".find(c)/9, який бере середній рядок до 0, нижній рядок до 1та верхній рядок, який виключається, до -1, оскільки findдає -1відсутні значення.

Інші спроби:

lambda l:max((-len({"asdfghjklzxcvbnm".find(c)/9for c in w}),len(w),w)for w in l)[2]
lambda l:max(l,key=lambda w:len(w)-1./len({"asdfghjklzxcvbnm".find(c)/9for c in w}))
lambda l:max([w for w in l if len({"asdfghjklzxcvbnm".find(c)/9for c in w})<2],key=len)

1
На 1 /символ більше для Python 3;)
Антті Хаапала

6
Я не знав, що граматика не допускає пробілів між 9та for...
jogloran

Це, безумовно, моя улюблена відповідь.
СБІ


@wnnmaw Це більше не стосується новіших версій Python, наприклад, 4if 0else 2воно дійсне в 2.7.11 та 3.5.1 (і, ймовірно, було дійсним для кількох версій раніше)
Sp3000

13

Japt, 32 30 байт

;Uf_¬£DbXu)f10Ãä¥ eÃn@Yl -XlÃg

Перевірте це в Інтернеті! Введення - це масив рядків.

Як це працює

;Uf_  ¬ £  DbXu)f10Ã ä¥  eà n@  Yl -Xlà g
;UfZ{Zq mX{DbXu)f10} ä== e} nXY{Yl -Xl} g

         // Implicit: U = input array of strings
;        // Reset variables A-L to various values.
         // D is set to the string "QWERTYUIOP\nASDFGHJKL\nZXCVBNM".
UfZ{   } // Take U and filter to only the items Z that return truthily to this function:
Zq       //  Split Z into chars, then
mX{    } //  map each char X by this function:
DbXu)    //   Return D.indexOf(X.toUpperCase()),
f10      //   floored to a multiple of 10.
         //  This maps each char to 0 for the top row, 10 for the middle, 20 for the bottom.
q ä==    //  Split the resulting string into chars and check each pair for equality.
e        //  Check that every item in the result is truthy. This returns true if all chars
         //  are on the same row; false otherwise.
         // Now we have only the words that are entirely on one row.
nXY{   } // Sort by passing each two args X and Y into this function:
Yl -Xl   //  Return Y.length - X.length. Sorts the longest to the front.
g        // Get the first item in the resulting array. Implicitly output.

8
Вуа, ти щойно перевершив Денніса?
Морган Трапп

1
Це буде важко перемогти
Аднан

2
Чи є у вас "QWERTYUIOP\nASDFGHJKL\nZXCVBNM"заздалегідь визначений буквальний? Добре зіграно :-)
Луїс Мендо

1
Я не можу знайти місце, де вказано, що Dвстановлено QWERTYUIOP\nASDFGHJKL\nZXCVBNM, навіть на сторінці, на яку ви посилаєтеся, здається, що Variables <...> D 13
йдеться

1
@sukhmel A ;на початку програми скидає змінні A-Lна різні значення. Dвстановлено на рядку клавіатури. Більше інформації ви можете знайти тут .
ETHproductions

11

Python 2.5+ та 3, 93 байти

Довелося перевірити, скільки ударів для цього підходу; для цього використовується той факт, що виходить a.strip(b)порожній рядок, якщо він aскладається виключно з символів, які зустрічаються в b.

Функція бере список рядків і повертає рядок.

lambda a:max(a,key=lambda x:(~all(map(x.strip,['qwertyuiop','asdfghjkl','zxcvbnm'])),len(x)))

5
Ласкаво просимо до PPCG, приємний перший пост :)
FryAmTheEggman

Чому keyтам змінна? Я думаю, ви можете її зняти.
CalculatorFeline

@CatsAreFluffy ні, це неможливо. keyаргумент maxфункції є ключовим словом тільки.
Антті Хаапала

Ак, я забув про кваргів.
CalculatorFeline

8

Сітківка , 73 байти

G`^([eio-rtuwy]+|[adfghjkls]+|[bcmnvxz]+)$
1!`(.)+(?!\D+(?<-1>.)+(?(1)!))

Спробуйте в Інтернеті!

Висновок: Сітківці потрібна стадія сортування.

Пояснення

G`^([eio-rtuwy]+|[adfghjkls]+|[bcmnvxz]+)$

Це греп-етап: він зберігає лише лінії, які узгоджуються регулярними виразами. Тобто ті, які формуються виключно з одного з цих класів символів.

1!`(.)+(?!\D+(?<-1>.)+(?(1)!))

Тепер нам просто потрібно знайти найбільшу з залишилися рядків. Ми робимо це, зіставляючи всі слова, які принаймні довші, ніж усі слова після них. Це 1нове доповнення до Retina (випущене два дні тому), яке обмежує цю стадію матчу лише першим подібним матчем. І !вказує Ретіні надрукувати сірник (замість того, щоб рахувати його).


Це круто! Мені доведеться колись дивитися на збалансовані групи. Хоча їх, здається, важко зрозуміти. Я спробував це (і, схоже, це працює), але мені хотілося почекати вашої відповіді, щоб побачити, яку саме річ ви створите.
daavko

@daavko Вибачте за саморекламу, але чи читали ви мій пост із переповненням стеків на балансуючих групах ? Мені кажуть, що це гарне вступ. Сама концепція насправді не така вже й складна, особливо якщо ви не використовуєте (?<a-b>...)синтаксис, який рідко потрібен у коді гольфу.
Мартін Ендер

Я не думаю, що я бачив цю посаду. Швидше за все, тому що я не переглядаю стек переповнення часто. Дякую за посилання, я закладаю його в закладки і прочитаю.
daavko

1
Мабуть, поза темою для коментаря, але майже 100% моїх знань про балансування груп походить від того, що прочитав ваше повідомлення. Я думаю, ви можете самостійно просувати його в будь-який час, це чудова допомога :) У будь-якому разі, більше за темою, чи вдасться розібратися на сценічному творі на зразок <code> O-1`. * </code>, щоб отримати лінію з найдовшим вкладом? Можливо, це має працювати як транслітерація і мати більше одного відділу зворотного вибору, розділений на регулярний вираз і один для підрахунку? Насправді, можливо, це також належить до чату ... ¯_ (ツ) _ / ¯
FryAmTheEggman

Ніколи б не подумав o-r, приголомшливий.
Емануель Вінтілья

6

Java, 154 142 або 142 130 байт

Тому що, знаєте, Ява.

C #, для порівняння .

146 байт, якщо вхід повинен бути одним рядком зі значеннями, розділеними \n:

s->java.util.Arrays.stream(s.split("\n")).filter(g->g.matches("[wetyuio-r]*|[asdfghjkl]*|[zxcvbnm]*")).max((a,b)->a.length()-b.length()).get()

134 байти, якщо замість цього я можу вважати введення в якості String []:

s->java.util.Arrays.stream(s).filter(g->g.matches("[wetyuio-r]*|[asdfghjkl]*|[zxcvbnm]*")).max((a,b)->a.length()-b.length()).get()

Трохи незворушений:

UnaryOperator<String> longestQwertyStr = s -> 
        java.util.Arrays.stream(s.split("\n")) // Split string input over `\n` and convert to Stream<String>
                .filter(g->g.matches("[wetyuio-r]*|[asdfghjkl]*|[zxcvbnm]*")) // Filter to Strings that only use characters from a single row
                .max((a,b)->a.length()-b.length()) // Find the max by comparing String length
                .get(); // Convert from Optional<String> to String and implicit return single statement lambda

Друга лямбда - це Function<String[],String>.


Моя оновлена ​​версія зараз навіть перемагає коротшу лямбда як повну програму :)
SBI

@SBI Прокляття довгих методів виклику Java! (Усі в хорошій забаві)
CAD97

Будучи самим розробником Java, приємно бачити багатослівну мову, яка встигає бути одночасно стислою :)
SBI

Якщо ми збираємось зробити припущення про вхід, давайте зробимо те, що нам найбільше допомагає, вхід подається як Список <String>: l->l.stream().filter(g->g.matches("[wertyuio-r]*|[asdfghjkl]*|[zxcvbnm]*")).max((a,b)->a.length()-b.length()).get()(116 знаків)
Андреас

@Andreas Згідно з моєю недавньою мета-дискусією , якщо лямбда приймає список, ви повинні включити їх import java.util.*;до числа байтів, тобто, список має -16 байт, взявши список, але +19, щоб імпортувати список. ЗАРАЗ, ви там піймали, використовуючи maxзамість reduceнабору -7 байт.
CAD97

4

Желе, 40 34 байт

p“£vẈ¬ḣ“£AS°GƤg“£ḷḳƤ²ƤȤḤ»f/€fµL€Mị

Спробуйте в Інтернеті!

Як це працює

p“£vẈ¬ḣ“£AS°GƤg“£ḷḳƤ²ƤȤḤ»f/€fµL€Mị

 “£vẈ¬ḣ“£AS°GƤg“£ḷḳƤ²ƤȤḤ»           Use dictionary compression to yield
                                    ['quipo twyer', 'adj flash jg', 'bcmnz xv'].
p                                   Cartesian product; for all pairs of an input
                                    string and one of the rows.
                         f/€        Reduce each pair by filter, keeping only the
                                    letters in the input string that are on that
                                    particular keyboard row.
                            f       Filter the results, keeping only filtered words
                                    that occur in the input.
                             µ      Begin a new chain.
                              L€    Get the length of each kept word.
                                M   Get the index corr. to the greatest length.
                                 ị  Retrieve the word at that index.

4

Пітон 3, 98

Збережено 5 байт завдяки Кевіну.
Збережено 3 байти завдяки програмі PM 2Ring.
Збережено 3 байти завдяки Антті Хаапала.

Брут примушує це наразі. Я фільтрую слова до лише тих, що містяться в одному рядку, а потім сортую за максимальною довжиною рядка.

lambda a:max(a,key=lambda x:(any(map(set(x).__le__,['qwertyuiop','asdfghjkl','zxcvbnm'])),len(x)))

Тестові приклади:

assert f(['asdf', 'qwe', 'qaz']) == 'asdf'
assert f('''artist
home
gas
writer
geology
marine
twerp'''.splitlines()) == 'writer'
assert f('''wrhuji
bxnzmmx
gllwssjjd
vnccbb
lrkjhgfdsa
tttttt'''.splitlines()) == 'bxnzmmx'

3

PowerShell v2 +, 72 байти

($args-match"^([qwertyuiop]+|[asdfghjkl]+|[zxcvbnm]+)$"|sort Length)[-1]

Вводиться як аргументи командного рядка $args, а потім використовує -matchоператор з регулярним виразом, щоб вибрати лише слова, що складаються виключно з одного рядка клавіатури. Ми передаємо ці результати в Sort-Objectтакі сорти за властивостями Length. Ми можемо це зробити, оскільки рядки в PowerShell всі System.Stringтипи, що включає .Lengthв себе властивість сортування. Це сортує рядки у порядку зростання за довжиною, тому ми беремо останній з [-1], залишаємо на конвеєрі, і вихід неявний.

Приклад

PS C:\Tools\Scripts\golfing> .\longest-word-qwerty-keyboard.ps1 asdf qwe zxc typewriter halls establishment
typewriter

3

Pyth, 45 35 байт

Завдяки @FryAmThe ​​Eggman за те, що врятував мені кілька байтів!

elDf}k-LTc."`z:I¿Ç  Ì(T4²ª$8·"\`Q

Спробуйте тут!

Вводиться як список слів.

Пояснення

elDf} k-LTc. "..." \ `Q # Q = список усіх введених слів

   f Q # Вхід фільтра з T як лямбда-змінною
         c. "..." \ `# Список усіх рядків клавіатури
      -LT # Видаліть усі літери поточного рядка вводу з поточного вводу
                      # слово. Результати в списку з 3 рядків, причому одна порожня, якщо
                      # слово можна набрати одним рядком
    } k # Перевірте, чи містить список порожній рядок
список результатів замовлення elD # за довжиною і взяти останній

3

Рубі, 88 82 69

Якщо мені заборонено приймати список рядків і потрібно взяти рядок багаторядкових, додайте +12 до оцінки та додайте .split('\n')прямо перед .grepвикликом.

Дякую CatsAreFluffy за те, що ви навчали мене про стійкі лямбдати в Ruby та подальші оптимізації роботи з манатурки

->x{x.grep(/^([o-rwetyui]+|[asdfghjkl]+|[zxcvbnm]+)$/).max_by &:size}

Ні, ви додаєте .split('\n')перед .select, правда? А чому немає стійких лямбдів?
CalculatorFeline

Я не знав про стійку лямбду до цього часу, коли ви це згадали. Спасибі!
Значення чорнила

Чи можете ви додати пробіл між -88- та 82?
CalculatorFeline

Не потрібно призначати його змінній, анонімні функції дозволені; якщо єдине, що потрібно зробити всередині .selectблоку коду - це зіставити його з регулярним виразом, .grepє більш підходящим; не потрібно ставити дужки навколо параметрів останнього методу в ланцюзі викликів; .lengthмає коротший псевдонім .size:->x{x.grep(/^([o-rwetyui]+|[asdfghjkl]+|[zxcvbnm]+)$/).max_by &:size}
манатура

3

C #, 141/112 / (120 байт)

Претендент на найгіршу мову для гольфу, з очевидних причин. Використовує "my" локаль із qwertz замість qwerty, але добре працює інакше.

Повна програма без де:

static void Main(string[]a){Console.WriteLine(a.OrderBy(x=>x.Length).Last(x=>Regex.IsMatch(x,"^([qwertzuiop]+|[asdfghjkl]+|[yxcvbnm]+)$")));}

Тільки вихід без де:

Console.WriteLine(a.OrderBy(x=>x.Length).Last(x=>Regex.IsMatch(x,"^([qwertzuiop]+|[asdfghjkl]+|[yxcvbnm]+)$")));

Тільки вихід (оригінал):

Console.WriteLine(a.Where(x=>Regex.IsMatch(x,"^([qwertzuiop]+|[asdfghjkl]+|[yxcvbnm]+)$")).OrderBy(x=>x.Length).Last());

1
У виклику сказано, що ви повинні використовувати querty, і оскільки ви все одно жорстко кодуєте це, я не бачу причин для цього змінити. Також ви можете використовувати функцію (можливо навіть лямбда) замість повної програми, щоб зберегти кілька байтів. Це завжди дозволено, якщо прямо не заборонено у виклику.
Денкер

Пишаючись моїм макетом: P, це не так, як я маю шанс перемогти все-таки за допомогою C #. Відредаговано у версії, яка є лише вихідною.
SBI

Додано ще одну альтернативу, використовуючи лише Останній із присудком, а не де. Це збриває ще 8 байт.
SBI

2

bash, 105 байт

І різні інші комунальні послуги, звичайно.

egrep -x '[wetyuio-r]+|[asdfghjkl]+|[zxcvbnm]+'|awk '{print length($0)"\t"$0;}'|sort -n|cut -f2|tail -n1

awkКод можна записати коротше $0=length"\t"$0.
манатура

2

awk, 92 84 81 байт

(/^([wetyuio-r]+|[asdfghjkl]+|[zxcvbnm]+)$/)&&length>length(a){a=$0}END{print a}  

збережено 3 байти завдяки пропозиції @Wolfgang


Ви можете відняти байт, скориставшись [wetyuio-r]замість нього, а також ще два, виконавши /^(expr|expr|expr)$/замість `/ ^ expr $ | ^ expr $ | ^ expr $ /
Вольфганг

@Wolfgang: дякую за пораду. Я спробував вже 2-й, і на жаль, він дав мені найдовше слово замість правильного ... Я спробую ще раз. Я погоджуюся з першим, але економить 1 байт
Олів'є Дулак

@ Вольфганг: Хм, чи справді це працює (я, можливо, накрутив круглі дужки на власному тесті, п'ятниця). Я редагую ваші поради, дякую.
Олів'є Дулак

Ви впевнені, що дужки навколо регулярного виразу необхідні? gawkі mawkщасливі без них.
манатура

@manatwork: внутрішні потрібні, зовнішні я вважаю за краще мати їх для забезпечення логіки та порядку оцінки. .. можливо, за "вартість" 2-х годин
Олів'є Дулак

1

MATL , 54 байти

[]y"@Y:nh]2$SP"@Y:!t'asdfghjkl'mw'zxcvbnm'myy+~hhAa?@.

Це працює з поточною версією (14.0.0) мови / компілятора.

Формат введення (перший приклад)

{'artist' 'home' 'gas' 'writer' 'geology' 'marine' 'twerp'}

або (другий приклад)

{'wrhuji' 'bxnzmmx' 'gllwssjjd' 'vnccbb' 'lrkjhgfdsa' 'tttttt'}

Спробуйте в Інтернеті!

Пояснення

[]               % push empty array. Will be used for concatenation
y                % take input array implicitly at bottom of stack, and copy onto top
"                % for each string
  @Y:            %   push current string
  nh             %   get its length. Concatenate with array of previous lengths
]                % end for each
2$S              % sort the original copy of input array by increasing string length
P                % flip: sort by decreasing length
"                % for each string in decreasing order of length
  @Y:!           %   push that string as a column char vector
  t'asdfghjkl'm  %   duplicate. Tru for chars in 2nd row of keyboard
  w'zxcvbnm'm    %   swap. True for chars in 3rd row of keyboard
  yy+~           %   duplicate top two arrays, sum, negate: true for chars in 1st row
  hh             %   concatenate horizontally twice
  Aa             %   true if any column has all true values
  ?              %   if that's the case
    @            %     push string  
    .            %     break for each loop
                 %   end if implicitly
                 % end for each
                 % display implicitly

1

Perl, 81 байт

$a=$1 if/^([wetyuio-r]+|[asdfghjkl]+|[zxcvbnm]+)$/&&1<<y///c>$a=~y///c;END{say$a}

Символ до числа літер досить високий.


0

Groovy, 65 символів

{it.grep(~/[o-rwetyui]+|[asdfghjkl]+|[zxcvbnm]+/).max{it.size()}}

Вибірка зразка:

groovy:000> ({it.grep(~/[o-rwetyui]+|[asdfghjkl]+|[zxcvbnm]+/).max{it.size()}})(['wrhuji', 'bxnzmmx', 'gllwssjjd', 'vnccbb', 'lrkjhgfdsa', 'tttttt'])
===> bxnzmmx

Зауважте, що регулярний вираз, який використовується .grep()не вимагає прив’язки, що дозволяє також зберегти групування:

groovy:000> ['ab', 'ac', 'bc', 'abc', 'aca', 'bbc'].grep ~/[ac]+|b+/
===> [ac, aca]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.