プログラムはすべての文字の組み合わせ(小文字でも大文字でも構いません)をアルファベット順に印刷する必要があります。で始まりa
、最後に印刷される組み合わせはである必要がありますpassword
。
出力は次のようになります。
a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ... passwora passworb passworc password
プログラムはすべての文字の組み合わせ(小文字でも大文字でも構いません)をアルファベット順に印刷する必要があります。で始まりa
、最後に印刷される組み合わせはである必要がありますpassword
。
出力は次のようになります。
a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ... passwora passworb passworc password
回答:
?a.upto('password'){|c|$><<c+' '}
私は好き'a'.upto('password')
です。それが何をしているかを正確に教えてくれます。Rubyはそのように素晴らしく、表現力豊かです。:D
もちろん、print c,' '
より明確になりますが、使用$>
は2文字短くなります。
$><<[*?a..'password']*' '
これは短くなりますが、すべてのトークンを一度に出力するため、実行に長い時間がかかります!
(?a..'password').to_a
は、短縮できます[*?a..'password']
32文字のソリューション:
$_=a;print$_++,$"until/passwore/
これについて言うことはあまりありません。エントリを区切るためにスペースの代わりに改行を使用できる場合、これを27文字に減らすことができます。
イルマリKaronenは指摘することを..
内部的に呼び出します++
:より良いソリューション(25文字)をだろうので、
print$_,$"for a..password
Perlのコマンドラインオプションを利用して、同等の24文字のソリューションを以下に示します。
perl -l40e 'print for a..password'
perlフラグをカウントするためのルールは、それらに慣れていない人のためにここにあります。
もちろん、Ilmariの21文字のソリューションはまだ短いですが、129,052,722,140文字列の配列を割り当てることができるマシンが必要です。
.$"
代わりに," "
キャラクターを保存しませんか?
<?for($w=a;$w<passwore;)echo$w++,~ß;
エンコードをISO 8859-1に設定し、警告を無効にする必要があります。
$w
は最初に「a」に設定され、「password」の後に最初の値に達するまで増分されます(最後の文字列は出力されません)。
for
ループです。このコードには、ビットごとに反転した空白である最後の2文字を除いて、奇妙なものはありません。とにかく、はい、短い単語までテストしました。
$w<passwore
代わりにを使用して文字を保存できます$w!=passwore
。
aの文字列を基数26の数字として解釈します。a= 1、b = 2、...、z = 26です。
したがって、「パスワード」はN =
16*(26**7) +
1*(26**6) +
19*(26**5) +
19*(26**4) +
23*(26**3) +
15*(26**2) +
18*(26**1) +
4*(26**0)
s = "a"
(つまり:1)を許可し、(N-1)を呼び出すとs.succ!
、sは"password"
(N)になります。つまり、N = 1 +(N-1)です。
より迅速に実行される例では、Nの計算が正しいことを証明するために、"pass"
Nが
16*(26**3) +
1*(26**2) +
19*(26**1) +
19*(26**0)
そして
s = "a"
(N-1).times { s.succ! }
puts s #== "pass"
私たちも印刷したい"a"
ので、
s = "`"
N.times { print(s.succ! + " ") }
完全な「パスワード」に戻ります。N = 129052722140
、出発:
s=?`;0x1e0c2443dc.times{$><<s.succ!+" "}
もっとコンパクトな形を129052722140 == 0x1e0c2443db
探しましたが、見つかりませんでした。
("a"
Caryのおかげで、印刷の不足を修正するために更新されました。)
s=?a
でs.succ!
始まるということでした。
s=?a
、N-1
「b c ... password」を取得します。s =
<バッククォート>とN
、あなたはB「...パスワード」を取得します。SOはで始まる出力を要求しました'a'
。それで全部です。
{∇{'PASSWORD '≡⍞←⍵:→⋄⍵}¨⎕A∘.,⍵}' '
理論的にはPASSWORDまで出力されますが、ZZZZの後にワークスペースがいっぱいになったというエラーが発生しました。5次元配列はすごすぎます。
編集:私は最後にAPLをいじってから長すぎたに違いない。アイデンティティの比較(≡
)を見逃したなんて!!!
{...}
:関数を宣言します。...
⎕A∘.,⍵
:26の大文字のアルファ(⎕A
)と引数(⍵
)
{...}¨
:得られた集合の各要素、プラグその...関数にするため
⍞←⍵
:印刷を行う
'PASSWORD '≡
と比較し、'PASSWORD '
→
:比較(trueを返す場合1
)、プログラムアボート。
⍵
:それ以外の場合は、印刷された文字列を返します。
∇
:最後に、外部関数はそれ自体を再帰します。
(その後、2文字の組み合わせすべてを提供する26アルファと26アルファの間の連結の上で外積を取り、2文字の組み合わせと26アルファの間の連結の上で外積を取ります...中止をトリガーするパスワードに到達)
' '
: スパーク!!それはスペース文字で再帰関数をキックスタートします。
欠如のために'z'+1 == 'aa'
ロジックGolfscriptは、この1を獲得することはできません。
168036262484,(;{27base{96+}%' '+.96?0<*}%
168036262484,
0から168036262483の配列を作成します(;
0を落とす{
.. }%
配列の繰り返し27base
要素をベース27配列に変換します{96+}%
各桁に96を加算します' '+
文字列に変換し、末尾にスペースを追加します.96?0<*
文字96が含まれている場合、文字列をゼロに切り捨てますRubyでは、39 40。
a=&`
0x1e0c2443dc.times{$><<a.succ!+' '}
..or 129052722140
。(編集:以前は持っていました129052722
。切り取りと貼り付けの数字をいくつか失っていました。前のヘックス(0x7B13032
)は間違った数字のためでした。)a=?`
@Doorknobから借用してキャラクターを保存します。
a=?`
、それはちょっと奇妙に見え、最後に余分なスペースがありますが、少なくとも動作します:P
ORD_BASE_ASCII = 'a'.ord-1; def nbr(word); len = word.size; word.split('').inject(0) {|t,c| offset = c.ord - ORD_BASE_ASCII; t + offset*(26**(len -= 1))}; end
いくつかのシーケンスを印刷するだけでこれが正しいことを確認するのは簡単です。
これは、可能な文字として数字を含むソリューションです(「0」、「1」、「2」、..、「passwor9」、「passwora」、「passworb」、「passworc」、「password」)
for(i=-1;i++<1982613533017;console.log(i.toString(36)));
ここにテスト用のフィドルがあります(最後の100回の反復のみで、ブラウザーがロックされないようにします)。
print every **letter** combination
とにかく、キャラクターを保存:{} -> ;