Понимаю, что данная статья наверняка вызовет вопросы у модераторов (о целесообразности её пребывания на Хабре), но где как не здесь [на крупнейшем в Европе ресурсе для IT-специалистов] поднимать вопрос ответа на главный вопрос с точки зрения IT?

Для начала вкратце объясню, почему этот вопрос вообще актуален.

--------------------------
--------------------------
--------------------------
--------------------------
--------------------------
--------------------------
--------------------------
--------------------------
--------------------------
--------------------------
--------------------------

Наверняка, многие их вас обратили внимание на злоупотреблениечастое встречание числа ‘‘сорок два’’ на веб-страницах, посвящённых IT-тематике. Вот примеры, которые встретились лично мне:

Осторожно, 15 больших скриншотов!







Остальные 9 скриншотов










Этот факт навёл меня на мысль/идею о том, что стоит запретить использование числа 42 в документации к своим проектам. А так как просто хардкодить это число — неинтересно, возникла идея устроить такой вот "конкурс".

Оставляйте свои варианты [на любом языке программирования] в комментариях (если хочется иметь возможность подправить свой код в будущем, тогда давайте ссылку [на gist в GitHub, на snippet в Bitbucket или на pastebin.com]).

"Конкурс" — бессрочный, так что можете не торопиться и хорошо подумать.

Вот моя реализация (требуется Python 3.6 и выше)
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)


  1. EvilGenius18
    21.02.2018 00:30

    «Конкурс» на лучшую программную реализацию, выводящую число ‘‘сорок два’’

    #Python v3.6.4 
    print(42)

    Я выиграл:
    — Выполняет поставленную задачу
    — Занимает 2 секунды чтобы написать
    — Соответствует всем поставленным условиям (количество: 0)
    — Имеет размер всего 9 байтов

    <//sarcasm>


    1. KitScribe
      21.02.2018 01:07
      -1

      Ещё вариант, чтобы не повторяться:


      import sys
      
      sys.stdout.write('42')


      1. EvilGenius18
        21.02.2018 01:14
        -1

        Хорошее решение, ваш вариант тоже выполняет все заданные условия, хоть их количество и равно 0, но все же все условия выполнены!


        1. hunroll
          21.02.2018 01:58

          echo 42
          И кроссплатформенный, и питон не нужен, и короче (всего 7 байтов)
          Я победил?)


          1. pewpew
            21.02.2018 09:14

            вариант на PHP:

            <?=42;

            6 байтов


            1. m1n7
              21.02.2018 09:27

              golfscript: 2 байта. Я победил?:)


              42


      1. artemisia_borealis
        21.02.2018 11:45

        это даже лучше, т.к. не зависит от версии Python (2 или 3). И даже, если память не изменяет, будет и в 1.6 работать.


  1. oxidmod
    21.02.2018 01:19

    Почему только пайтон?


    1. alextretyak Автор
      21.02.2018 01:57

      А почему вы решили, что только Python?
      (Добавил в статью ‘[на любом языке программирования]’.)


  1. Squoworode
    21.02.2018 07:49

    Спойлер не предотвращает немедленной загрузки изображений!


  1. AkshinM
    21.02.2018 08:25

    Мой вариант

    using System;
    
    namespace Best42
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                Console.WriteLine("42");
            }
        }
    }
    


  1. sim-dev
    21.02.2018 08:34

    Настоящая программа, выводящая 42, должна:
    — требовать непомерных ресурсов
    — работать ооооооочень долго
    — выводить исключительно «голосом» и только в ответ на «Главный вопрос жизни, вселенной и всего такого».
    Именно эти требования заданы неявно.
    Так что даже приведенный автором вариант не соответствует…


    1. movis08
      21.02.2018 11:33

      Дугласа Адамса «Автостопом по галактике»


    1. 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


  1. impwx
    21.02.2018 10:30

    Вывод константы, серьезно?
    Читайте и вдохновляйтесь, какими должны быть задачи на code golf:
    codegolf.stackexchange.com


    1. Sinatr
      21.02.2018 11:03

      Вот только статей с конкурсами и плясками (кодэгольфами) на хабре как раз и не хватает /sarcasm.

      Конкурс в кавычках, потому что это никакой не конкурс, я правильно понимаю? Или есть жюри и призы? Автору просто захотелось запостить свой код, возможно весьма крутой (не владею питоном), но это не делает его хоть чуточку полезнее.

      Предыдущая статья тоже «ни о чем», впрочем там хоть какой-то смысл был, а здесь? 15 скриншотов это статья?

      Жду с нетерпением следущую статью, боюсь даже предположить, о чем (и да /sarcasm).


      1. alextretyak Автор
        21.02.2018 11:42

        Конкурс в кавычках, потому что это никакой не конкурс, я правильно понимаю?

        Не совсем. Мне и правда интересно, вдруг число ‘сорок два’ таит ещё какие-то загадки, о которых мне неизвестно.


        просто захотелось запостить свой код, возможно весьма крутой (не владею питоном)

        Почти. Захотелось показать открытие, на которое я наткнулся совершенно случайно и оформил в форме представленного кода на Python.
        И чтобы понять код, который я представил, знать Python совсем не обязательно — достаточно просто прочитать комментарии к коду.
        Неужели неинтересно, какой хэш-алгоритм выиграл?


  1. 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));
        }
    }
    


    1. Eldhenn
      21.02.2018 12:57
      +1

      Фабрик нет, внедрения зависимостей нет, каррирования нет. Незачёт.


  1. dmitry_dvm
    21.02.2018 11:28

    using 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());
            }
        }
    }


  1. NLO
    00.00.0000 00:00

    НЛО прилетело и опубликовало эту надпись здесь


  1. oxidmod
    21.02.2018 11:31

    Напилите уже кто то на крестовых шаблонах


  1. Logert
    21.02.2018 11:31

    Навсегда запомнил число 42, когда в университете один преподаватель по системным технологиям на зачёте спросил «Что такое 42?». Пришлось читать книгу «Автостопом по галактике».


  1. kasyachitche
    21.02.2018 11:32

    Matlab
    42


  1. Bismuth208
    21.02.2018 11:32

    D lang:

    import std.stdio, std.random;
    
    void main()
    {
      auto rnd = Random();
      while(uniform!uint(rnd) != 42){}
      "42".writeln;
    }
    }


  1. 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


  1. velovich
    21.02.2018 11:32

    unit 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.
    


  1. 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);
    


  1. 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')
    
    


  1. suharik
    21.02.2018 13:10
    +1

    ++[>+++++[>+++++<-]<-]>>++.--.


  1. alexmat
    21.02.2018 14:00
    +2

    <?php
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    echo __LINE__;
    


  1. 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")}



  1. Cheinkler
    22.02.2018 01:54
    +1

    # R

    print((nchar("Конкурс на лучшую программную реализацию, выводящую число сорок два") - nchar("Главный вопрос жизни, вселенной и всего такого")) * 2)


  1. SokoloffA
    22.02.2018 01:54

    На Go

    package main
    
    func main() {
    	print('*')
    }


  1. biophreak
    22.02.2018 13:17

    perl -E'say 42'


  1. bumos
    22.02.2018 15:03

    Реализация с помощью Python\Asciimatics
    42