Parola Konusunda


10

Gelen Keep Talking ve kimse patlar , oyuncular (manuel ile diğer kişi) kendi "uzmanlar" dan bilgilere dayanarak bomba dağıtılmasında görevli bulunmaktadır. Her bomba, biri parola olabilen, uzmana beş harf uzunluğundaki bu olası parola listesini veren modüllerden oluşur:

about   after   again   below   could
every   first   found   great   house
large   learn   never   other   place
plant   point   right   small   sound
spell   still   study   their   there
these   thing   think   three   water
where   which   world   would   write

Ve oyuncuya paroladaki her yer için 6 olası harf listesi verilir. Olası harf kombinasyonları göz önüne alındığında, doğru şifreyi girin. Giriş herhangi bir makul biçimde olabilir (2B dizi, satırsonu ile ayrılmış dize, vb.) Listeyi / dizeyi / diziyi / şifreleri sıkıştırmak / oluşturmak için kullandığınız kodu azaltabilirsiniz. (Teşekkürler @DenkerAffe)

NOT: Parolalar büyük / küçük harfe duyarlı değildir. Girişin yalnızca bir şifre için çözüleceğini varsayabilirsiniz.

Örnekler / Test Örnekleri

Buraya giriş bir dizeler dizisi olarak gösterilecektir.

["FGARTW","LKSIRE","UHRKPA","TGYSTG","LUOTEU"] => first
["ULOIPE","GEYARF","SHRGWE","JEHSDG","EJHDSP"] => large
["SHWYEU","YEUTLS","IHEWRA","HWULER","EUELJD"] => still


8
Programa giriş olarak olası şifrelerin listesine izin vermenizi öneririm. Aksi takdirde, bu, en iyi dize sıkıştırmasına sahip olan dile gelir.
Denker

5
Değiştirirseniz iyi olur; Umursamadım (gönderimin büyük kısmı değişmeden kalacaktı).
Kapı tokmağı

4
DenkerAffe ile hemfikirim - statik bir listeden ziyade olası parolaların girdi olarak verilmesi çok daha ilginç bir zorluk yaratıyor.
Mego

5
Dizelerin listesini ikinci bir giriş olarak da kullanırsanız, işleri basitleştirebilir, çünkü hangi baytların sayıldığını netleştirir. <Örneğin, Bash çözümümdeki sayımı yapıp yapmayacağımdan emin değildim .
Kapı tokmağı

Yanıtlar:


6

Pyth, 13 bayt

:#%*"[%s]"5Q0c"ABOUTAFTERAGAINBELOWCOULDEVERYFIRSTFOUNDGREATHOUSELARGELEARNNEVEROTHERPLACEPLANTPOINTRIGHTSMALLSOUNDSPELLSTILLSTUDYTHEIRTHERETHESETHINGTHINKTHREEWATERWHEREWHICHWORLDWOULDWRITE"5

Test odası.

 #             filter possible words on
:           0  regex match, with pattern
  %        Q   format input as
    "[%s]"     surround each group of letters with brackets (regex char class)
   *      5    repeat format string 5 times for 5 groups of letters

İlk kod bloğunuzu güncellemeyi unuttunuz: P
Downgoat

@Downgoat Güncellemeyi neyi unuttum? Bana doğru görünüyor.
Kapı tokmağı

Garip, ilk kod bloğu örnekle eşleşmiyor gibi görünüyor (eski bir revizyon gibi mi görünüyor?)
Downgoat


6

Bash, 22 bayt

grep `printf [%s] $@`< <(echo ABOUTAFTERAGAINBELOWCOULDEVERYFIRSTFOUNDGREATHOUSELARGELEARNNEVEROTHERPLACEPLANTPOINTRIGHTSMALLSOUNDSPELLSTILLSTUDYTHEIRTHERETHESETHINGTHINKTHREEWATERWHEREWHICHWORLDWOULDWRITE | sed 's/...../&\n/g')

Şu şekilde çalıştırın:

llama@llama:~$ bash passwords.sh FGARTW LKSIRE UHRKPA TGYSTG LUOTEU
FIRST
      printf [%s] $@    surround all command line args with brackets
grep `              `   output all input lines that match this as a regex
                     <  use the following file as input to grep

Skorunuzda bir fark yok, ama yine de bu golfe dayanamadım:fold -5<<<ABOUTAFTERAGAINBELOWCOULDEVERYFIRSTFOUNDGREATHOUSELARGELEARNNEVEROTHERPLACEPLANTPOINTRIGHTSMALLSOUNDSPELLSTILLSTUDYTHEIRTHERETHESETHINGTHINKTHREEWATERWHEREWHICHWORLDWOULDWRITE|grep `printf [%s] $@`
Dijital Travma

2

JavaScript (ES6), 62 bayt

(l,p)=>p.find(w=>l.every((s,i)=>eval(`/[${s}]/i`).test(w[i])))

Firefox 48 veya önceki sürümlerde 53 bayt:

(l,p)=>p.find(w=>l.every((s,i)=>~s.search(w[i],"i")))

Bu durumda duyarsızlık şartı olmasaydı 49 bayt olurdu:

(l,p)=>p.find(w=>l.every((s,i)=>~s.search(w[i])))


2

Brachylog , 25 bayt

:@laL,["about":"after":"again":"below":"could":"every":"first":"found":"great":"house":"large":"learn":"never":"other":"place":"plant":"point":"right":"small":"sound":"spell":"still":"study":"their":"there":"these":"thing":"think":"three":"water":"where":"which":"world":"would":"write"]:Jm.'(:ImC,L:Im'mC)

Hesaplanmayan baytlar, köşeli parantezler dahil olmak üzere sözcük dizisidir.

açıklama

:@laL                          Unifies L with the input where each string is lowercased
     ,[...]:Jm.                Unifies the Output with one of the words
               '(            ) True if what's in the parentheses is false,
                               else backtrack and try another word
                 :ImC          Unify C with the I'th character of the output
                     ,L:Im'mC  True if C is not part of the I'th string of L

2

Yakut, 48 42 39 bayt

Artık bittiğine göre, Pyth çözümüne çok benziyor, ancak%s temelde doğrudan bir bağlantı noktası olduğu noktaya biçimlendirmeden .

Eğer sonucu sadece çıktı olarak verdiyseniz puts, sizin için bununla ilgileneceğinden [0], sonuna ihtiyacınız yoktur puts.

->w,l{w.grep(/#{'[%s]'*l.size%l}/i)[0]}

Test durumları ile:

f=->w,l{w.grep(/#{'[%s]'*l.size%l}/i)[0]}

w = %w{about after again below could
every first found great house
large learn never other place
plant point right small sound
spell still study their there
these thing think three water
where which world would write}

puts f.call(w, ["FGARTW","LKSIRE","UHRKPA","TGYSTG","LUOTEU"]) # first
puts f.call(w, ["ULOIPE","GEYARF","SHRGWE","JEHSDG","EJHDSP"]) # large
puts f.call(w, ["SHWYEU","YEUTLS","IHEWRA","HWULER","EUELJD"]) # still

1

JavaScript (ES6), 71 bayt

w=>l=>w.filter(s=>eval("for(b=1,i=5;i--;)b&=!!~l[i].indexOf(s[i])")[0])

Kullanımı:

f=w=>l=>w.filter(s=>eval("for(b=1,i=5;i--;)b&=!!~l[i].indexOf(s[i])")[0])
f(array_of_words)(array_of_letters)

1

Python, 64 60 57 bayt

wDize olarak sözcük listesi oluşturmak için kod , kelimeler boşlukla ayrılır (bayt, çözüm kodu uzunluğundan indirgenir):

w="about after again below could every first found great house large learn never other place plant point right small sound spell still study their there these thing think three water where which world would write"

Mevcut çözüm (57 bayt): @RootTwo sayesinde 3 bayt tasarruf

import re;f=lambda a:re.findall("(?i)\\b"+"[%s]"*5%a,w)[0]

Bu işlev, giriş olarak her şifre karakteri için olası harfleri temsil eden tam olarak 5 dizeden tuple(hayır list!) Alır.

İdeone.com'da çalışan bu kodu görün


İkinci sürüm (60 bayt):

import re;f=lambda a:re.findall("\\b"+"[%s]"*5%a+"(?i)",w)[0]

Bu işlev, giriş olarak her şifre karakteri için olası harfleri temsil eden tam olarak 5 dizeden tuple(hayır list!) Alır.

İdeone.com'da çalışan bu kodu görün

İlk sürüm (64 bayt):

import re;f=lambda a:re.findall("\\b["+"][".join(a)+"](?i)",w)[0]

Bu işlev, giriş olarak her parola karakteri için olası harfleri temsil eden tam olarak 5 karakterden oluşan yinelenebilir (örn. listVeya tuple).

İdeone.com'da çalışan bu kodu görün


1
Bu normal "(?i)\\b"+"[%s]"*5%a
ifadeyi

Tabii ki, benim tarafımdan ne kadar açık bir "hata" ... Bunu işaret ettiğiniz için teşekkür ederim @RootTwo, cevabımı düzenledim ve size kredi verdim.
Bayt Komutanı

@ByteCommander Hiç kredi görmüyorum.
Outgolfer Erik

@ ΈρικΚωνσταντόπουλος w=...Kod satırının hemen altında : " Asıl çözüm (57 bayt, @RootTwo sayesinde 3 bayt kurtardı): "
Byte Komutanı

@ByteCommander Belki de bilgisayarımı hazırda bekletme modundan çıktıktan sonra daha önceki bir sürümü önizledim.
Outgolfer Erik

0

Hoon , 125 bayt

|=
r/(list tape)
=+
^=
a
|-
?~
r
(easy ~)
;~
plug
(mask i.r)
(knee *tape |.(^$(r t.r)))
==
(skip pass |*(* =(~ (rust +< a))))

Ungolfed:

|=  r/(list tape)
=+  ^=  a
|-
  ?~  r
    (easy ~)
  ;~  plug
    (mask i.r)
    (knee *tape |.(^$(r t.r)))
  ==
(skip pass |*(* =(~ (rust +< a))))

Hoon'un regex'i yok, sadece bir ayrıştırıcı birleştirici sistemi. Bu, her şeyin çalışmasını oldukça karmaşık hale getirir: (mask "abc")kabaca regex'lere çevirir [abc]ve inşa ettiğimiz ayrıştırıcının çekirdeğidir.

;~(plug a b)altında iki ayrıştırıcının monadik bir bağlamasıdır ++plug, birinci ve daha sonra ikinci ayrıştırmak veya başarısız olursa.

++kneeözyinelemeli bir ayrıştırıcı oluşturmak için kullanılır; *tapesonucun bir türünü ( ) ve gerçek ayrıştırıcıyı oluşturmak için çağrılacak bir geri çağrı veririz . Bu durumda, geri arama "tüm kapatmayı tekrar çağır, ancak listenin kuyruğuyla" dır. ?~Rün testler listesi boş olduğunu ve verir (easy ~)(değil ayrıştırma şeyi ve getiri ~ do) ya da diğerinde ekler maskve tekrar Recurse.

Ayrıştırıcıyı oluşturduktan sonra, onu kullanabiliriz. ++skipişlevin evet için döndüğü listenin tüm öğelerini kaldırır. ++rustöğeyi kuralımızla ayrıştırmaya çalışır unit, ya [~ u=result]da olanı döndürür ~(Haskell'in Belki sürümümüz). 'S Eğer ~(Yok ve kural ya ayrıştırmak başarısız veya tüm içeriğini ayrıştırmak vermedi), sonra fonksiyon döner doğru ve eleman kaldırılır.

Geriye kalan, sadece her harfin verilen listedeki seçeneklerden biri olduğu kelimeyi içeren bir listedir. Parola listesinin zaten adın altındaki bağlamda olduğunu varsayıyorum pass.

> =pass %.  :*  "ABOUT"  "AFTER"   "AGAIN"   "BELOW"   "COULD"
   "EVERY"   "FIRST"   "FOUND"   "GREAT"   "HOUSE"
   "LARGE"   "LEARN"   "NEVER"   "OTHER"   "PLACE"
   "PLANT"   "POINT"   "RIGHT"   "SMALL"   "SOUND"
   "SPELL"   "STILL"   "STUDY"   "THEIR"   "THERE"
   "THESE"   "THING"   "THINK"   "THREE"   "WATER"
   "WHERE"   "WHICH"   "WORLD"   "WOULD"   "WRITE"
   ~  ==  limo
> %.  ~["SHWYEU" "YEUTLS" "IHEWRA" "HWULER" "EUELJD"]
  |=
  r/(list tape)
  =+
  ^=
  a
  |-
  ?~
  r
  (easy ~)
  ;~
  plug
  (mask i.r)
  (knee *tape |.(^$(r t.r)))
  ==
  (skip pass |*(* =(~ (rust +< a))))
[i="STILL" t=<<>>]

0

Python 3, 81 bayt

from itertools import*
lambda x:[i for i in map(''.join,product(*x))if i in l][0]

Dizelerin bir listesini xgirip parolayı döndüren anonim bir işlev .

Olası parolaların listesi lşu şekilde tanımlanır:

l=['ABOUT', 'AFTER', 'AGAIN', 'BELOW', 'COULD',
   'EVERY', 'FIRST', 'FOUND', 'GREAT', 'HOUSE',
   'LARGE', 'LEARN', 'NEVER', 'OTHER', 'PLACE',
   'PLANT', 'POINT', 'RIGHT', 'SMALL', 'SOUND',
   'SPELL', 'STILL', 'STUDY', 'THEIR', 'THERE',
   'THESE', 'THING', 'THINK', 'THREE', 'WATER',
   'WHERE', 'WHICH', 'WORLD', 'WOULD', 'WRITE']

Bu basit bir kaba kuvvettir; Regexes olmadan bunu ne kadar kısa alabileceğimi görmek ilgimi çekti.

Nasıl çalışır

from itertools import*  Import everything from the Python module for iterable generation
lambda x                Anonymous function with input list of strings x
product(*x)             Yield an iterable containing all possible passwords character by
                        character
map(''.join,...)        Yield an iterable containing all possible passwords as strings by
                        concatenation
...for i in...          For all possible passwords i...
i...if i in l           ...yield i if i is in the password list
:[...][0]               Yield the first element of the single-element list containing the
                        correct password and return

Ideone üzerinde deneyin

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.