Напишите программу, которая выполняет комбинацию букв перебором, пока не будет найдено слово «пароль»


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

Perl, 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'); это говорит вам точно, что он делает. Ruby великолепен и так выразителен.:D

Конечно, print c,' 'также было бы намного понятнее, но использование $>на два символа короче.

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

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

Этот файл короче, но он печатает все токены одновременно, поэтому для его запуска требуется очень много времени!


1
Здорово, особенно первое.
Кэри Свовеланд,

В медленной версии, (?a..'password').to_aможет быть сокращено до[*?a..'password']
Пол Престиж

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-символьное решение Ilmari еще короче, но оно требует машины, которая может выделить массив из 129 052 722 140 строк.


Не .$"вместо того, чтобы ," "спасти персонажа?
г-н Лама

Да, полный контроль с моей стороны. Благодарю.
хлебница

6

Perl 6, 20 символов

say "a".../password/

Вам не нужны другие вещи


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 символов

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

Вы должны установить кодировку ISO 8859-1 и отключить предупреждения.


Я этого не проверял, но так ли это?
ST3

@ ST3 Это простой цикл. Переменная $wизначально устанавливается в «a», а затем увеличивается до тех пор, пока не достигнет первого значения после «пароля» (последняя строка не печатается).
Лортабак

3
@ ST3 Это обычный forцикл. В этом коде нет ничего странного, кроме последних 2 символов, которые представляют собой битовый пробел. Во всяком случае, да, я проверил это до более короткого слова.
Лортабак

1
@ ST3 Вот тест от passwoqsдо password. Поскольку кодировка кодовой панели не соответствует ISO 8859-1, мне пришлось заменить ее пробелом.
Лортабак

1
Вы можете сохранить символ с $w<passworeвместо $w!=passwore.
Приличный Дабблер

2

Рубин (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
Адам, это должно быть ты в моем разуме. Разве ты не хочешь, чтобы s начинал перед «а»?
Кэри Свовеланд,

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

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

То , что я имел в виду , что если s=?a, s.succ!начинается «b'`.
Кэри Свовеланд,

1
С s=?aи N-1вы получите «b c ... пароль»; с s =<backtick>, и Nвы получите «b ... пароль». SO запросил вывод для начала 'a'. Это все.
Кэри Свовеланд,

2

Javascript, 73

Вот 73-символьная версия кода @Briguys, которая печатает только буквенные комбинации

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


2

APL (Дьялог), 46 34

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

Теоретически, он будет печататься до ПАРОЛЯ, но после ZZZZ я столкнулся с полной ошибкой рабочего пространства: 5-мерный массив просто слишком крут.

РЕДАКТИРОВАТЬ: Должно быть, было слишком долго, так как я в последний раз возился с APL. Как я посмел пропустить сравнение личности ( )!

объяснение

{...}: Объявляет функцию, которая ...
⎕A∘.,⍵: берет внешнее произведение поверх конкатенации (каждая комбинация элемента левого операнда, конкатенированного с элементом правого операнда, точно так же, как декартово произведение) между 26 прописными буквами альфа ( ⎕A) и аргументом ( )

{...}¨: И для каждого элемента результирующего набора, вставьте его в функцию, которая ...
⍞←⍵: распечатывает его
'PASSWORD '≡и сравнивает с 'PASSWORD '
: Если сравнение возвращает true ( 1), затем прервите программу.
: Иначе просто верните напечатанную строку.

Наконец, внешняя функция рекурсирует себя.

(Затем вы берете внешний продукт через конкат между 26-альфа и 26 альфа, который дает все двухбуквенные комбинации, а затем внешний продукт через конкат между двухбуквенными комбинациями и 26 альфа, и т.д ... До тех пор, пока вы достичь ПАРОЛЯ, который вызывает прерывание)

' ': Искра!! Это начало рекурсивной функции с символом пробела.


2

Python 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

Golfscript 41

Из-за отсутствия 'z'+1 == 'aa'логики, Golfscript не может победить.

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

1

В Руби, 39 40.

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

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


Я пытался это исправить a=?` , это выглядит странно и в конце есть дополнительное пространство, но, по крайней мере, это работает: P
Ручка двери

Так откуда взялся номер 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 Легко подтвердить, что это правильно, просто распечатав некоторые последовательности.
Кэри Свовеланд,

@breadbox Вы были правы. Смотрите редактировать. Метод, который я дал в комментарии, в порядке.
Кэри Свовеланд,

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

1

Javascript: 57 56 символов (спасибо C5H8NNaO4)

Вот решение, которое включает в себя числа в качестве возможных символов («0», «1», «2», .., «passwor9», «passwora», «passworb», «passworc», «password»)

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

Вот скрипка для тестирования (только с последними 100 итерациями, поэтому она не блокирует ваш браузер).


3
Это решение неверно, оно не соответствует спецификации.
Ручка двери

@ Doorknob - Да, я упоминал об этом в своем ответе. Он по-прежнему печатает все дела из исходных требований, но печатает также все буквенно-цифровые дела.
Briguy37

Кроме того, после повторного чтения вопроса, если я установлю в своем коде значение i, оно будет соответствовать ВСЕМ требованиям вопроса, за исключением его примера вывода, для которого он уже дал исключение (и это приведет к тому, что код будет содержать 56 символов). ).
Briguy37

@ Briguy37 В спецификации сказано: «В print every **letter** combinationлюбом случае, сохраните персонажа:{} -> ;
C5H8NNaO4

@ C5H8NNaO4: Какую комбинацию букв не печатает мое решение? Спасибо за чаевые!
Briguy37

1

Хаскелл, 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', разделенные пробелами, затем завершает работу.

Ниже приведена версия, которая печатает только первые 9 * 9 = 81 слово (от 'a' до 'dd') для сравнения. 99*Это число итераций для выполнения.

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

скрипка - останавливается на «па».

Однако это повторяет вещи.


Вы можете инициализировать цикл, i=s=0чтобы сохранить еще три символа.
Ry-

@minitech сделано.
математический чиллер

1
Зачем держать var? iраньше был глобальным; сейчас sглобальный. Вы можете просто держать оба глобала в коде гольф, как правило.
Ry-
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.