Program powinien wypisać każdą kombinację liter (małe lub wielkie litery, to nie ma znaczenia) w kolejności alfabetycznej. Musi zaczynać się a
od ostatniej wydrukowanej kombinacji password
.
Dane wyjściowe powinny być:
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
Odpowiedzi:
Perl, 19 znaków
Wykorzystuje znaki nowej linii jako ograniczniki, zgodnie z powyższym wyjaśnieniem. Uruchom z
perl -M5.010
(lub po prostuperl -E 'say for a..password'
), aby włączyć funkcję Perl 5.10+say
. W przeliczeniu na meta nie liczy się to jako dodatkowe znaki.(Jeśli nalegasz na spacje jako ograniczniki,
$,=$";say a..password
jest on tylko o dwa znaki dłuższy. Jednak jest również bardzo powolny i marnuje pamięć, do tego stopnia, że nie nadaje się do użycia w praktyce, ponieważ próbuje wydrukować całą listę w pamięci przed wydrukowaniem.)źródło
Ruby, 33 znaki (optymalna, ale dłuższa wersja)
Lubię
'a'.upto('password')
; mówi ci dokładnie, co robi. Ruby jest taka wspaniała i wyrazista.:D
Oczywiście
print c,' '
byłoby również znacznie jaśniejsze, ale przy użyciu$>
dwóch znaków jest krótsze.Ruby,
2925 znaków (wersja wolna)Ten jest krótszy, ale drukuje wszystkie tokeny jednocześnie, więc uruchomienie zajmuje dużo czasu!
źródło
(?a..'password').to_a
można skrócić do[*?a..'password']
Perl,
333224 znakówRozwiązanie w 32 znakach:
Niewiele do powiedzenia na ten temat. Mógłbym zmniejszyć to do 27 znaków, gdybym mógł użyć znaków nowej linii zamiast spacji do oddzielenia wpisów.
Ilmari Karonen wskazuje, że
..
połączenia wewnętrzne++
, więc lepszym rozwiązaniem (25 znaków) byłoby:Korzystając z opcji wiersza polecenia Perla, oto równoważne 24-znakowe rozwiązanie:
Zasady liczenia flag perla są tutaj, dla tych, którzy ich nie znają.
Oczywiście 21-znakowe rozwiązanie Ilmari jest jeszcze krótsze, ale wymaga komputera, który może przydzielić tablicę 129 052 722 140 ciągów.
źródło
.$"
zamiast," "
uratować postać?Perl 6, 20 znaków
Nie potrzebujesz innych rzeczy
źródło
Python 2, 91
źródło
PHP
383736 znakówMusisz ustawić kodowanie na ISO 8859-1 i wyłączyć ostrzeżenia.
źródło
$w
jest początkowo ustawiona na „a”, a następnie jest zwiększana, aż osiągnie pierwszą wartość po „haśle” (ostatni ciąg nie jest drukowany).for
pętla. W tym kodzie nie ma nic dziwnego, z wyjątkiem ostatnich 2 znaków, które są nieco odwróconymi spacjami. W każdym razie tak, przetestowałem to do krótszego słowa.passwoqs
dopassword
. Ponieważ kodowanie w codepad nie jest zgodne z ISO 8859-1, musiałem zastąpić~ß
go spacją.$w<passwore
zamiast$w!=passwore
.Rubin (40 znaków)
Interpretuj ciąg liter az jako liczbę w podstawie 26, gdzie a = 1, b = 2, ..., z = 26.
„Hasło” można więc traktować jako liczbę N =
Jeśli pozwolimy
s = "a"
(to znaczy: 1) i wykonamy (N-1) wywołania dos.succ!
, s będzie"password"
(N). Innymi słowy, N = 1 + (N-1).For an example that will run more quickly, to prove the calculation of N is correct, consider
"pass"
as the target, where N isand
Since we want to print
"a"
too, we needSo back to the full "password".
N = 129052722140
, leaving:I hunted for a more compact form of
129052722140 == 0x1e0c2443db
but couldn't find one.(Updated to fix the lack of printing
"a"
, thanks to Cary.)źródło
N
instead ofN-1
in my iterations! Thanks, I'll edit to fix. (Although 129052722140 is an interesting number to Google :).)s=?a
,s.succ!
starts at 'b'`.s=?a
andN-1
you get 'b c...password'; withs =
<backtick> andN
you get 'a b...password'. The SO requested the output to begin with'a'
. That's all.Javascript, 73
Here is a 73 character version of @Briguys' code, which prints only letter combinations
for(i=s=0;1982613533018>i++;s=i.toString(36))/\d/.test(s)||console.log(s)
źródło
APL(Dyalog),
4634Theoretically, it would print until PASSWORD, but I encountered a work space full error after ZZZZ: 5-dimensional array is just too awesome.
EDIT: Must have been too long since I last fiddled with APL. How dare I missed the identity comparision (
≡
)!!!Explanation
{...}
: Declares a function which...⎕A∘.,⍵
: Takes the outer product over concatenation (Every combination of an element of the left operand concatenated with an element of the right operand, just like Cartesian Product) between the 26 uppercase alpha (⎕A
) and the argument (⍵
){...}¨
: And for each element of the resulting set, plug that into a function which...⍞←⍵
: prints it out'PASSWORD '≡
and compare it with'PASSWORD '
→
: If the comparison returns true (1
), then abort the program.⍵
: Else just return the printed string.∇
: Finally, the outer function recurse itself.(Then you are taking outer product over concat between the 26 alpha and the 26 alpha, which gives all the 2-letter combinations, and then outer product over concat between the 2-letter combinations and the 26 alpha, etc... Until you reach PASSWORD which triggers the abort)
' '
: The spark!! That kick-start the recursive function with the space character.źródło
Python 2 -
153 152 151149 bytesSaved one byte by using UPPERCASE and one by using newlines instead of spaces.
źródło
Golfscript 41
For lack of
'z'+1 == 'aa'
logic Golfscript can't win this one.168036262484,
create array from 0 to 168036262483(;
drop the 0{
..}%
iterate over array27base
convert element to base 27 array{96+}%
add 96 to each digit' '+
convert to string and add a space to the end.96?0<*
truncate string to zero if it contains char 96źródło
In Ruby,
3940...or
129052722140
. (Edit: formerly I had129052722
. I had lost some digits cutting and pasting. Previous hex (0x7B13032
) was for incorrect number.). Borroweda=?`
from @Doorknob to saves a character.źródło
a=?`
thing, it looks kinda weird and has an extra space at the end but at least it works :PORD_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
It's easy to confirm this is correct by just printing out some sequences.Javascript:
5756 characters (thanks C5H8NNaO4)Here's a solution that includes numbers as possible characters ("0", "1", "2", .., "passwor9", "passwora", "passworb", "passworc", "password")
Here's a fiddle for testing (with only the last 100 iterations so it doesn't lock up your browser).
źródło
print every **letter** combination
Anyway, save a character:{} -> ;
Haskell, 101
źródło
Befunge (72)
Prints strings 'a' to 'password' separated by spaces, then exits.
Below is a version that prints only the first 9*9 = 81 words ('a' to 'dd'), for comparison. The
99*
is the number of iterations to perform.źródło
JavaScript
8076fiddle - stops at "pa".
however this does repeat things.
źródło
i=s=0
to save three more characters.var
?i
was a global before; nows
is a global. You can just keep both globals in code golf, usually.