Для начала вкратце объясню, почему этот вопрос вообще актуален.
-------------------------- -------------------------- -------------------------- -------------------------- -------------------------- -------------------------- -------------------------- -------------------------- -------------------------- -------------------------- --------------------------
Наверняка, многие их вас обратили внимание на
Этот факт навёл меня на мысль/идею о том, что стоит запретить использование числа 42 в документации к своим проектам. А так как просто хардкодить это число — неинтересно, возникла идея устроить такой вот "конкурс".
Оставляйте свои варианты [на любом языке программирования] в комментариях (если хочется иметь возможность подправить свой код в будущем, тогда давайте ссылку [на gist в GitHub, на snippet в Bitbucket или на pastebin.com]).
"Конкурс" — бессрочный, так что можете не торопиться и хорошо подумать.
import hashlib
def calculate_sacred_number():
results = []
for hash_algorithm in hashlib.algorithms_available: # || Обходим все доступные хэш-алгоритмы
# \\ (список включает в себя MD5, RIPEMD, семейство SHA и BLAKE, всего — 32 алгоритма)
if "shake" in hash_algorithm: # Пропускаем алгоритмы SHAKE, так как они требуют указания дополнительного аргумента length в hexdigest()
continue
for uppercase in range(2): # || Проверяем варианты написания как строчными, так и ПРОПИСНЫМИ буквами
for space in range(2): # || Проверяем варианты написания с дефисом и через пробел
for n in range(10, 100): # || Проверяем все двузначные числа
global numbers
nw = numbers[n] # || Получаем текущее число, записанное словами на английском языке
if uppercase:
nw = nw.upper()
if space:
nw = nw.replace('-', ' ')
ns = str(n)
digest1 = hashlib.new(hash_algorithm, nw.encode()).hexdigest() # || Считаем хэш от записанного словами числа,
digest2 = hashlib.new(hash_algorithm, ns.encode()).hexdigest() # || а также от этого же числа, преобразованного в строку
for i in range(2): # // Проверяем целый хэш, а также первую половину хэша
if ( digest1[ 0] == ns[0] and digest2[ 0] == ns[0] # || Оба хэша должны начинаться на первую цифру текущего числа ...
and digest1[-1] == ns[1] and digest2[-1] == ns[1]): # || ... и заканчиваться на вторую цифру.
results += [ns]
# // Берём первую половину хэша
digest1 = digest1[:len(digest1)//2]
digest2 = digest2[:len(digest2)//2]
assert(len(results) == 1) # || Должно быть только одно "выигравшее" число
return results[0] # || Возвращаем это число
# // From [https://stackoverflow.com/a/8982279/2692494 ‘How do I tell Python to convert integers into words’]:
numbers = "zero one two three four five six seven eight nine".split()
numbers.extend("ten eleven twelve thirteen fourteen fifteen sixteen".split())
numbers.extend("seventeen eighteen nineteen".split())
numbers.extend(tens if ones == "zero" else (tens + "-" + ones)
for tens in "twenty thirty forty fifty sixty seventy eighty ninety".split()
for ones in numbers[0:10])
print(calculate_sacred_number())
Код обильно приправлен комментариями, так что словесным объяснением его не сопровождаю.
Комментарии (36)
oxidmod
21.02.2018 01:19Почему только пайтон?
alextretyak Автор
21.02.2018 01:57А почему вы решили, что только Python?
(Добавил в статью ‘[на любом языке программирования]’.)
AkshinM
21.02.2018 08:25Мой вариант
using System; namespace Best42 { public class Program { public static void Main(string[] args) { Console.WriteLine("42"); } } }
sim-dev
21.02.2018 08:34Настоящая программа, выводящая 42, должна:
— требовать непомерных ресурсов
— работать ооооооочень долго
— выводить исключительно «голосом» и только в ответ на «Главный вопрос жизни, вселенной и всего такого».
Именно эти требования заданы неявно.
Так что даже приведенный автором вариант не соответствует…kahi4
21.02.2018 12:12Попахивает электроном. С ресурсами и скоростью там и так все хорошо (в смысле плохо, но хорошо для задачи), а для речи есть Web Spech API.
Как-то такconst question = "What is the meaning of life, the universe and everything?" const recognition = new webkitSpeechRecognition(); recognition.lang = 'en-US'; recognition.interimResults = false; recognition.maxAlternatives = 1; recognition.onresult = (e) => { if (e.results[0][0].transcript === question) { printAnswer(); } } function printAnswer() { let x, y = 0; for (let i = Number.MAX_SAFE_INTEGER; i >= 4; i--) { for (let j = Number.MAX_SAFE_INTEGER; j >= 2; j++) { x = i; y = j; } } speechSynthesis.speak(new SpeechSynthesisUtterance(`${x}${y}`)) } recognition.start();
В хроме сработает, но я бы рекомендовал перед запуском почистить функцию printAnswer
impwx
21.02.2018 10:30Вывод константы, серьезно?
Читайте и вдохновляйтесь, какими должны быть задачи на code golf:
codegolf.stackexchange.comSinatr
21.02.2018 11:03Вот только статей с конкурсами и плясками (кодэгольфами) на хабре как раз и не хватает /sarcasm.
Конкурс в кавычках, потому что это никакой не конкурс, я правильно понимаю? Или есть жюри и призы? Автору просто захотелось запостить свой код, возможно весьма крутой (не владею питоном), но это не делает его хоть чуточку полезнее.
Предыдущая статья тоже «ни о чем», впрочем там хоть какой-то смысл был, а здесь? 15 скриншотов это статья?
Жду с нетерпением следущую статью, боюсь даже предположить, о чем (и да /sarcasm).alextretyak Автор
21.02.2018 11:42Конкурс в кавычках, потому что это никакой не конкурс, я правильно понимаю?
Не совсем. Мне и правда интересно, вдруг число ‘сорок два’ таит ещё какие-то загадки, о которых мне неизвестно.
просто захотелось запостить свой код, возможно весьма крутой (не владею питоном)
Почти. Захотелось показать открытие, на которое я наткнулся совершенно случайно и оформил в форме представленного кода на Python.
И чтобы понять код, который я представил, знать Python совсем не обязательно — достаточно просто прочитать комментарии к коду.
Неужели неинтересно, какой хэш-алгоритм выиграл?
EreminD
21.02.2018 10:34Так?
import java.util.OptionalInt; import java.util.stream.IntStream; final public class Printer42{ public static void main(String[] args) { OptionalInt iAm42 = IntStream.range(Integer.MIN_VALUE, Integer.MAX_VALUE) .parallel() .filter(i -> i == 42) .findFirst(); System.out.println(iAm42.orElse(42)); } }
dmitry_dvm
21.02.2018 11:28using System; using System.Linq.Expressions; namespace Expressions42 { class Program { static void Main(string[] args) { const string February = "февраль"; const string April = "апрель"; var first = Expression.Constant(February.Length); var second = Expression.Constant(April.Length); var multiply = Expression.Multiply(first, second); var compiled = Expression.Lambda<Func<int>>(multiply).Compile(); Console.WriteLine(compiled()); } } }
Logert
21.02.2018 11:31Навсегда запомнил число 42, когда в университете один преподаватель по системным технологиям на зачёте спросил «Что такое 42?». Пришлось читать книгу «Автостопом по галактике».
Bismuth208
21.02.2018 11:32D lang:
import std.stdio, std.random; void main() { auto rnd = Random(); while(uniform!uint(rnd) != 42){} "42".writeln; } }
isnullxbh
21.02.2018 11:32.global _start _start: mov $1, %rax mov $1, %rdi lea str, %rsi mov $LEN, %rdx syscall mov $60, %rax xor %rdi, %rdi syscall str: .ascii "42\n" LEN = . - str
velovich
21.02.2018 11:32unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OleCtrls, SHDocVw, StdCtrls; type TForm1 = class(TForm) procedure OnDocComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); procedure FormActivate(Sender: TObject); private wb1:twebbrowser; { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.OnDocComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); var sl1:tstringlist; s1:string; i1,i2:integer; begin sl1:=tstringlist.Create; sl1.Text:=twebbrowser(sender).OleObject.document.body.innerText; while (i1<sl1.Count) and (s1='') do begin if pos('question about life universe and everything',sl1[i1])>0 then begin i2:=1; while (i2<length(sl1[i1])) and (s1='') do begin try s1:=inttostr(strtoint(sl1[i1][i2]+sl1[i1][i2+1])); except end; i2:=i2+1; end; end; i1:=i1+1; end; showmessage(s1); end; procedure TForm1.FormActivate(Sender: TObject); begin wb1:=twebbrowser.Create(self); wb1.ParentWindow:=self.Handle; wb1.Width:=0; wb1.Height:=0; wb1.OnDocumentComplete:=OnDocComplete; wb1.Navigate('https://yandex.ru/search/?text=question%20about%20life%20universe%20and%20everything'); end; end.
Imbecile
21.02.2018 11:52+1Запустил. Пока работает. Жду.
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.()\";"; var expected = "console.log(\"42\");"; var generated = ""; var found = false; while (!found) { generated = ""; for (var i = 0; i < expected.length; i++) { generated += chars.charAt(Math.floor(Math.random() * chars.length)); } found = generated == expected; } eval(generated);
artemisia_borealis
21.02.2018 12:16Пять коротких вариантов
#!/usr/bin/env python3 # 1 print(sum(map(int, list(bin(4398046511103)[2:])))) # 2 без использования 42 и явных мат. операций print(int(oct(34)[-2:])) # 3 без использования 4 и 2 print( int(hex(66).split('x')[1]) ) print(6*7) # 4 без использования 4 print('Ч2') # 5 без цифр вообще print('XLII')
Nick_mentat
21.02.2018 14:06Этот код будет работать долго, прежде чем ответить)
let question = "The answer to life, the universe and everything";
def type FixedString <len(question) * size(char)> toString;
let check = False;
Start start{>openaccess(system.memory)<=>_hdrive
>math.calc
>TheBranch{.Set(Check) .Test}
}
Math math.oncalc>{for (FixedString)i in _hdrive:
if (whether i contains("The answer to life, the universe and everything")):
if i == 42: check = True;
}
Branch TheBranch{.ifTrue>text.display("42") .ifFalse>text.display("maybe 42, maybe not")}
Cheinkler
22.02.2018 01:54+1# R
print((nchar("Конкурс на лучшую программную реализацию, выводящую число сорок два") - nchar("Главный вопрос жизни, вселенной и всего такого")) * 2)
EvilGenius18
Я выиграл:
— Выполняет поставленную задачу
— Занимает 2 секунды чтобы написать
— Соответствует всем поставленным условиям (количество: 0)
— Имеет размер всего 9 байтов
<//sarcasm>
KitScribe
Ещё вариант, чтобы не повторяться:
EvilGenius18
Хорошее решение, ваш вариант тоже выполняет все заданные условия, хоть их количество и равно 0, но все же все условия выполнены!
hunroll
echo 42
И кроссплатформенный, и питон не нужен, и короче (всего 7 байтов)
Я победил?)
pewpew
вариант на PHP:
6 байтов
m1n7
golfscript: 2 байта. Я победил?:)
42
artemisia_borealis
это даже лучше, т.к. не зависит от версии Python (2 или 3). И даже, если память не изменяет, будет и в 1.6 работать.