쿼티 키보드의 단일 행을 사용하는 가장 긴 단어


30

쿼티 키보드의 세 행은 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로 어떻게 해결할 수 있는지 알고 싶습니다. 당신은 그것이 쉽게 이루어 졌다고 생각합니까?
Jerry Jeremiah

입력 단어는 항상 소문자입니까?
nimi

@nimi 네, 그렇습니다.
ghosts_in_the_code

@ghosts_in_the_code 명확성을 위해 도전해야 할 부분
Luis Mendo

답변:


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
/Python 3의 경우 1 문자 이상
;;

6
나는 사이에 공백에 허용되는 문법 몰랐다 9for...
jogloran

이것은 지금까지 내가 가장 좋아하는 대답입니다.
SBI


@wnnmaw 더 이상 최신 버전의 Python에는 해당되지 않습니다. 예를 들어 4if 0else 22.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
우와, 데니스를 방금 아웃 했어?
Morgan Thrapp

1
이길 수 없을 것입니다
Adnan

2
당신이 있습니까 "QWERTYUIOP\nASDFGHJKL\nZXCVBNM"AA 미리 정의 된 문자? 잘 연주 :-)
Luis Mendo

1
D로 설정 되어있는 곳을 찾을 수없는 것 같습니다 QWERTYUIOP\nASDFGHJKL\nZXCVBNM. 심지어 언급 한 페이지도 상태 인 것 같습니다Variables <...> D 13
sukhmel

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
Antti Haapala

Ack, 나는 kwargs를 잊었다.
CalculatorFeline

8

레티 나 73 바이트

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

온라인으로 사용해보십시오!

결론 : Retina는 선별 단계가 필요합니다.

설명

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

이것은 grep 단계입니다. 정규 표현식과 일치하는 줄만 유지합니다. 즉, 해당 문자 클래스 중 하나에서만 독점적으로 형성된 문자입니다.

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

이제 나머지 문자열 중 가장 큰 것을 찾아야합니다. 우리는 적어도 그 이후의 모든 단어보다 긴 모든 단어를 일치 시켜서 이것을합니다. 이 게임 1은 Retina (2 일 전에 출시)에 새로 추가 된 것으로,이 경기 단계는 첫 경기 만 고려하도록 제한됩니다. 그리고 !Retina에게 경기를 계산하는 대신 인쇄하도록 지시합니다.


이것은 멋지다! 균형 잡힌 그룹을 언젠가 살펴 봐야합니다. 비록 이해하기 어려운 것 같습니다. 나는 해봤 (그리고 그것이 작동하는 것 같습니다),하지만 난 당신이 만듭니다 종류의 물건을 확인하려면 당신의 응답을 기다립니다 싶었다.
daavko

@daavko 자체 프로모션에 대해 죄송하지만 밸런싱 그룹에 대한 내 스택 오버플로 게시물을 읽었 습니까? 좋은 소개라고 들었습니다. 개념 자체는 그렇게 복잡하지 않습니다. 특히 (?<a-b>...)코드 골프에 거의 필요 하지 않은 구문을 사용하지 않는 경우 특히 그렇습니다 .
Martin Ender

나는 그 게시물을 본 적이 없다고 생각합니다. 스택 오버플로를 자주 탐색하지 않기 때문에 가능합니다. 링크 주셔서 감사합니다, 나는 그것을 북마크하고 읽을 것입니다.
daavko

1
아마도 의견에 대한 주제를 벗어난 것일 수도 있지만 그룹 균형 조정에 대한 내 지식의 거의 100 %는 게시물을 읽은 것입니다. 나는 당신이 언제든지 스스로 홍보 할 수 있다고 생각합니다. 큰 도움이됩니다. 음역처럼 작동해야하고 둘 이상의 백틱으로 구분 된 지역, 분할 할 정규 표현식과 계산할 정규 표현식이 있어야합니까? 실제로 이것은 아마도 채팅에 속할 수도 있습니다 ... ¯_ (ツ) _ / ¯
FryAmTheEggman

o-r, 멋진 생각하지 않았어요.
Emanuel Vintilă

6

Java, 154142 또는 142130 바이트

왜냐하면, 나중에 알기 때문입니다.

비교를 위해 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

둘째, λ는이다 Function<String[],String>.


내 업데이트 된 버전은 이제 전체 프로그램으로 짧은 람다를 능가합니다 :)
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 chars)
Andreas

@Andreas 최근의 메타 토론에 따르면 람다가 List를 가져 가면 import java.util.*;바이트 수 에 포함해야합니다 .List를 가져 오기 위해 List를 가져 와서 +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

파이썬 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

피스, 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 # 주문 결과 목록 길이 및 마지막

3

루비, 88 82 69

문자열 목록을 사용할 수없고 여러 줄 문자열을 가져와야하는 경우 점수에 +12를 추가 .split('\n')하고 .grep통화 직전에 추가 하십시오.

Ruby의 스테이 비 람다와 manatwork의 추가 최적화에 대해 가르쳐 준 CatsAreFluffy에게 감사합니다.

->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}
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를 사용해야한다고 말하고 어쨌든 이것을 하드 코딩하기 때문에 변경해야 할 이유가 없습니다. 또한 전체 바이트 대신 함수를 사용하여 일부 바이트를 저장할 수 있습니다. 챌린지에서 명시 적으로 금지하지 않는 한 항상 허용됩니다.
Denker

내 레이아웃을 자랑스럽게 생각합니다 : 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.
manatwork

2

awk, 92 84 81 바이트

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

@Wolfgang 제안으로 3 바이트 절약


대신`/ ^ expr $ | ^ expr $ | ^ expr $ / 대신에 [wetyuio-r]두 가지를 더 사용하여 바이트를 빼면됩니다./^(expr|expr|expr)$/
Wolfgang

@ 울프 강 : 팁 주셔서 감사합니다. 나는 이미 두 번째 것을 시도했고 내 awk에서 올바른 단어 대신 가장 긴 단어를주었습니다 ... 다시 시도 할 것입니다. 나는 첫 번째 것에 동의하지만 1 바이트를 절약합니다
Olivier Dulac

@ 울프 강 : 흠, 이번에는 작동합니다 (금요일, 내 자신의 테스트에서 괄호를 어지럽 혔을 수도 있습니다). 감사합니다.
Olivier Dulac

정규식 주위의 괄호가 필요합니까? gawk그리고 mawk그들없이 행복하다.
manatwork

@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

펄, 81 바이트

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

문자 대 기호는 상당히 높습니다.


0

그루비, 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]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.