Напишіть програму, яка виконує грубу комбінацію літер, поки не знайдено слово "пароль"


16

Програма повинна друкувати кожну комбінацію букв (малі або великі регістри, це не має значення) в алфавітному порядку. Починати слід з 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

2
Чи мають бути роздільники пробілами, або я можу використовувати нові рядки?
Ільмарі Каронен

Так, ви можете, це лише незначна зміна.
ST3

Відповіді:


32

Перл, 19 ч

say for a..password

Використовує нові рядки як роздільники, згідно пояснення вище. Запустіть perl -M5.010(або просто perl -E 'say for a..password'), щоб увімкнути функцію Perl 5.10+ say. Щодо мета , це не вважається додатковими символами.

(Якщо ви наполягаєте на пробілах як роздільники, $,=$";say a..passwordце лише дві символи довше. Однак пам’ять також дуже повільна і марнотратна, до того часу, на практиці вона є непридатною, оскільки вона намагається створити весь список в пам'яті перед друком.)


18

Ruby, 33 символи (оптимальна, але довша версія)

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

Мені подобається 'a'.upto('password'); це точно говорить вам , що це робить. Рубі - така чудова і виразна.:D

Звичайно, print c,' 'також було б набагато зрозуміліше, але використання $>на два символи коротше.

Рубі, 29 25 символів (повільна версія)

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

Цей коротший, але він друкує всі жетони одразу, тому для запуску потрібно багато-багато часу!


1
Приємно, особливо перше.
Cary Swoveland

У повільній версії (?a..'password').to_aйого можна скоротити до[*?a..'password']
Paul Prestidge

6

Perl, 33 32 24 символи

Рішення з 32 символів:

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

Не багато про що сказати. Я міг би скоротити це до 27 символів, якби міг використовувати нові рядки замість пробілів для розділення записів.

Ільмарі Каронен зазначає, що ..всередині телефонує ++, тому кращим рішенням (25 символів) було б:

print$_,$"for a..password

Скориставшись параметрами командного рядка Perl, ось еквівалентне 24-символьне рішення:

perl -l40e 'print for a..password'

Правила підрахунку прапорів Perl є для тих, хто з ними не знайомий.

Звичайно, 21-символьне рішення Ілмарі все ж коротше, але для цього потрібна машина, яка може виділити масив 129,052,722,140 рядків.


Не .$"замість цього ," "зберегти персонажа?
Містер Лама

Так, тотальний нагляд з мого боку. Спасибі.
хлібниця


5

Пітон 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 символів

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

Потрібно встановити кодування на ISO 8859-1 та відключити попередження.


I didn't test that, but does it really do that???
ST3

@ST3 It's a simple loop. The variable $w is initially set to 'a' and then is incremented until it reaches the first value after 'password' (the last string is not printed).
lortabac

3
@ ST3 Це звичайний forцикл. У цьому коді немає нічого дивного, за винятком останніх 2 символів, які є бітовим перевернутим пробілом. У всякому разі, так, я перевірив це до коротшого слова.
lortabac

1
@ ST3 Ось тест від passwoqsдо password. Оскільки кодування кодової панелі не є ISO 8859-1, мені довелося замінити пробіл.
lortabac

1
$w<passworeЗамість цього можна зберегти чарочку $w!=passwore.
Гідний Даблер

2

Ruby (40 символів)

Інтерпретуйте рядок букв az як число в основі 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", завдяки Кері.)


1
Адам, це, мабуть, ти був у моїй думці. Ви не хочете, щоб її почали перед "a"?
Cary Swoveland

Я думаю, що ви отримуєте те, що я використовував Nзамість N-1своїх ітерацій! Дякую, я відредагую, щоб виправити. (Хоча 129052722140 є цікавим номером для Google :).)
Адам Прескотт

1
0x1e0c2443db - стільки символів, скільки 129052722139.
steenslag

Я мав на увазі те, що якщо s=?a, s.succ!починається з 'b'`.
Cary Swoveland

1
With s=?a and N-1 you get 'b c...password'; with s =<backtick> and N you get 'a b...password'. The SO requested the output to begin with 'a'. That's all.
Cary Swoveland

2

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)


2

APL (Діалог), 46 34

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

Теоретично він буде друкуватись до PASSWORD, але я зіткнувся з повною помилкою робочого простору після ZZZZ: 5-мірний масив просто занадто приголомшливий.

РЕДАКТУВАТИ: Мабуть, задовго минуло, як я востаннє поспілкувався з APL. Як насмілився я пропустив порівняння особи ( ) !!!

Пояснення

{...}: Оголошує функцію, яка ...
⎕A∘.,⍵: Бере зовнішній добуток над конкатенацією (Кожна комбінація елемента лівого операнда, об'єднаного з елементом правого операнда, як і декартовий продукт) між 26 великим альфа ( ⎕A) та аргументом ( )

{...}¨: І для кожного елемента результуючого набору підключіть його до функції, яка ...
⍞←⍵: роздруковує його
'PASSWORD '≡та порівняйте з 'PASSWORD '
: Якщо порівняння повертає true ( 1), перервіть програму.
: Ще поверніть надрукований рядок.

: Нарешті, зовнішня функція повторюється.

(Тоді ви берете зовнішній продукт над конфатом між 26 альфами і 26 альфами, який дає всі двобуквові комбінації, а потім зовнішній продукт над конфатом між двобуквенними комбінаціями та 26 альфами і т. Д. ... дістатися до PASSWORD, що запускає аборт)

' ': Іскра!! Цей ударний запуск рекурсивної функції з символом пробілу.


2

Пітон 2 - 153 152 151 149 байт

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 та один за допомогою нових рядків замість пробілів.


1

Гольфскрипт 41

Через відсутність 'z'+1 == 'aa'логіки Golfscript не може перемогти цю.

168036262484,(;{27base{96+}%' '+.96?0<*}%
  • 168036262484, створити масив від 0 до 168036262483
  • (; опустити 0
  • {.. }%ітерація над масивом
  • 27base перетворити елемент в базовий масив 27
  • {96+}% додайте 96 до кожної цифри
  • ' '+ перетворити в рядок і додати пробіл до кінця
  • .96?0<* обрізати рядок до нуля, якщо він містить char 96

1

У Рубі, 39 40.

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

.. або 129052722140. (Редагувати: раніше у мене було 129052722. Я втратив декілька цифр для вирізання та вставки. Попередній шестигранник ( 0x7B13032) був невірним номером.) Запозичені a=?`з @Doorknob на збереження символу.


Я намагався виправити a=?` річ, вона виглядає якось дивно і має додатковий простір наприкінці, але принаймні це працює: P
Doorknob

То звідки береться число 129052722? За моїм розрахунком, це, здавалося б, дасть вам діапазон "a" до "kwkokg" ... трохи невеликий.
хлібниця

@Breadbox Я обчислив це число наступним методом (вибачте за форматування, але коментарі мають обмеження, так?): 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 Неважко підтвердити це правильно, просто роздрукувавши деякі послідовності.
Cary Swoveland

@breadbox Ви мали рацію. Див. Редагування. Метод, який я дав у коментарі, добре.
Cary Swoveland

Помилки огорожі. Ваш сценарій обчислює, використовуючи a = 1..z = 26. Для правильного підрахунку потрібно обчислити a = 0..z = 25. Видаляючи -1 з першого рядка, ви отримаєте 120699639557, який (додавши один для нульового запису) відповідає моєму обчисленню.
хлібниця

1

Javascript: 57 56 characters (thanks C5H8NNaO4)

Here's a solution that includes numbers as possible characters ("0", "1", "2", .., "passwor9", "passwora", "passworb", "passworc", "password")

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

Here's a fiddle for testing (with only the last 100 iterations so it doesn't lock up your browser).


3
This solution is wrong, it doesn't follow the specification.
Doorknob

@Doorknob - Yes, I mentioned that in my answer. It still prints all cases from the original requirements, but prints all alpha-numeric cases as well.
Briguy37

Also, after re-reading the question, if I set i to 9 in my code, it would meet ALL the question's requirements except for his example output, which he has already given an exception for (and it would bring the code to 56 characters).
Briguy37

@Briguy37 The spec says print every **letter** combination Anyway, save a character: {} -> ;
C5H8NNaO4

@C5H8NNaO4: Which letter combination does my solution not print? Thanks for the tip!
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+`#@_

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.

<_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)}

fiddle - stops at "pa".

however this does repeat things.


You can initialize the loop with i=s=0 to save three more characters.
Ry-

@minitech done.
Math chiller

1
Why keep the var? i was a global before; now s is a global. You can just keep both globals in code golf, usually.
Ry-
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.