パスワードについて


10

でキープトーキングと誰もが爆発、プレイヤーは自分の「専門家」(手動で他の人)からの情報に基づいて爆弾を融着除去する使命を帯びています。各爆弾はモジュールで構成されており、そのうちの1つはパスワードにすることができます。エキスパートには、すべての5文字の長さの可能なパスワードのリストが提供されます。

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

プレイヤーには、パスワードの各場所で使用可能な6文字のリストが与えられます。可能な文字の組み合わせを考慮して、正しいパスワードを出力します。入力は任意の適切な形式(2D配列、改行で区切られた文字列など)にすることができます。リスト/文字列/配列/パスワードの圧縮/生成に使用するコードを割り引くことができます。(@DenkerAffeに感謝)

注:パスワードは大文字と小文字を区別しません。入力は1つのパスワードに対してのみ解決されると想定できます。

例/テストケース

ここでの入力は、文字列の配列として表されます。

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


8
プログラムへの入力として可能なパスワードのリストを許可することをお勧めします。それ以外の場合、これはどの言語が文字列圧縮に最適かということになります。
— デンカー、2016年

5
変更しても問題ありません。私は気にしません(私の提出の大部分は変更されないままです)。
— ドアノブ

4
私はDenkerAffeに同意します-静的なリストではなく入力として可能なパスワードを指定することは、はるかに興味深い課題になります。
— Mego 2016年

5
文字列のリストを2番目の入力として使用する場合も、どのバイトがカウントされるかが明確になるため、処理が簡単になる場合があります。<たとえば、私のBashソリューションでカウントするかどうかはわかりませんでした。
— ドアノブ

回答:


6

Pyth、13バイト

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

テストスイート。

 #             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

最初のコードブロックを更新するのを忘れました:P
— Downgoat '23

@Downgoat更新を忘れたのは何ですか?それは私には正しいようです。
— ドアノブ

奇妙なことに、最初のコードブロックは例と一致しないようです(古いリビジョンのように見えますか?)
— Downgoat


6

バッシュ、22バイト

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

次のように実行します。

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

それはあなたのスコアに違いはありませんが、私はまだこのゴルフに抵抗できませんでした:fold -5<<<ABOUTAFTERAGAINBELOWCOULDEVERYFIRSTFOUNDGREATHOUSELARGELEARNNEVEROTHERPLACEPLANTPOINTRIGHTSMALLSOUNDSPELLSTILLSTUDYTHEIRTHERETHESETHINGTHINKTHREEWATERWHEREWHICHWORLDWOULDWRITE|grep `printf [%s] $@`
— Digital Trauma '23

2

JavaScript(ES6)、62バイト

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

Firefox 48以前では53バイト:

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

その場合の非感度要件がなければ、49バイトになります。

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


2

Brachylog、25バイト

:@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)

カウントされないバイトは、角かっこを含む単語の配列です。

説明

:@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

ルビー、48 42 39バイト

完了したので、Pythソリューションと非常によく似ていますが、フォーマットはありません%sに、基本的には直接ポートになっています。

で結果を出力するだけの場合は、が処理するので、最後にputsは必要ありません。[0]puts

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

テストケースで:

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バイト

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

使用法:

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バイト

単語リスト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"

現在のソリューション(57バイト): @RootTwoのおかげで3バイト節約

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

この関数は、各パスワード文字の可能な文字を表す正確に5つの文字列のtuple(なしlist!)を入力として受け取ります。

ideone.comで実行されているこのコードを参照してください


2番目のバージョン(60バイト):

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

この関数は、各パスワード文字の可能な文字を表す正確に5つの文字列のtuple(なしlist!)を入力として受け取ります。

ideone.comで実行されているこのコードを参照してください

最初のバージョン(64バイト):

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

この関数は、各パスワード文字の可能な文字を表す正確に5つの文字列の反復可能(listまたはまたはtuple)を入力として受け取ります。

ideone.comで実行されているこのコードを参照してください


1
この正規表現を使用して、保存の3バイト:"(?i)\\b"+"[%s]"*5%a
— RootTwo

もちろん、私の側からの明らかな「間違い」... @RootTwoを指摘してくれてありがとう、私は私の回答を編集してクレジットを与えました。
— バイトコマンダー

@ByteCommanderクレジットがまったく表示されません。
— Erik the Outgolfer 2016年

@ΈρικΚωνσταντόπουλος w=...コード行のすぐ下:「実際のソリューション(57バイト、 @ RootTwoのおかげで3バイト節約):」
— Byte Commander

@ByteCommanderおそらく、PCを休止状態から復帰させた後、以前のバージョンをプレビューしました。
— Erik the Outgolfer 2016年

0

フーン、125バイト

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

非ゴルフ:

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

Hoonには正規表現はありません。パーサーコンビネーターシステムのみです。これにより、すべてを機能させるのがかなり複雑になります。(mask "abc")大まかに正規表現に変換され[abc]、私たちが構築しているパーサーのコアです。

;~(plug a b)は、の下の2つのパーサーのモナディックバインドで++plug、最初と2番目のパーサーを解析する必要があります。

++knee再帰的なパーサーを構築するために使用されます。*tape結果のタイプ()と、実際のパーサーを生成するために呼び出すコールバックを指定します。この場合、コールバックは「クロージャー全体をもう一度呼び出しますが、代わりにリストの末尾を使用して」です。?~ルーンのテストは、リストが空である、となります(easy ~)(ないパース何とリターン〜を行う)、または別に追加されますmaskて、再び再帰。

パーサーを作成したら、それを使用することができます。++skip関数がyesを返すリストのすべての要素を削除します。++rustルールを使用して要素を解析し、unitいずれ[~ u=result]かである~(HaskellのMaybeのバージョン)を返します。そうである場合~(なし、およびルールが解析に失敗したか、コンテンツ全体を解析しなかった場合)、関数はtrueを返し、要素は削除されます。

残っているのはリストで、各文字がリスト内のオプションの1つである単語のみが含まれています。私は、パスワードのリストが名前の下のコンテキストにすでにあると想定しています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バイト

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

文字列のリストの入力を受け取りx、パスワードを返す無名関数。

可能なパスワードのリストlは次のように定義されます。

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']

これは単純な力です。正規表現なしでこれがどれだけ短いかを知りたいと思っていました。

使い方

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

イデオーネでお試しください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.