使用单行qwerty键盘的最长单词


30

三排QWERTY键盘的是qwertyuiopasdfghjklzxcvbnm。您的任务是从给定的单词列表中找到只能使用键盘的一行即可输入的最长单词。

样品输入1

artist
home
gas
writer
geology
marine
twerp

输出量

writer

(给定的话,只有gaswriter并且twerp可以使用单个行写入,并且writer是最长的)

这些单词可能不是实际单词(因此,请不要假定第三行无效)。但是,您可以假设始终只有一个答案(不多也不少)。

样品输入2

wrhuji
bxnzmmx
gllwssjjd
vnccbb
lrkjhgfdsa
tttttt

输出量

bxnzmmx

可以在输入中提供其他标点符号和空格(根据语言要求)。但是,不应提供任何额外的输出。输入和输出均为小写。最短的代码胜出。


@MartinBüttner我真的很想看看如何用Retina解决。您认为这很容易做到吗?
杰里·耶利米

输入的单词总是小写吗?
nimi

@nimi是的,他们是。
ghosts_in_the_code

@ghosts_in_the_code您应该在挑战中明确指出
Luis

Answers:


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)

1
/Python 3增加1个字符;)
Antti Haapala 2016年

6
我不知道该语法不允许在9和之间使用空格for...
jogloran

到目前为止,这是我最喜欢的答案。
SBI


@wnnmaw不再适用于较新版本的Python,例如4if 0else 2在2.7.11和3.5.1中有效(并且可能在以前的
某些

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
哇,您刚刚超越了丹尼斯吗?
Morgan Thrapp

1
这将很难被击败
Adnan

2
您是否有"QWERTYUIOP\nASDFGHJKL\nZXCVBNM"预定义的文字?发挥出色:-)
路易斯·门多

1
我似乎无法找到在那里说,D被设置为QWERTYUIOP\nASDFGHJKL\nZXCVBNM,即使你指的是页面看起来状态Variables <...> D 13
sukhmel

1
;程序开头的@sukhmel A 将变量重置A-L为各种值。D设置为键盘字符串。您可以在此处找到更多信息。
ETHproductions 2016年

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功能是关键字只。
Antti Haapala'3

阿克,我忘记了夸克。
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

@daavko抱歉,我无法自我宣传,但是您是否阅读了我关于平衡组的Stack Overflow帖子?有人告诉我这是一个很好的介绍。这个概念本身并没有那么复杂,特别是如果您不使用(?<a-b>...)代码高尔夫中很少需要的语法。
马丁·恩德

我认为我没有看过该帖子。最可能是因为我不经常浏览Stack Overflow。感谢您的链接,我将其添加为书签并阅读。
daavko

1
可能不在评论之列,但是我了解平衡组的知识中,几乎100%来自阅读您的帖子。我认为您可以随时自我推广,这对您有很大帮助:)无论如何,在主题上,排序阶段的工作是否会像<code> O-1`。* </ code>那样获得最长的输入?也许它应该像音译一样工作,并具有多个反引号分隔的区域,一个正则表达式可以拆分,一个可以计数吗?实际上,也许这也属于聊天... __(ツ)_ /
¯– FryAmTheEggman

从来没有想过o-r,很棒。
伊曼纽尔·文提拉(EmanuelVintilă)2016年

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()

如果我可以假设输入为String []则为134个字节:

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

第二个lambda是一个Function<String[],String>


我的更新版本现在甚至比完整的程序更胜过较短的lambda :)
SBI

@SBI诅咒Java的长方法调用!(非常有趣)
CAD97

自己是一名Java开发人员,很高兴能同时看到简洁的冗长语言:)
SBI

如果我们要进行输入假设,那么让我们做一个最能帮助我们的输入,输入形式为List <String> :(l->l.stream().filter(g->g.matches("[wertyuio-r]*|[asdfghjkl]*|[zxcvbnm]*")).max((a,b)->a.length()-b.length()).get()116个字符)
Andreas

@Andreas 根据我最近的meta讨论,如果lambda接受List,则必须将其包括import java.util.*;在字节数中,这意味着通过接受List来获取列表是-16个字节,而导入List则需要+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

Python 3、98

感谢Kevin,节省了5个字节。
借助PM 2Ring,节省了3个字节。
感谢Antti Haapala,节省了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作为lambda变量过滤输入
         c。“ ...” \`#所有键盘行的列表
      -LT#从当前输入中删除当前输入行的所有字母
                      #个字。导致3个字符串的列表,如果不包含则为空
                      #单词可以排成一行
    } k#检查列表中是否包含一个空字符串
ELD#按长度排序结果列表,并取最后一个

3

红宝石,88 82 69

如果不允许我使用字符串列表,而必须使用多行字符串,请在乐谱上加+12并.split('\n').grep通话之前添加。

感谢CatsAreFluffy教给我有关Ruby中稳定的lambda的知识,以及有关manatwork的进一步优化的知识

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

不,您在.split('\n')之前添加.select,对吗?为什么没有稳定的lambda?
CalculatorFeline

直到您提到它时,我才知道稳定的lambda。谢谢!
价值墨水

您可以在-88-和82之间添加空格吗?
CalculatorFeline

无需将其分配给变量,允许使用匿名函数;如果在.select代码块内唯一要做的就是将其与正则表达式匹配,.grep则更合适;无需在调用链中在最后一个方法的参数周围加上括号;.length别名较短.size->x{x.grep(/^([o-rwetyui]+|[asdfghjkl]+|[zxcvbnm]+)$/).max_by &:size}
manatwork 2013年

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]+)$")));}

仅输出而没有Where:

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,并且由于无论如何都要对此进行硬编码,所以我看不出有任何理由来更改它。您也可以使用函数(甚至可能是lambda)而不是完整程序来节省一些字节。除非在挑战中明确禁止,否则始终允许这样做。
Denker

为我的布局:P感到骄傲,无论如何我都没有机会使用C#赢得胜利。在仅输出的版本中进行了编辑。
SBI

添加了另一种选择,仅使用带谓词的Last而不使用where。这将减少另外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
manatwork'Mar 21'16

2

awk,92 84 81字节

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

@Wolfgang建议节省了3个字节


您可以使用[wetyuio-r]代替一个字节,也可以减去两个字节/^(expr|expr|expr)$/代替`/ ^ expr $ | ^ expr $ | ^ expr $ /
Wolfgang 2016年

@沃尔夫冈:谢谢你的提示。我已经尝试过第二个单词,而在我的awk中,它给出了最长的单词,而不是正确的单词...我会再试一次。我同意第一个,不过节省了1个字节
Olivier Dulac

@Wolfgang:嗯,这次确实有效(星期五,我可能在我自己的测试中弄不清楚了括号)。我会编辑您的提示,谢谢。
奥利维尔·杜拉克

您确定正则表达式周围的括号是否必要?没有他们gawk,我mawk会很高兴。
manatwork'Mar 21'16

@manatwork:内在的是必要的,外在的我更喜欢有它们以确保逻辑和评估顺序。..也许以2个字符的“代价”
Olivier Dulac

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]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.