Najdłuższe słowo przy użyciu jednego wiersza klawiatury qwerty

30

Trzy rzędy klawiatury qwerty to qwertyuiop: asdfghjkli zxcvbnm. Twoim zadaniem jest znalezienie najdłuższego słowa, które można wpisać za pomocą tylko jednego wiersza klawiatury, z podanej listy słów.

Przykładowe dane wejściowe 1

artist
home
gas
writer
geology
marine
twerp

Wydajność

writer

(Danego słowa, tylko gas, writeri twerpmogą być zapisywane za pomocą pojedynczego wiersza, i writerjest najdłuższym)

Słowa mogą nie być rzeczywistymi słowami (więc nie zakładaj, że trzeci wiersz jest nieprawidłowy). Możesz jednak założyć, że zawsze będzie dokładnie jedna odpowiedź (nie więcej, nie mniej).

Przykładowe wejście 2

wrhuji
bxnzmmx
gllwssjjd
vnccbb
lrkjhgfdsa
tttttt

Wydajność

bxnzmmx

Wprowadzane mogą być dodatkowe znaki interpunkcyjne i białe znaki (zgodnie z wymaganiami językowymi). Nie należy jednak podawać żadnych dodatkowych wyników. Dane wejściowe i wyjściowe są pisane małymi literami. Najkrótszy kod wygrywa.

ghosts_in_the_code
źródło
@ MartinBüttner Naprawdę chciałbym zobaczyć, jak można to rozwiązać za pomocą Retina. Czy uważasz, że łatwo to zrobić?
Jerry Jeremiah
Czy słowa wejściowe są zawsze pisane małymi literami?
nimi
@nimi Tak, są.
ghosts_in_the_code
@ghosts_in_the_code Powinieneś powiedzieć, że w wyzwaniu dla jasności
Luis Mendo
6
Odpowiednie xkcd: what-if.xkcd.com/75
John Dvorak

Odpowiedzi:

18

Python 2, 84 bajtów

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

Znajduje dane maxwejściowe, porównując mniejszą liczbę rzędów klawiatury, a następnie zwiększając ich długość. Wartość rzędu klawiatury jest wyodrębniana przez "asdfghjklzxcvbnm".find(c)/9, który przenosi środkowy wiersz 0, dolny wiersz 1i górny wiersz, który jest wykluczony -1, ponieważ finddaje -1brakujące wartości.

Inne próby:

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
źródło
1
/Jeszcze 1 znak dla Pythona 3;)
Antti Haapala
6
Nie wiedziałem, że gramatyka nie dopuszcza spacji między 9a for...
jogloran
To zdecydowanie moja ulubiona odpowiedź.
SBI
1
@jogloran, o ile characther nie jest znakiem Elub e, można prawie zawsze usunąć białe spacje między liczbą a nazwą zmiennej / słowem kluczowym
wnnmaw
@wnnmaw Nie jest to już prawdą w przypadku nowszych wersji Pythona, np. 4if 0else 2jest ważny w wersjach 2.7.11 i 3.5.1 (i prawdopodobnie był ważny dla kilku wcześniejszych wersji)
Sp3000
13

Japt, 32 30 bajtów

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

Przetestuj online! Dane wejściowe to tablica ciągów.

Jak to działa

;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.
ETHprodukcje
źródło
8
Woah, czy właśnie wyprzedziłeś Dennisa?
Morgan Thrapp,
1
Trudno będzie to pokonać
Adnan
2
Czy masz "QWERTYUIOP\nASDFGHJKL\nZXCVBNM"predefiniowany dosłowność? Dobrze zagrane :-)
Luis Mendo
1
Nie mogę znaleźć, gdzie Djest ustawione QWERTYUIOP\nASDFGHJKL\nZXCVBNM, nawet strona, do której się odwołujesz, wydaje się zawieraćVariables <...> D 13
sukhmel
1
@sukhmel A ;na początku programu resetuje zmienne A-Ldo różnych wartości. Djest ustawiony na ciąg klawiatury. Więcej informacji znajdziesz tutaj .
ETHprodukcje
11

Python 2.5+ i 3, 93 bajty

Musiałem sprawdzić, ile uderzeń dla tego podejścia; wykorzystuje to fakt, że a.strip(b)wynikiem jest pusty ciąg znaków, jeśli askłada się wyłącznie ze znaków występujących w b.

Funkcja pobiera listę ciągów i zwraca ciąg.

lambda a:max(a,key=lambda x:(~all(map(x.strip,['qwertyuiop','asdfghjkl','zxcvbnm'])),len(x)))
Antti Haapala
źródło
5
Witamy w PPCG, niezły pierwszy post :)
FryAmTheEggman
Dlaczego jest keytam zmienna? Myślę, że możesz to usunąć.
CalculatorFeline,
@CatsAreFluffy nie, to nie jest możliwe. keyargumentem maxfunkcji jest tylko na słowa kluczowe.
Antti Haapala,
Ack, zapomniałem o kwargs.
CalculatorFeline
8

Siatkówka , 73 bajty

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

Wypróbuj online!

Wniosek: Retina wymaga etapu sortowania.

Wyjaśnienie

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

To jest etap grep: zachowuje tylko linie, które są dopasowane przez wyrażenie regularne. To znaczy te, które powstają wyłącznie z jednej z tych klas postaci.

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

Teraz musimy tylko znaleźć największy z pozostałych ciągów. Robimy to, dopasowując wszystkie słowa, które są co najmniej tak długie, jak wszystkie słowa po nich. 1To nowy dodatek do siatkówki (wydany dwa dni temu), co ogranicza ten etap dopasowania do rozważa tylko pierwszy taki mecz. I !instruuje Retinę, aby wydrukowała mecz (zamiast go liczyć).

Martin Ender
źródło
To jest fajne! Będę musiał kiedyś spojrzeć na zrównoważone grupy. Chociaż wydają się trudne do zrozumienia. Próbowałem tego (i wygląda na to, że działa), ale chciałem poczekać na twoją odpowiedź, aby zobaczyć, jakie rzeczy stworzysz.
daavko
@daavko Przepraszam za autopromocję, ale czy przeczytałeś mój post Przepełnienie stosu na temat grup bilansujących ? Powiedziano mi, że to dobre wprowadzenie. Sama koncepcja nie jest tak skomplikowana, szczególnie jeśli nie używasz (?<a-b>...)składni, która jest rzadko potrzebna w golfie kodowym.
Martin Ender
Chyba nie widziałem tego postu. Najprawdopodobniej dlatego, że nie przeglądam często przepełnienia stosu. Dzięki za link, dodam go do zakładek i przeczytam.
daavko
1
Prawdopodobnie nie na temat komentarza, ale prawie 100% mojej wiedzy o równoważeniu grup pochodzi z przeczytania twojego postu. Myślę, że możesz ją promować w dowolnym momencie, to świetna pomoc :) Zresztą na temat, czy sortowanie byłoby takie jak <code> O-1`. * </code>, aby uzyskać linię z najdłuższym wejściem? Może powinien działać jak transliteracja i mieć więcej niż jeden oddzielony region od tyłu, regex do podziału i jeden do policzenia? Właściwie może to także należy do czatu ... ¯_ (ツ) _ / ¯
FryAmTheEggman
Nigdy bym nie pomyślał o-r, niesamowite.
Emanuel Vintilă
6

Java, 154 142 lub 142 130 bajtów

Ponieważ, wiesz, Java.

C #, dla porównania .

146 bajtów, jeśli dane wejściowe muszą być pojedynczym ciągiem znaków, a wartości należy oddzielić \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 bajty, jeśli zamiast tego mogę przyjąć dane wejściowe jako String []:

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

Nieznacznie nie golfista:

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

Druga lambda to Function<String[],String>.

CAD97
źródło
Moja zaktualizowana wersja bije teraz nawet krótszą lambdę jako pełny program :)
SBI
@SBI Przeklinaj długie wywołania metod Java! (Dobra zabawa)
97 CAD
Będąc programistą Java, miło jest widzieć pełny język, który jednocześnie jest zwięzły :)
SBI
Jeśli mamy przyjąć założenie wejściowe, zróbmy to, które najbardziej nam pomaga, dane wejściowe pojawiają się jako Lista <String>: l->l.stream().filter(g->g.matches("[wertyuio-r]*|[asdfghjkl]*|[zxcvbnm]*")).max((a,b)->a.length()-b.length()).get()(116 znaków)
Andreas
@Andreas Zgodnie z moją ostatnią meta dyskusją , jeśli lambda pobiera Listę, musisz uwzględnić ją import java.util.*;w liczbie bajtów, co oznacza, że ​​pobranie listy wynosi -16 bajtów, biorąc Listę, ale +19, aby zaimportować Listę. JEDNAK złapałeś tam, używając maxzamiast reduce-7 bajtów.
97 CAD
4

Galaretka, 40 34 bajtów

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

Wypróbuj online!

Jak to działa

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.
Dennis
źródło
4

Python 3, 98

Zaoszczędził 5 bajtów dzięki Kevinowi.
Zaoszczędzono 3 bajty dzięki PM 2Ring.
Zaoszczędzono 3 bajty dzięki Antti Haapala.

Brute zmusza go w tej chwili. Filtruję słowa do tylko tych zawartych w jednym rzędzie, a następnie sortuję według maksymalnej długości łańcucha.

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

Przypadki testowe:

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'
Morgan Thrapp
źródło
3

PowerShell v2 +, 72 bajty

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

Pobiera dane wejściowe za pomocą argumentów wiersza polecenia $args, a następnie używa -matchoperatora z wyrażeniem regularnym, aby wybrać tylko słowa, które składają się wyłącznie z jednego wiersza klawiatury. Przekazujemy wyniki do Sort-Objecttego rodzaju według właściwości Length. Możemy to zrobić, ponieważ ciągi znaków w programie PowerShell są tego samego System.Stringtypu, co zawiera .Lengthjako właściwość do sortowania. To sortuje ciągi w porządku rosnącym według długości, więc bierzemy ostatni z [-1], zostawiamy go w potoku, a dane wyjściowe są niejawne.

Przykład

PS C:\Tools\Scripts\golfing> .\longest-word-qwerty-keyboard.ps1 asdf qwe zxc typewriter halls establishment
typewriter
AdmBorkBork
źródło
3

Pyth, 45 35 bajtów

Dzięki @FryAmThe ​​Eggman za uratowanie mi kilku bajtów!

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

Wypróbuj tutaj!

Pobiera dane wejściowe jako listę słów.

Wyjaśnienie

elDf} k-LTc. "..." \ `Q # Q = lista wszystkich wprowadzonych słów

   f Q # Wejście filtra z T jako zmienną lambda
         c. "..." \ `# Lista wszystkich wierszy klawiatury
      -LT # Usuń wszystkie litery bieżącego wiersza wprowadzania z bieżącego wejścia
                      # słowo. Wynikiem jest lista 3 ciągów znaków, z których jeden jest pusty, jeśli
                      # słowo można wpisać w jednym wierszu
    } k # Sprawdź, czy lista zawiera pusty ciąg znaków
ELD # uporządkuj listę wyników według długości i wybierz ostatnią
Denker
źródło
3

Ruby, 88 82 69

Jeśli nie wolno mi wziąć listy ciągów i muszę wziąć ciąg wielowierszowy, dodaj +12 do wyniku i dodaj .split('\n')bezpośrednio przed .grepwywołaniem.

Dzięki CatsAreFluffy za nauczenie mnie o mocnych lambdach w Ruby i dalsze optymalizacje z manatwork

->x{x.grep(/^([o-rwetyui]+|[asdfghjkl]+|[zxcvbnm]+)$/).max_by &:size}
Wartość tuszu
źródło
Nie, dodajesz .split('\n')przed .select, prawda? A dlaczego nie ma mocnych lambdów?
CalculatorFeline,
Do tej pory nie wiedziałem o mocnej lambdzie, kiedy o tym wspomniałeś. Dzięki!
Wartość tuszu
Czy możesz dodać spację między -88- a 82?
CalculatorFeline,
Nie trzeba przypisywać jej do zmiennej, dozwolone są funkcje anonimowe; jeśli jedyną rzeczą do zrobienia w .selectbloku kodu jest dopasowanie go do wyrażenia regularnego, .grepto bardziej odpowiednie; nie trzeba umieszczać nawiasów wokół parametrów ostatniej metody w łańcuchu wywołań; .lengthma krótszy alias .size:->x{x.grep(/^([o-rwetyui]+|[asdfghjkl]+|[zxcvbnm]+)$/).max_by &:size}
manatwork
3

C #, 141/112 / (120 bajtów)

Rywalizuj o najgorszy język golfa, z oczywistych powodów. Używa ustawień regionalnych „my” z qwertz zamiast qwerty, ale w przeciwnym razie działa dobrze.

Pełny program bez:

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

Wyjście tylko bez Where:

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

Tylko wyjście (oryginalne):

Console.WriteLine(a.Where(x=>Regex.IsMatch(x,"^([qwertzuiop]+|[asdfghjkl]+|[yxcvbnm]+)$")).OrderBy(x=>x.Length).Last());
SBI
źródło
1
Wyzwanie mówi, że musisz użyć querty, a ponieważ i tak to kodujesz na stałe, nie widzę żadnego powodu, aby to zmieniać. Możesz także użyć funkcji (może nawet lambda) zamiast pełnego programu do zapisania niektórych bajtów. Jest to zawsze dozwolone, chyba że wyraźnie zabronione w wyzwaniu.
Denker,
Jestem dumny z mojego układu: P, to nie tak, że mam szansę wygrać za pomocą C #. Edytowane w wersji, która jest tylko wyjściem.
SBI,
Added another alternative, using only Last with a predicate instead of using where. This shaves off another 8 bytes.
SBI
2

bash, 105 bytes

And various other utilities, of course.

egrep -x '[wetyuio-r]+|[asdfghjkl]+|[zxcvbnm]+'|awk '{print length($0)"\t"$0;}'|sort -n|cut -f2|tail -n1
Wolfgang
źródło
The awk code can be written shorter as $0=length"\t"$0.
manatwork
2

awk , 92 84 81 bytes

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

saved 3 bytes thanks to @Wolfgang suggestion

Olivier Dulac
źródło
You can subtract a byte by using [wetyuio-r] instead, and also two more by doing /^(expr|expr|expr)$/ instead of `/^expr$|^expr$|^expr$/
Wolfgang
@Wolfgang: thanks for the tip. I tried already the 2nd one and on my awk it gave me the longest word instead of the right one... I'll try again. I agree with the first one though, saves 1 byte
Olivier Dulac
@Wolfgang: hmm, does work this time (I may have fumbled the parenthesis on my own test, friday). I edit your tips in, thanks.
Olivier Dulac
Are you sure the parenthesis around the regular expression are necessary? gawk and mawk are happy without them.
manatwork
@manatwork: the inner ones are necessary, the outer one I prefer to have them to ensure the logic and evaluation order. .. maybe at the "cost" of 2 chars
Olivier Dulac
1

MATL, 54 bytes

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

This works with current version (14.0.0) of the language/compiler.

Input format is (first example)

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

or (second example)

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

Try it online!

Explanation

[]               % 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
Luis Mendo
źródło
1

Perl, 81 bytes

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

Symbol to letter count pretty high.

Dale Johnson
źródło
0

Groovy, 65 characters

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

Sample run:

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

Note that the regular expression used by .grep() not requires anchoring, allowing to spare the grouping too:

groovy:000> ['ab', 'ac', 'bc', 'abc', 'aca', 'bbc'].grep ~/[ac]+|b+/
===> [ac, aca]
manatwork
źródło