Parola più lunga usando una singola riga della tastiera qwerty


30

Le tre righe della tastiera qwerty sono qwertyuiop, asdfghjkle zxcvbnm. Il tuo compito è trovare la parola più lunga che può essere digitata usando solo una riga della tastiera, da un determinato elenco di parole.

Esempio di input 1

artist
home
gas
writer
geology
marine
twerp

Produzione

writer

(Delle parole date, solo gas, writere twerppuò essere scritto usando una singola riga, ed writerè il più lungo)

Le parole potrebbero non essere parole reali (quindi non dare per scontato che la terza riga non sia valida). Tuttavia, puoi presumere che ci sarà sempre esattamente una risposta (niente di più, niente di meno).

Esempio di input 2

wrhuji
bxnzmmx
gllwssjjd
vnccbb
lrkjhgfdsa
tttttt

Produzione

bxnzmmx

Punteggiatura aggiuntiva e spazi bianchi possono essere forniti in input (secondo i requisiti della lingua). Tuttavia, non deve essere fornito alcun output aggiuntivo. Ingresso e uscita sono in minuscolo. Il codice più corto vince.


@ MartinBüttner Mi piacerebbe davvero vedere come questo potrebbe essere risolto con Retina. Pensi che sia fatto facilmente?
Jerry Jeremiah,

Le parole di input sono sempre in minuscolo?
nimi

@nimi Sì, lo sono.
ghosts_in_the_code

@ghosts_in_the_code Dovresti dichiararlo nella sfida per la chiarezza
Luis Mendo

Risposte:


18

Python 2, 84 byte

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

Trova l' maxinput, confrontandolo con un minor numero di righe della tastiera, quindi in lunghezza crescente. Il valore della riga della tastiera viene estratto da "asdfghjklzxcvbnm".find(c)/9, che porta alla riga centrale 0, alla riga inferiore a 1e alla riga superiore, che è esclusa, a -1, poiché findfornisce -1valori mancanti.

Altri tentativi:

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
1 /personaggio in più per Python 3;)
Antti Haapala

6
Non sapevo che la grammatica non consentisse spazi bianchi tra 9e for...
Jogloran,

Questa è di gran lunga la mia risposta preferita.
SBI

1
@jogloran, fintanto che il carattere non è un Eo e, puoi praticamente rimuovere sempre lo spazio tra un numero e un nome / parola chiave variabile
wnnmaw

@wnnmaw Questo non è più vero per le versioni più recenti di Python, ad esempio 4if 0else 2è valido in 2.7.11 e 3.5.1 (e probabilmente è stato valido per alcune versioni precedenti)
Sp3000

13

Japt, 32 30 byte

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

Provalo online! L'input è una matrice di stringhe.

Come funziona

;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
Woah, hai appena superato Dennis?
Morgan Thrapp,

1
Sarà difficile da battere
Adnan,

2
Hai "QWERTYUIOP\nASDFGHJKL\nZXCVBNM"un valore letterale predefinito? Ben suonato :-)
Luis Mendo il

1
Non riesco a trovare dove si dice che Dè impostato QWERTYUIOP\nASDFGHJKL\nZXCVBNM, anche la pagina a cui ti riferisci sembra dichiarareVariables <...> D 13
sukhmel

1
@sukhmel A ;all'inizio del programma reimposta le variabili A-Lsu vari valori. Dè impostato sulla stringa di tastiera. Puoi trovare maggiori informazioni qui .
ETHproductions

11

Python 2.5+ e 3, 93 byte

Ho dovuto testare quanti colpi per questo approccio; questo utilizza il fatto che a.strip(b)risulta in una stringa vuota se è acostituito esclusivamente da caratteri presenti in b.

La funzione accetta un elenco di stringhe e restituisce una stringa.

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

5
Benvenuti in PPCG, bel primo post :)
FryAmTheEggman

Perché la keyvariabile è lì? Penso che puoi rimuoverlo.
CalculatorFeline

@CatsAreFluffy no, non è possibile. l' keyargomento della maxfunzione è solo parola chiave.
Antti Haapala,

Ack, mi sono dimenticato di Kwargs.
Calcolatrice

8

Retina , 73 byte

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

Provalo online!

Conclusione: Retina ha bisogno di una fase di selezione.

Spiegazione

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

Questo è uno stadio grep: mantiene solo le linee che sono abbinate al regex. Cioè quelli che sono formati esclusivamente da una di quelle classi di caratteri.

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

Ora dobbiamo solo trovare la più grande delle stringhe rimanenti. Lo facciamo abbinando tutte le parole che sono almeno lunghe quanto tutte le parole che seguono. Si 1tratta di una nuova aggiunta a Retina (rilasciata due giorni fa), che limita questa fase della partita a considerare solo la prima di tali partite. E !ordina a Retina di stampare la corrispondenza (invece di contarla).


Questo è fantastico! Dovrò guardare gruppi equilibrati qualche volta. Anche se sembrano difficili da capire. Ho provato questo (e sembra che funzioni), ma volevo aspettare la tua risposta per vedere che tipo di cose creerai.
Daavko,

@daavko Ci scusiamo per l'autopromozione, ma hai letto il mio post Stack Overflow su gruppi di bilanciamento ? Mi è stato detto che è una buona introduzione. Il concetto in sé non è poi così complicato, soprattutto se non si utilizza la (?<a-b>...)sintassi che è raramente necessaria nel code golf.
Martin Ender,

Non credo di aver visto quel post. Molto probabilmente perché non sfoglio spesso Stack Overflow. Grazie per il link, lo aggiungerò ai segnalibri e lo leggerò.
Daavko,

1
Probabilmente fuori tema per un commento, ma praticamente il 100% della mia conoscenza dei gruppi di bilanciamento deriva dall'aver letto il tuo post. Penso che tu possa auto-promuoverlo in qualsiasi momento, è di grande aiuto :) Comunque, più sull'argomento, ordinerebbe il lavoro sul palcoscenico qualcosa come <code> O-1`. * </code> per ottenere la linea con l'input più lungo? Forse dovrebbe funzionare come traslitterazione e avere più di una regione separata di backtick, una regex su cui dividere e una su cui contare? In realtà forse questo appartiene anche alla chat ... ¯ _ (ツ) _ / ¯
FryAmTheEggman

Non ci avrei mai pensato o-r, fantastico.
Emanuel Vintilă,

6

Java, 154 142 o 142 130 byte

Perché, sai, Java.

C #, per confronto .

146 byte se l'input deve essere una singola stringa con valori separati da \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 byte se posso assumere invece input come String []:

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

Leggermente non golfato:

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

La seconda lambda è a Function<String[],String>.


La mia versione aggiornata ora batte persino la lambda più corta come programma completo :)
SBI

Invocazioni di metodi lunghi di @SBI Curse Java! (Tutto molto divertente)
CAD97

Essendo anch'io uno sviluppatore Java, è bello vedere un linguaggio dettagliato che riesce a essere conciso allo stesso tempo :)
SBI

Se stiamo per fare un presupposto di input, facciamo quello che ci aiuta di più, l'input arriva come Elenco <String>: l->l.stream().filter(g->g.matches("[wertyuio-r]*|[asdfghjkl]*|[zxcvbnm]*")).max((a,b)->a.length()-b.length()).get()(116 caratteri)
Andreas

@Andreas Secondo la mia recente meta discussione , se un lambda prende un Elenco, devi includerlo import java.util.*;nel conteggio dei byte, il che significa che prendere un elenco è -16 byte prendendo un Elenco ma +19 per importare l'Elenco. TUTTAVIA, ci sei riuscito lì usando maxinvece di reduceper un guadagno di -7 byte.
CAD97,

4

Gelatina, 40 34 byte

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

Provalo online!

Come funziona

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

5 byte salvati grazie a Kevin.
Salvato 3 byte grazie a PM 2Ring.
Salvato 3 byte grazie ad Antti Haapala.

Bruto forzandolo al momento. Filtra le parole solo per quelle contenute in una singola riga, quindi ordina per la lunghezza massima della stringa.

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

Casi test:

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 byte

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

Accetta input tramite argomenti della riga di comando come $args, quindi utilizza l' -matchoperatore con una regex per selezionare solo le parole composte esclusivamente da una riga della tastiera. Inoltriamo tali risultati in Sort-Objectquel tipo dalla proprietà Length. Possiamo farlo poiché le stringhe in PowerShell sono tutte del System.Stringtipo, che include .Lengthcome proprietà ordinabile. Questo ordina le stringhe in ordine crescente per lunghezza, quindi prendiamo l'ultima con [-1], la lasciamo sulla pipeline e l'output è implicito.

Esempio

PS C:\Tools\Scripts\golfing> .\longest-word-qwerty-keyboard.ps1 asdf qwe zxc typewriter halls establishment
typewriter

3

Pyth, 45 35 byte

Grazie a @FryAmThe ​​Eggman per avermi salvato alcuni byte!

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

Provalo qui!

Accetta input come un elenco di parole.

Spiegazione

elDf} k-LTc. "..." \ `Q # Q = elenco di tutte le parole di input

   f Q # Filtro di input con T come variabile lambda
         c. "..." \ `# Elenco di tutte le righe della tastiera
      -LT # Rimuove tutte le lettere della riga di input corrente dall'input corrente
                      # parola. Risultati in un elenco di 3 stringhe con una vuota se
                      # la parola può essere digitata con una riga
    } k # Verifica se l'elenco contiene una stringa emtpy
elD # ordina l'elenco dei risultati per lunghezza e accetta l'ultimo

3

Ruby, 88 82 69

Se non mi è permesso prendere un elenco di stringhe e devo prendere una stringa su più righe, aggiungi +12 al punteggio e aggiungi .split('\n')subito prima della .grepchiamata.

Grazie CatsAreFluffy per avermi insegnato a proposito di stabby lambdas in Ruby e ulteriori ottimizzazioni dal manatwork

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

No, aggiungi .split('\n')prima del .select, giusto? E perché nessun stabby lambdas?
Calcolatrice

Non sapevo del stabby lambda fino a poco fa, quando lo hai menzionato. Grazie!
Value Ink

Puoi aggiungere uno spazio tra -88- e 82?
CalculatorFeline

Non è necessario assegnarlo a una variabile, sono consentite funzioni anonime; se l'unica cosa da fare all'interno .selectdel blocco di codice è abbinarlo a un'espressione regolare, .grepè più adatto; non c'è bisogno di mettere la parentesi attorno ai parametri dell'ultimo metodo in una catena di chiamate; .lengthha una più breve alias, .size:->x{x.grep(/^([o-rwetyui]+|[asdfghjkl]+|[zxcvbnm]+)$/).max_by &:size}
manatwork

3

C #, 141/112 / (120 byte)

Concorrente per il peggior linguaggio del golf, per ovvi motivi. Usa la "mia" localizzazione con qwertz invece di qwerty, ma per il resto funziona bene.

Programma completo senza dove:

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

Uscita solo senza Dove:

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

Solo uscita (originale):

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

1
La sfida dice che devi usare querty e dato che lo stai codificando comunque, non vedo alcun motivo per cambiarlo. Inoltre puoi usare una funzione (forse anche una lambda) invece di un programma completo per salvare alcuni byte. Ciò è sempre consentito se non esplicitamente vietato nella sfida.
Denker,

Essere orgogliosi del mio layout: P, non è che io abbia la possibilità di vincere comunque usando C #. Modificato in una versione che è solo l'output.
SBI

Aggiunta un'altra alternativa, utilizzando solo Last con un predicato anziché utilizzare where. Ciò si rade di altri 8 byte.
SBI

2

bash, 105 byte

E varie altre utilità, ovviamente.

egrep -x '[wetyuio-r]+|[asdfghjkl]+|[zxcvbnm]+'|awk '{print length($0)"\t"$0;}'|sort -n|cut -f2|tail -n1

Il awkcodice può essere scritto più breve come $0=length"\t"$0.
arte

2

awk, 92 84 81 byte

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

salvato 3 byte grazie al suggerimento di @Wolfgang


Puoi invece sottrarre un byte usando [wetyuio-r]invece, e anche altri due facendo /^(expr|expr|expr)$/invece di `/ ^ expr $ | ^ expr $ | ^ expr $ /
Wolfgang

@ Wolfgang: grazie per il suggerimento. Ho già provato il secondo e sul mio awk mi ha dato la parola più lunga invece di quella giusta ... Ci riproverò. Sono d'accordo con il primo però, salva 1 byte
Olivier Dulac il

@ Wolfgang: hmm, questa volta funziona (potrei aver frugato la parentesi sul mio test venerdì). Modifica i tuoi consigli, grazie.
Olivier Dulac il

Sei sicuro che siano necessarie le parentesi attorno all'espressione regolare? gawke mawksono felici senza di loro.
arte

@manatwork: quelli interni sono necessari, quello esterno preferisco averli per garantire la logica e l'ordine di valutazione. .. forse al "costo" di 2 caratteri
Olivier Dulac il

1

MATL , 54 byte

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

Funziona con la versione corrente (14.0.0) del linguaggio / compilatore.

Il formato di input è (primo esempio)

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

o (secondo esempio)

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

Provalo online!

Spiegazione

[]               % 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 byte

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

Il simbolo per il conteggio delle lettere è piuttosto elevato.


0

Groovy, 65 caratteri

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

Esecuzione di esempio:

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

Si noti che l'espressione regolare utilizzata .grep()non richiede l'ancoraggio, consentendo anche di risparmiare il raggruppamento:

groovy:000> ['ab', 'ac', 'bc', 'abc', 'aca', 'bbc'].grep ~/[ac]+|b+/
===> [ac, aca]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.