Qwerty klavyesinin tek bir satırını kullanarak en uzun kelime


30

Qwerty klavyenin üç sıra vardır qwertyuiop, asdfghjklve zxcvbnm. Görevin, verilen bir kelime listesinden sadece bir satır klavyeyle yazılabilecek en uzun kelimeyi bulmak.

Örnek giriş 1

artist
home
gas
writer
geology
marine
twerp

Çıktı

writer

(Verilen kelimeleri arasında yalnızca gas, writerve twerptek bir satır kullanarak yazılı ve edilebilmektedir writeren uzun)

Sözcükler gerçek kelimeler olmayabilir (bu nedenle üçüncü sıranın geçersiz olduğunu varsaymayın). Ancak, her zaman tam olarak bir cevap olacağını varsayabilirsiniz (daha fazla değil, daha az değil).

Örnek giriş 2

wrhuji
bxnzmmx
gllwssjjd
vnccbb
lrkjhgfdsa
tttttt

Çıktı

bxnzmmx

Ek noktalama işaretleri ve boşluklar girişte sağlanabilir (dil gereksinimlerine göre). Ancak, fazladan bir çıktı verilmemelidir. Giriş ve çıkış küçük harflerdir. En kısa kod kazanır.


@ MartinBüttner Bunun Retina ile nasıl çözülebileceğini gerçekten görmek istiyorum. Kolayca yapıldığını mı düşünüyorsun?
Jerry Jeremiah

Giriş kelimeleri her zaman küçük harfli midir?
nimi 17:16,

@nimi Evet, onlar.
ghosts_in_the_code

@ghosts_in_the_code Açıklığa kavuşturma konusunda şunu söylemelisiniz
Luis Mendo

Yanıtlar:


18

Python 2, 84 bayt

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

Yayılan maxklavyenin daha az klavye satırına göre, daha sonra artan uzunluklarla karşılaştırarak girişin değerini bulur . Klavye satır değeri tarafından ayıklanır "asdfghjklzxcvbnm".find(c)/9orta satır ulaştıracak olan 0, alt satır 1için, ve hariçtir üst satırı, -1çünkü findverir -1eksik değerler için.

Diğer girişimler:

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 için 1 karakter daha;)
Antti Haapala

6
Ben arasında hiçbir boşluk için izin verilen dilbilgisi bilmiyordum 9ve for...
jogloran

Bu benim en sevdiğim cevabı.
SBI

1
@jogloran kadar uzun characther bir olmadığı için Eya eyapabilecekleriniz, hemen hemen her zaman bir sayı ve değişken adı / anahtar kelime arasındaki boşluk kaldırmak
wnnmaw

@wnnmaw Artık Python'un daha yeni sürümleri 4if 0else 2için geçerli değil , örneğin 2.7.11 ve 3.5.1'de geçerlidir (ve muhtemelen önceki birkaç sürüm için geçerliydi)
Sp3000,

13

Japt, 32 30 bayt

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

Çevrimiçi test edin! Giriş bir dizi dizisidir.

Nasıl çalışır

;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, az önce Dennis'i mi kazdın?
Morgan Thrapp

1
Bu
Adnan

2
Eğer var mı "QWERTYUIOP\nASDFGHJKL\nZXCVBNM"aa önceden tanımlanmış değişmez? İyi oynadı :-)
Luis Mendo

1
Ben belirtilmektedir nerede bulmak için görünmüyor olabilir Dayarlandığında QWERTYUIOP\nASDFGHJKL\nZXCVBNM, sen başvurmak bile sayfa durumuna görünüyorVariables <...> D 13
sukhmel

1
Programın ;başında @sukhmel A değişkenleri A-Lçeşitli değerlere sıfırlar . Dklavye dizesine ayarlanır. Daha fazla bilgiyi burada bulabilirsiniz .
ETHproductions

11

Python 2.5+ ve 3, 93 bayt

Bu yaklaşım için kaç vuruş denemek zorunda kaldı; bu, yalnızca b'de meydana gelen karakterlerden oluşuyorsa a.strip(b)boş dizgeyle sonuçlanan gerçeğini kullanır a.

İşlev, dizelerin listesini alır ve bir dize döndürür.

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

5
PPCG'ye hoş geldiniz, ilk mesajınız :)
FryAmTheEggman

keyDeğişken neden orada? Sanırım çıkarabilirsin.
Hesap MakinesiFeline

@CatsAreFluffy hayır, bu mümkün değil. keyargümanı maxfonksiyonu kelime salt yazılır.
Antti Haapala

Ack, kwargs'ı unuttum.
Hesap MakinesiFeline

8

Retina , 73 bayt

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

Çevrimiçi deneyin!

Sonuç: Retina'nın bir sıralama aşamasına ihtiyacı var.

açıklama

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

Bu bir grep aşamasıdır: sadece regex ile eşleşen çizgileri tutar. Yani sadece bu karakter sınıflarından birinden oluşanlar.

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

Şimdi sadece geriye kalan karakter dizilerinin en büyüğünü bulmamız gerekiyor. Bunu, en azından ondan sonraki kelimelerden daha uzun olan tüm kelimeleri eşleştirerek yapıyoruz. Bu 1, Retina'ya (iki gün önce yayınlandı) yeni bir eklentidir ve bu maç aşamasını sadece ilk karşılaşmayı dikkate alarak sınırlar. Ve !Retina'ya maçı basmasını söyler (saymak yerine).


Bu havalı! Bazen dengeli gruplara bakmak zorunda kalacağım. Yine de anlaşılması zor görünüyor. Ben denedim bu (ve o inşaat gibi görünüyor), ama yaratacak tür şey görmek Cevabınız için beklemek istedim.
daavko

@daavko Kendi kendine terfi için özür dilerim, ancak Dengeleme gruplarındaki Stack Overflow yazımı okudunuz mu? Bana bunun iyi bir giriş olduğunu söylediler. Konseptin kendisi o kadar karmaşık değil, özellikle (?<a-b>...)de kod golfünde nadiren gerekli olan sözdizimini kullanmıyorsanız .
Martin Ender

Bu yazıyı gördüğümü sanmıyorum. Büyük olasılıkla Yığın Taşması'na sıklıkla göz atmıyorum. Bağlantı için teşekkürler, yer imlerine ekleyip okuyacağım.
daavko

1
Muhtemelen bir yorum için konu dışı, ancak dengeleme grupları hakkındaki bilgilerimin% 100'ü yayınınızı okumaktan geliyor. Bence, istediğin zaman kendini tanıtmayı başarabilirsin, bu çok yardımcı olur :) Her neyse, konuyla ilgili daha fazla, sahne çalışmasını en uzun girişe satır koymak için <code> O-1`. * </code> gibi bir şey sıralayabilir mi? Belki harf çevirisi gibi çalışmalı ve birden fazla geri tepme ayrılmış bölgeye, bölünecek bir regex'e ve bir tane saymaya sahip olmalı? Aslında belki bu da sohbete aittir ... ¯_ (ツ) _ / ¯
FryAmTheEggman

Asla düşünmezdim o-r, harika.
Emanuel Vintilă

6

Java, 154 142 veya 142 130 bayt

Çünkü biliyorsun Java.

Karşılaştırma için C # .

Girdi ile ayrılan değerlerin tek bir dize olması gerekiyorsa, 146 bayt \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()

Girdiyi String [] olarak kabul edebilirsem, 134 bayt:

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

Biraz ungolfed:

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

İkinci lambda bir Function<String[],String>.


Güncellenmiş versiyonum şimdi kısa bir lambdayı tam bir program olarak bile yeniyor :)
SBI

@SBI Laneti Java'nın uzun yöntem çağrıları! (Hepsi iyi eğlenceler)
89

Kendimi bir Java geliştiricisi olarak, aynı zamanda özlü olmayı başaran bir ayrıntılı dil görmek :):
SBI

Bir girdi varsayımı yapacaksak, bize en çok yardımcı olanı yapalım, girdi bir Liste olarak geliyor <String>: l->l.stream().filter(g->g.matches("[wertyuio-r]*|[asdfghjkl]*|[zxcvbnm]*")).max((a,b)->a.length()-b.length()).get()(116 karakter)
Andreas

@Andreas Son meta tartışmamda olduğu gibi , bir lambda bir Liste alırsa import java.util.*;, bayt sayımına dahil etmeniz gerekir ; yani, bir listeyi alarak bir Listeyi alarak -16 bayttır, ancak Listeyi almak için +19'dur. Ancak, orada -7 bayt kazanmak maxyerine kullanarak yakaladın reduce.
CAD

4

Jöle, 40 34 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

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 sayesinde 5 bayt kurtardı.
PM 2Ring sayesinde 3 byte kurtarıldı.
Antti Haapala sayesinde 3 bayt kurtarıldı.

Şu anda zorla Brute. Kelimeleri yalnızca tek bir satırın içerdiği kelimelere göre filtrelendiriyorum ve sonra maksimum dize uzunluğu için sıralıyorum.

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

Test durumları:

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 bayt

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

Komut satırı argümanları üzerinden girdi alır $args, daha sonra yalnızca bir klavye satırından oluşan sözcükleri seçmek için -matchişleci bir regex ile kullanır . Bu sonuçları Sort-Objectmülkiyete göre sıralıyoruz Length. Bunu yapabiliriz, çünkü PowerShell'deki dizelerin tümü sıralanabilir özellik olarak System.Stringdahil .Lengthedilen türdedir. Bu, dizeleri uzunluğa göre artan bir sıraya göre sıralar, bu yüzden sonuncuyu [-1]boru hattında bırakırız ve çıktısı örtüktür.

Örnek

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

3

Pyth, 45 35 bayt

@FryAmThe ​​Eggman'e, bana bazı baytları kaydettiği için teşekkürler!

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

Burada dene!

Sözcük listesi olarak girdi alır.

açıklama

elDf} k-LTc. "..." \ `Q # Q = tüm giriş kelimelerinin listesi

   f Q # lambda değişkeni olarak T ile filtre girişi
         c. "..." \ `# Tüm klavye satırlarının listesi
      -LT # Geçerli girdi satırındaki tüm harfleri geçerli girdiden kaldır
                      # kelime. 3 string listesindeki sonuçlardan biri boş olduğunda
                      # kelime bir satır ile yazılabilir
    } k # Listede bir boş dizge içerip içermediğini kontrol et
eld # order sonuç listesi uzunluğa göre ve sonuncuyu al

3

Ruby, 88 82 69

Dizelerin bir listesini alma iznim yoksa ve çok satırlı bir dize almam gerekiyorsa, puana +12 ekleyin .split('\n')ve .grepçağrıdan hemen önce ekleyin .

Bana Ruby'de stab lambdaları ve manat işlerinden daha fazla optimizasyon öğrettiğin için teşekkürler CatsAreFluffy

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

Hayır, .split('\n')önce eklersiniz .select, değil mi? Ve neden stabby lambda yok?
Hesap MakinesiFeline

Bahsettiğin zamana kadar, şu ana kadar stab lambda'yı bilmiyordum. Teşekkürler!
Value Ink

-88- ve 82 arasında bir boşluk ekleyebilir misiniz?
Hesap MakinesiFeline

Bir değişkene atamanıza gerek yok, adsız işlevlere izin verilir; .selectkod bloğu içinde yapılacak tek şey, onu normal ifadeyle eşleştirmekse .grepdaha uygundur; bir çağrı zincirindeki son yöntemin parametreleri etrafına parantez koymaya gerek yok; .lengthdaha kısa bir takma adı var .size:->x{x.grep(/^([o-rwetyui]+|[asdfghjkl]+|[zxcvbnm]+)$/).max_by &:size}
manatwork

3

C #, 141/112 / (120 bayt)

En kötü golf dili yarışmacısı, bariz sebeplerden dolayı. Qwerty yerine qwertz ile "my" yerel ayarını kullanır, ancak aksi halde iyi çalışır.

Nerede olmadan tam program:

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

Sadece Where olmadan çıktı:

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

Sadece çıktı (orijinal):

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

1
Zorluk, querty kullanmanız gerektiğini söylüyor ve bunu zaten kodladığınız için bunu değiştirmek için hiçbir neden göremiyorum. Ayrıca bazı baytları kaydetmek için tam bir program yerine bir işlev (belki bir lambda) kullanabilirsiniz. Mücadelede açıkça yasaklanmadıkça, buna her zaman izin verilir.
Denker

Düzenimle gurur duyuyorum: P, yine de C # kullanarak kazanma şansım olmadı. Sadece çıktı olan bir sürümde düzenlenmiş.
SBI

Başka bir alternatif eklendi, nerede kullanılacağını kullanmak yerine yalnızca Son Kullanarak bir Son Kullanarak. Bu, 8 bayttan daha fazla tıraş eder.
SBI

2

bash, 105 bayt

Ve elbette, çeşitli diğer kamu hizmetleri.

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

awkKod olarak daha kısa yazılabilir $0=length"\t"$0.
Manat çalışması

2

awk, 92 84 81 bayt

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

@Wolfgang önerisi sayesinde 3 bayt kurtarıldı


Bunun [wetyuio-r]yerine bir bayt çıkarabilir ve ayrıca /^(expr|expr|expr)$/`/ ^ expr $ | ^ expr $ | ^ expr $ / yerine iki tane daha yapabilir
Wolfgang

@Wolfgang: Bahşiş için teşekkürler. Ben zaten 2. olanı denedim ve awk'imde bana doğru olanın yerine en uzun kelimeyi verdi ... tekrar deneyeceğim. İlki ile aynı fikirdeyim, 1 bayt kazandırıyor
Olivier Dulac

@Wolfgang: hmm, bu sefer çalışıyor (cuma günü kendi sınavıma parantezi karıştırmış olabilirim). İpuçlarınızı düzenledim, teşekkürler.
Olivier Dulac

Normal ifadenin etrafındaki parantezin gerekli olduğundan emin misiniz? gawkve mawkonlarsız mutluyuz.
Manat çalışması

@ yönetim: iç olanlar gereklidir, dış olanlar mantık ve değerlendirme sırasını sağlamak için onlara sahip olmayı tercih ederim. .. belki 2 karakter "pahasına"
Olivier Dulac

1

MATL , 54 bayt

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

Bu , dilin / derleyicinin geçerli sürümüyle (14.0.0) çalışır .

Giriş formatı (ilk örnek)

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

veya (ikinci örnek)

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

Çevrimiçi deneyin!

açıklama

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

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

Harf sembolü oldukça yüksek saymak.


0

Harika, 65 karakter

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

Örnek çalışma:

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

Tarafından kullanılan normal ifadenin .grep(), gruplamayı da boşa bırakmaya izin veren sabitleme gerektirmediğini unutmayın :

groovy:000> ['ab', 'ac', 'bc', 'abc', 'aca', 'bbc'].grep ~/[ac]+|b+/
===> [ac, aca]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.