qwertyキーボードの単一行を使用した最長単語


30

qwertyキーボードの3行はqwertyuiopasdfghjklzxcvbnmです。あなたの仕事は、与えられた単語のリストから、キーボードの1行だけを使用して入力できる最も長い単語を見つけることです。

サンプル入力1

artist
home
gas
writer
geology
marine
twerp

出力

writer

(指定された単語の中でgaswriterとのみtwerpが1行で記述できwriter、最長です)

単語は実際の単語ではない場合があります(したがって、3行目が無効であると想定しないでください)。ただし、常に正確に1つの答えがあると仮定できます(これ以上でもそれ以下でもありません)。

サンプル入力2

wrhuji
bxnzmmx
gllwssjjd
vnccbb
lrkjhgfdsa
tttttt

出力

bxnzmmx

追加の句読点と空白を入力で提供できます(言語要件に従って)。ただし、追加の出力は指定しないでください。入力と出力は小文字です。最短のコードが優先されます。


@MartinBüttnerRetinaでこれをどのように解決できるか本当に見たいです。簡単にできると思いますか?
ジェリージェレミア

入力語は常に小文字ですか?
nimi

@nimiはい、そうです。
ghosts_in_the_code

@ghosts_in_the_code明確にするためにチャレンジで
ルイスメンドー

回答:


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 文字;)
アンティハパラ

6
私は間にスペースなしに許可された文法を知らなかった9for...
jogloran

これは、私のお気に入りの答えです。
SBI

1
限りcharactherがないよう@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.

8
うわー、デニスをアウトゴルフしましたか?
モーガンスラップ

1
これは勝ちにくいだろう
アドナン

2
あなたは持っています"QWERTYUIOP\nASDFGHJKL\nZXCVBNM"AA事前に定義されたリテラル?よくやった:-)
ルイスメンドー

1
私は記載されている場所を見つけることができないようDに設定されているQWERTYUIOP\nASDFGHJKL\nZXCVBNM、あなたはを参照してもページが状態に思えるVariables <...> D 13
sukhmel

1
;プログラムの最初にある@sukhmel A は、変数A-Lをさまざまな値にリセットします。Dキーボード文字列に設定されます。詳細はこちらをご覧ください。
ETHproductions

11

Python 2.5+および3、93バイト

このアプローチのストローク数をテストする必要がありました。これは、bで発生する文字のみで構成されるa.strip(b)場合、空の文字列になるという事実を使用aします。

この関数は文字列のリストを受け取り、文字列を返します。

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

5
PPCGへようこそ、最初の投稿:)
FryAmTheEggman

なぜkey変数がそこにあるのですか?削除できると思います。
電卓

@CatsAreFluffyいいえ、それは不可能です。関数key引数はキーワードのみです。max
アンティハアパラ

ああ、私はクワーグについて忘れていました。
電卓

8

網膜、73バイト

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

オンラインでお試しください!

結論:網膜には選別段階が必要です。

説明

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

これはgrepステージです。正規表現と一致する行のみを保持します。つまり、それらの文字クラスの1つから排他的に形成されるものです。

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

ここで、残りの最大の文字列を見つける必要があります。これを行うには、少なくとも後続のすべての単語と同じ長さのすべての単語を一致させます。これ1はRetinaに新しく追加されたもので(2日前にリリースされました)、このマッチステージでは最初のマッチのみを考慮するように制限されています。また、!Retinaに(カウントする代わりに)一致を印刷するように指示します。


これはカッコいい!バランスの取れたグループをいつか見る必要があります。彼らは理解するのが難しいようですが。私はこれを試してみました(そして、うまくいくように見えます)が、どのようなものが作成されるかを確認するために、あなたの答えを待ちたいと思いました。
-daavko

@daavkoセルフプロモーションで申し訳ありませんが、バランシンググループに関する私のStack Overflowの投稿を読んでいますか?いい紹介だと言われています。特に(?<a-b>...)コードゴルフではほとんど必要ない構文を使用しない場合、概念自体はそれほど複雑ではありません。
マーティンエンダー

私はその投稿を見たとは思わない。おそらく、Stack Overflowを頻繁に閲覧しないためです。リンクをありがとう、ブックマークして読んでみます。
-daavko

1
おそらくコメントのトピックから外れていますが、グループのバランスに関する私の知識のほとんどは、あなたの投稿を読んだことから来ています。私はいつでもそれを自己宣伝できると思います、それは大きな助けです:)とにかくトピックについて、ソート入力は最長の入力で行を取得するために<code> O-1`。* </ code>のようなものですか?たぶん、音訳のように動作し、バックティックで区切られた複数の領域、分割する正規表現、およびカウントする1つを持つ必要がありますか?実際、これはチャットにも属しているかもしれません...¯_(ツ)_ /
¯– 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()

代わりに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

2番目のラムダはFunction<String[],String>です。


更新されたバージョンは、完全なプログラムとして短いラムダよりも優れています:)
SBI

@SBI Curse 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 私の最近のメタディスカッションによれば、ラムダがimport java.util.*;リストを取得する場合、バイトカウントに含める必要があります。つまり、リストを取得するためにリストを取得する場合、リストを取得する場合は+19バイトです。しかし、-7バイトのゲインのmax代わりに、そこでキャッチしましたreduce
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使用して、1つのキーボード行のみで構成される単語のみを選択します。これらの結果を、プロパティごとに並べ替えます。PowerShellの文字列はすべてソート可能なプロパティとして含まれるタイプであるため、これを行うことができます。これは、文字列を長さの昇順でソートするため、最後の文字列をで取得し、パイプラインに残し、出力は暗黙的です。-matchSort-ObjectLengthSystem.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つの文字列のリストになり、1つが空の場合
                      #単語は1行で入力できます
    } k#リストに空の文字列が含まれているかどうかを確認する
elD#結果リストを長さ順に並べ、最後のリストを取得

3

ルビー、88 82 69

文字列のリストを取得することが許可されておらず、複数行の文字列を取得する必要がある場合は、スコアに+12を追加し.split('\n').grep呼び出しの直前に追加します。

CatsAreFluffyに、Rubyの安定したラムダと、manatworkからのさらなる最適化について教えてくれてありがとう

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

いいえ、.split('\n')前に追加し.selectますか?そして、なぜ安定したラムダがないのですか?
電卓

あなたがそれについて言及したとき、私はちょうど今まで、安定したラムダについて知りませんでした。ありがとう!
バリューインク

-88-と82の間にスペースを追加できますか?
電卓

変数に割り当てる必要はありません。匿名関数が許可されています。.selectのコードブロック内で行う唯一のことが正規表現と照合することである場合、.grepより適切です。呼び出しチェーンの最後のメソッドのパラメーターを括弧で囲む必要はありません。.length短いエイリアスがあり.sizeます->x{x.grep(/^([o-rwetyui]+|[asdfghjkl]+|[zxcvbnm]+)$/).max_by &:size}
。– manatwork

3

C#、141/112 /(120バイト)

明らかな理由で、最悪のゴルフ言語の候補者。qwertyではなくqwertzで「my」ロケールを使用しますが、それ以外は正常に動作します。

場所なしの完全なプログラム:

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

whereを使用する代わりに述語でLastのみを使用する別の代替手段を追加しました。これにより、さらに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}  

@Wolfgangの提案のおかげで3バイト節約


[wetyuio-r]代わりにを使用して1バイトを減算し、/^(expr|expr|expr)$/`/ ^ expr $ | ^ expr $ | ^ expr $ /の代わりにさらに2 バイトを減算できます
Wolfgang

@Wolfgang:ヒントをありがとう。私はすでに2番目のものを試しました、そして、私のawkでそれは私に正しいものの代わりに最も長い単語を与えました...私は再び試みます。最初の1つに同意しますが、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'}

または(2番目の例)

{'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()notが使用する正規表現はアンカーを必要としないことに注意してください。

groovy:000> ['ab', 'ac', 'bc', 'abc', 'aca', 'bbc'].grep ~/[ac]+|b+/
===> [ac, aca]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.