Самое длинное слово, используя одну строку 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

Дополнительные знаки препинания и пробелы могут быть предоставлены при вводе (в соответствии с требованиями языка). Тем не менее, никакой дополнительной информации не должно быть. Вход и выход в нижнем регистре. Самый короткий код выигрывает.

ghosts_in_the_code
источник
@ MartinBüttner Мне бы очень хотелось посмотреть, как это можно решить с помощью Retina. Как вы думаете, это легко сделать?
Джерри Иеремия
Всегда ли вводимые слова в нижнем регистре?
Nimi
@nimi Да, они есть.
ghosts_in_the_code
@ghosts_in_the_code Вы должны заявить, что в задаче для ясности
Луис Мендо
6
Соответствующий xkcd: what-if.xkcd.com/75
Джон Дворжак

Ответы:

18

Python 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)
XNOR
источник
1
/Еще 1 символ для Python 3;)
Антти Хаапала
6
Я не знал, грамматика не допускает пробелов между 9и for...
Jogloran
Это, безусловно, мой любимый ответ.
ВОО
1
@jogloran, до тех пор, пока символ не является Eили e, вы можете почти всегда удалять пробелы между числом и именем переменной / ключевым словом
wnnmaw
@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.
ETHproductions
источник
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]+)$

Это этап grep: он сохраняет только те строки, которые соответствуют регулярному выражению. Т.е. те, которые формируются исключительно из одного из этих классов персонажей.

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

Теперь нам просто нужно найти самую большую из оставшихся строк. Мы делаем это путем сопоставления всех слов, которые по крайней мере так же длинны, как все слова после них. Это 1новое дополнение к Retina (выпущено два дня назад), которое ограничивает стадию матча только первым таким матчем. И !инструктирует Retina напечатать матч (вместо того, чтобы считать).

Мартин Эндер
источник
Это здорово! Мне придется взглянуть на сбалансированные группы когда-нибудь. Хотя, кажется, их трудно понять. Я пробовал это (и похоже, что это работает), но я хотел дождаться вашего ответа, чтобы увидеть, что вы будете создавать.
Даавко
@daavko Извините за саморекламу, но читали ли вы мой пост переполнения стека о балансировке групп ? Мне говорят, что это хорошее введение. Сама концепция на самом деле не так уж сложна, особенно если вы не используете (?<a-b>...)синтаксис, который редко требуется в гольф-коде.
Мартин Эндер
Я не думаю, что видел этот пост. Скорее всего потому, что я не часто просматриваю Stack Overflow. Спасибо за ссылку, я добавлю ее в закладки и прочту.
Даавко
1
Вероятно, не по теме для комментариев, но почти 100% моих знаний о балансировке групп происходит от прочтения вашего поста. Я думаю, что вы можете самостоятельно продвигать его в любое время, это очень поможет :) В любом случае, больше по теме, будет ли сортировать на сцене что-то вроде <code> O-1`. * </ Code>, чтобы получить строку с самым длинным вводом? Может быть, он должен работать как транслитерация и иметь более одной области, разделенной обратным тэгом, регулярное выражение для разделения и одно для подсчета? На самом деле, возможно, это также относится к чату ... ¯_ (ツ) _ / ¯
FryAmTheEggman
Никогда бы не подумал o-r, офигенно.
Эмануэль Винтилэ
6

Java, 154 142 или 142 130 байт

Потому что, вы знаете, Java.

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

CAD97
источник
Моя обновленная версия теперь даже побеждает более короткую лямбду как полную программу :)
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
@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
AdmBorkBork
источник
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 # Проверить, содержит ли список строку emtpy
elD # упорядочить список результатов по длине и взять последний
Denker
источник
3

Руби, 88 82 69

Если мне не разрешено брать список строк и нужно брать многострочную строку, добавьте +12 к партитуре и добавьте .split('\n')прямо перед .grepвызовом.

Спасибо CatsAreFluffy за то, что он научил меня лабиринтам в Ruby и дальнейшим оптимизациям от manatwork.

->x{x.grep(/^([o-rwetyui]+|[asdfghjkl]+|[zxcvbnm]+)$/).max_by &:size}
Значение чернил
источник
Нет, ты добавляешь .split('\n')перед тем .select, верно? А почему нет крепких лямбд?
CalculatorFeline
Я не знал о «лямбда» до тех пор, пока вы не упомянули об этом. Благодарность!
Value Ink
Можете ли вы добавить пробел между -88- и 82?
CalculatorFeline
Нет необходимости присваивать его переменной, разрешены анонимные функции; если единственное, что нужно сделать внутри .selectблока кода, это сопоставить его с регулярным выражением, то .grepэто более удобно; нет необходимости ставить скобки вокруг параметров последнего метода в цепочке вызовов; .lengthимеет более короткий псевдоним .size:->x{x.grep(/^([o-rwetyui]+|[asdfghjkl]+|[zxcvbnm]+)$/).max_by &:size}
manatwork
3

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

Претендент на худший язык гольфа, по понятным причинам. Использует "мой" языковой стандарт с 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());
SBI
источник
1
В задании говорится, что вы должны использовать querty, и, поскольку вы все равно жестко его кодируете, я не вижу причин менять это. Также вы можете использовать функцию (возможно, даже лямбду) вместо полной программы, чтобы сохранить несколько байтов. Это всегда разрешено, если явно не запрещено в соревновании.
Денкер
Горжусь своим макетом: P, у меня нет шансов на победу в любом случае, используя C #. Отредактировано в версии, которая только вывод.
ВОО
Добавлена ​​другая альтернатива, использующая только Last с предикатом вместо использования where. Это сбрасывает еще 8 байтов.
ВОО
2

bash105 байт

И различные другие утилиты, конечно.

egrep -x '[wetyuio-r]+|[asdfghjkl]+|[zxcvbnm]+'|awk '{print length($0)"\t"$0;}'|sort -n|cut -f2|tail -n1
Wolfgang
источник
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-й, и в моем awk он дал мне самое длинное слово вместо правильного ... Я попробую еще раз. Я согласен с первым, хотя, сохраняет 1 байт
Оливье Дюлак
@Wolfgang: хм, на этот раз работает (возможно, я искал скобки в моем собственном тесте, пятница). Я редактирую ваши советы, спасибо.
Оливье Дюлак
Вы уверены, что круглые скобки вокруг регулярного выражения необходимы? 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]
manatwork
источник