“Şifre” kelimesi bulunana kadar kaba kuvvet harf kombinasyonu yapan bir program yazın


16

Program her harf kombinasyonunu (küçük harf veya büyük harf, önemli değil) alfabetik sırada yazdırmalıdır. İle başlamalı ave son yazdırılan kombinasyon olmalıdır password.

Çıktı şöyle olmalıdır:

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

2
Ayırıcılar boşluk olmalı mı yoksa yeni satırlar kullanabilir miyim?
Ilmari Karonen

Evet yapabilirsiniz, bu sadece küçük bir değişikliktir.
ST3

Yanıtlar:


32

Perl, 19 karakter

say for a..password

Yeni satırları yukarıdaki açıklamalara göre sınırlayıcılar olarak kullanır. Perl 5.10+ özelliğini etkinleştirmek için perl -M5.010(veya yalnızca perl -E 'say for a..password') ile çalıştırın say. Meta başına , bu ekstra karakter olarak sayılmaz.

(Sınırlayıcı olarak boşluklarda ısrar ederseniz $,=$";say a..password, sadece iki karakter daha uzundur. Ancak, yazdırılmadan önce tüm listeyi oluşturmaya çalıştığından, uygulamada kullanılamaz olma noktasına kadar çok yavaş ve boşa harcanır.)


18

Ruby, 33 karakter (en iyi fakat daha uzun sürüm)

?a.upto('password'){|c|$><<c+' '}

Seviyorum 'a'.upto('password'); tam olarak ne yaptığını anlatıyor . Ruby harika ve etkileyici.:D

Tabii ki, print c,' 'çok daha net olurdu, ancak kullanmak $>iki karakter daha kısadır.

Ruby, 29 25 karakter (yavaş sürüm)

$><<[*?a..'password']*' '

Bu daha kısa, ancak tüm jetonları bir kerede yazdırıyor, bu yüzden çalıştırmak uzun, uzun zaman alıyor!


1
Güzel, özellikle ilk.
Cary Swoveland

Yavaş versiyonda, (?a..'password').to_akısaltılabilir[*?a..'password']
Paul Prestidge

6

Perl, 33 32 24 karakter

32 karakterden oluşan bir çözüm:

$_=a;print$_++,$"until/passwore/

Bu konuda söylenecek çok şey yok. Girişleri ayırmak için boşluk yerine satırsonu kullanabilirsem bunu 27 karaktere düşürebilirim.

Ilmari Karonen işaret olduğunu ..içten çağıran ++daha iyi bir çözüm (25 karakter) olacağını, böylece:

print$_,$"for a..password

Perl'in komut satırı seçeneklerinden yararlanarak, 24 karakterlik eşdeğer bir çözüm aşağıdadır:

perl -l40e 'print for a..password'

Perl bayraklarını saymak için kurallar burada, onlara aşina olmayanlar için.

Tabii ki, Ilmari'nin 21 karakterlik çözümü hala daha kısadır, ancak 129.052.722.140 dizeden oluşan bir dizi ayırabilen bir makine gerektirir.


Olmaz mıydı .$"yerine ," "bir karakter kaydetme?
Bay Llama

Evet, benim tarafımdan tam gözetim. Teşekkürler.
breadbox

6

Perl 6, 20 karakter

say "a".../password/

Başka şeylere ihtiyacın yok


5

Python 2, 91

b=lambda n:n*' 'and b(n/26-(n%26<1))+chr(~-n%26+97)
i=0
exec"i+=1;print b(i);"*129052722140

4

PHP 38 37 36 karakter

<?for($w=a;$w<passwore;)echo$w++,~ß;

Kodlamayı ISO 8859-1 olarak ayarlamanız ve uyarıları devre dışı bırakmanız gerekir.


Bunu test etmedim, ama bunu gerçekten yapıyor mu ???
ST3

@ ST3 Basit bir döngü. Değişken $wbaşlangıçta 'a' olarak ayarlanır ve daha sonra 'parola'dan sonra ilk değere ulaşana kadar artırılır (son dize yazdırılmaz).
lortabac

3
@ ST3 Düzenli bir fordöngüdür. Bu kodda, biraz ters çevrilmiş boşluk olan son 2 karakter dışında garip bir şey yoktur. Her neyse, evet, daha kısa bir kelimeyle test ettim.
lortabac

1
@ ST3 İşte bir test gelen passwoqsetmek password. Kodlama kodlaması ISO 8859-1 olmadığı için bir boşluk ile değiştirmek zorunda kaldım .
lortabac

1
$w<passworeYerine bir karakter kaydedebilirsiniz $w!=passwore.
Terbiyeli Dabbler

2

Ruby (40 karakter)

Az harfli bir dizeyi 26 tabanındaki sayı olarak a = 1, b = 2, ..., z = 26 ile yorumlayın.

Yani "şifre" N = olarak düşünülebilir

16*(26**7) + 
1*(26**6) + 
19*(26**5) + 
19*(26**4) + 
23*(26**3) + 
15*(26**2) + 
18*(26**1) + 
4*(26**0)

İzin verirsek s = "a"(yani: 1) ve (N-1) çağrıları yaparsak s.succ!, s "password"(N) olur. Başka bir deyişle, N = 1 + (N-1).

Daha hızlı çalışacak bir örnek için, N hesaplamasının doğru olduğunu kanıtlamak için "pass", hedef olarak düşünün .

16*(26**3) + 
1*(26**2) + 
19*(26**1) + 
19*(26**0)

ve

s = "a"
(N-1).times { s.succ! }
puts s #== "pass"

Biz yazdırmak istediğiniz beri "a"de biz gerekmez

s = "`"
N.times { print(s.succ! + " ") }

Yani tam "parola" geri. N = 129052722140, ayrılıyor:

s=?`;0x1e0c2443dc.times{$><<s.succ!+" "}

Daha kompakt bir form için avlandım 129052722140 == 0x1e0c2443db ama bulamadım.

( "a"Cary sayesinde baskı eksikliğini gidermek için güncellendi .)


1
Adam, aklımda olan sen olmalısın. 'A'dan önce bir tane başlatmak istemez misiniz?
Cary Swoveland

Sanırım elde ettiğiniz şey yinelemelerim Nyerine kullandığımdır N-1! Teşekkürler, düzeltmek için düzenleyeceğim. (129052722140 Google için ilginç bir sayı olmasına rağmen :))
Adam Prescott

1
0x1e0c2443db, 129052722139 kadar karakterdir.
steenslag

Demek eğer olmasıydı s=?a, s.succ!'b'` başlar.
Cary Swoveland

1
İle s=?ave N-1'b c ... şifre' olsun; ile s =<backtick> ve Nalmak 'a b ... şifre'. SO, çıkışın başlamasını istedi 'a'. Bu kadar.
Cary Swoveland

2

Javascript, 73

İşte @Briguys 'kodunun 73 harfli versiyonu.

for(i=s=0;1982613533018>i++;s=i.toString(36))/\d/.test(s)||console.log(s)


2

APL (Dyalog), 46 34

{∇{'PASSWORD '≡⍞←⍵:→⋄⍵}¨⎕A∘.,⍵}' '

Teorik olarak, ŞİFRE kadar yazdıracak, ama ZZZZ sonra bir çalışma alanı tam hatayla karşılaştım: 5 boyutlu dizi çok harika.

EDIT: En son APL ile uğraştığımdan beri çok uzun olmalı. Kimlik karşılaştırmasını ( ) kaçırmaya nasıl cüret ederim !!!

açıklama

{...}: Bir işlevi bildirir ...
⎕A∘.,⍵: Dış ürünü 26 büyük harfli alfa ( ⎕A) ve argüman ( )

{...}¨: Ve sonuçta ortaya çıkan kümenin her bir öğesi için,
⍞←⍵bunu ... : çıktısını
'PASSWORD '≡alıp aşağıdakilerle karşılaştıran bir işleve takın : Karşılaştırma 'PASSWORD '
true ( 1) döndürürse , programı iptal edin.
: Başka sadece yazdırılan dizeyi döndürür.

: Son olarak, dış fonksiyon kendini geri çeker.

(Daha sonra 26 alfa ve 26 alfa arasındaki concat üzerinden dış ürünü alıyorsunuz, bu da tüm 2 harfli kombinasyonları veriyor ve daha sonra dış ürünü 2 harfli kombinasyonlar ve 26 alpha vb. iptal işlemini tetikleyen PASSWORD'e ulaşın)

' ': Kıvılcım!! Bu, boşluk karakteri ile özyinelemeli işlevi tekmelemeye başlar.


2

Python 2 - 15315215115214 bayt

from itertools import*;R=range
for l in iter(chain(*[product(*((map(chr,R(65,91)),)*n))for n in R(1,9)]).next,tuple("passwore")):print ''.join(l)

UPPERCASE kullanılarak bir bayt ve boşluk yerine satırsonu kullanılarak bir bayt kaydedildi.


1

Golf Yazıları 41

'z'+1 == 'aa'Mantık eksikliği nedeniyle Golfscript bunu kazanamaz.

168036262484,(;{27base{96+}%' '+.96?0<*}%
  • 168036262484, 0'dan 168036262483'e kadar dizi oluştur
  • (; 0'ı bırak
  • {.. }%dizi üzerinden yineleme
  • 27base öğeyi taban 27 dizisine dönüştür
  • {96+}% her basamağa 96 ekle
  • ' '+ dizeye dönüştür ve sonuna boşluk ekle
  • .96?0<* char 96 içeriyorsa dizeyi sıfıra kısalt

1

Ruby'de, 39 40.

a=&`
0x1e0c2443dc.times{$><<a.succ!+' '}

..ya da 129052722140. (Edit: eskiden vardı 129052722. Kesme ve yapıştırma bazı rakamlar kaybetmişti. Önceki hex ( 0x7B13032) yanlış sayı için oldu.). a=?`Bir karakteri kaydetmek için @ Doonono'dan ödünç alındı.


Bir a=?` şeyi düzeltmeye çalıştım , biraz garip görünüyor ve sonunda fazladan bir alan var ama en azından işe yarıyor: P
Kapı Tokmağı

Peki 129052722 sayısı nereden geliyor? Benim hesaplama ile, bu size "a" ila "kwkokg" aralığını veriyor gibi görünüyor ... biraz küçük.
breadbox

@Breadbox Bu sayıyı aşağıdaki yöntemle hesapladım (biçimlendirme için özür dilerim, ancak yorumların sınırlamaları var, ha?): 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 Bunun doğru olduğunu onaylamak kolaydır, sadece bazı dizileri yazdırarak.
Cary Swoveland

@breadbox Haklıydın. Bkz. Düzenleme. Yorumda verdiğim yöntem tamam.
Cary Swoveland

Fencepost hataları. Betiğiniz bir = 1..z = 26 kullanarak hesaplıyor. Doğru sayımı elde etmek için a = 0..z = 25 hesaplamanız gerekir. -1'i ilk satırdan kaldırdığınızda, (sıfırıncı giriş için bir tane ekleyerek) hesaplamayla eşleşen 120699639557 elde edersiniz.
ekmek kutusu

1

JavaScript: 57 56 karakter (teşekkürler C5H8NNaO4)

Mümkün olduğunca çok sayıda karakter içeren bir çözüm ("0", "1", "2", .., "passwor9", "passwora", "passworb", "passworc", "password")

for(i=-1;i++<1982613533017;console.log(i.toString(36)));

İşte test etmek için bir keman (sadece son 100 yineleme ile tarayıcınızı kilitlemez).


3
Bu çözüm yanlış, şartnameye uymuyor.
Kapı tokmağı

@Doorknob - Evet, cevabımda bundan bahsettim. Tüm durumları orijinal gereksinimlerden yazdırmaya devam eder, ancak tüm alfa-sayısal durumları da yazdırır.
Briguy37

Ayrıca, soruyu yeniden okuduktan sonra, kodumda i'yi 9'a ayarlarsam, zaten bir istisna vermiş olduğu örnek çıktısı dışında TÜM sorunun gereksinimlerini karşılayacaktı (ve kodu 56 karaktere getirecekti) ).
Briguy37

@ Briguy37 Spec her print every **letter** combinationneyse, bir karakter kaydet:{} -> ;
C5H8NNaO4

@ C5H8NNaO4: Çözümüm hangi harf kombinasyonunu yazdırmıyor? Bahşiş için teşekkürler!
Briguy37

1

Haskell, 101

main=putStrLn.concat.takeWhile(/="passwore ").tail.concat.iterate(\k->[x:y|x<-['a'..'z'],y<-k])$[" "]

0

Befunge (72)

<_v#:/*2+67\+++88*99%*2+76:
^ >$>:#,_84*+,1+:0\:" Lr$W~"67++**1+***6+`#@_

'A' - 'password' dizelerini boşluklarla ayırarak yazdırır, sonra çıkar.

Aşağıda, karşılaştırma için yalnızca ilk 9 * 9 = 81 kelimeyi ('a' - 'dd') yazdıran bir sürüm bulunmaktadır. Gerçekleştirilecek 99*yineleme sayısı.

<_v#:/*2+67\+++88*99%*2+76:
^ >$>:#,_84*+,1+:0\:99*`#@_

0

JavaScript 80 76

for(i=s=0;s!="password";i++){s=i.toString(36).replace(/[0-9]/,'');console.log(s)}

Vaktini boşa harcamak - "pa" da durur.

ancak bu tekrar eder.


i=s=0Üç karakteri daha kaydetmek için döngüyü ile başlatabilirsiniz .
Ry-

@minitech bitti.
Matematik soğutucu

1
Neden var? idaha önce küreseldi; şimdi sküresel. Genellikle her iki küresel kod golf genellikle tutabilirsiniz.
Ry-
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.