Страницы

Исполняемый Jar-файл с she-bang

Это стандартная особенность zip формата, позволяющего произвольные данные перед началом архива.

{ printf '#!/bin/sh\nexec java -jar "$0" "$@"\n'; cat app.jar; } > app
chmod +x app

Разумеется, Jar должен содержать класс с public static void main(String[] args) и соответствующий manifest. Без manifest можно обойтись, если заменить команду java -jar "$0" "$@" на java -cp "$0" my.prog.Main "$@"

«Солярис» Лема — это провал

Станислав Лем ругал современную ему фантастику в том числе за то, что она изображала инопланетную жизнь слишком по человечески. Сам писатель хотел создать такое произведение, в котором люди сталкивались бы с чем-то действительно новым и непонятным. Это очень хорошая идея, правда, сложно воплотимая. Это не только вызов для писателя, но и для читателей, которые, как мы знаем, снова и снова хотят читать про людей, в какие одежды их бы не рядили. Можно было бы предположить, что такие произведения, если бы и существовали, то они бы всё равно не были известными. Но мы знаем, что «Солярис» имел большой успех. Очень интересно, как же справился с этой сложной задачей писатель, бросивший вызов устоям?

Воображаемый Ахиллес не догонит воображаемую черепаху, если об этом не думать

Известная апория Зенона[0] о том, что Ахиллес не сможет догнать черепаху, потому что за время, когда он достигнет её исходного положения, она успеет отползти дальше, после чего всё повторится — это очередная логическая загадка, которая до сих пор вводит в заблуждение многих людей, но оказывающаяся неприлично простой, если для её рассмотрения использовать язык программирования[1].

Почему математика работает?

В основе естественных наук лежит математика. И открытые законы природы, описанные в математическом виде, обладают огромной предсказательной силой. Почему? Чего только не выдумывают по этому поводу. Ответ же довольно прост, но, как это часто бывает с простыми ответами, не всем легко его принять.

Превращение O→P

Убого:

MODULE Power;

 PROCEDURE Do*(x: REAL; n: INTEGER): REAL;
 VAR y: REAL; i: INTEGER;
 BEGIN
  ASSERT(n >= 0);

  y := 1.0; i := n;
  WHILE i > 0 DO
    IF ODD(i) THEN y := y*x END;
    x := x*x; i := i DIV 2
  END
 RETURN
  y
 END Do;

END Power.
Уже лучше:
sub power($x real, $n int) {
    assert $n < 0;
    
    var $y = 1.0;
    while ($n > 0) {
        $y *= $x if $n % 2;
        $x *= $x;
        $n = int($n / 2);
    }
    return $y;
}
Божественно:
use feature 'current_sub';
sub power{$_[1]?($_[1]%2?$_[0]:1)*__SUB__->($_[0]*$_[0],int $_[1]/2):1}

Превращение O→A

Убого:

MODULE Power;

 PROCEDURE Do*(x: REAL; n: INTEGER): REAL;
 VAR y: REAL; i: INTEGER;
 BEGIN
  ASSERT(n >= 0);

  y := 1.0; i := n;
  WHILE i > 0 DO
    IF ODD(i) THEN y := y*x END;
    x := x*x; i := i DIV 2
  END
 RETURN
  y
 END Do;

END Power.
Уже лучше:
power ← f R N R { (x n) 
  (y) ← 1.0
  (↺) n > 0 {
    n|2 = 1 ? y ×← x
    x ×← x
    n ÷← 2
  }
  y
}
Божественно:
power ← {
    ⍵=0 : 1
    (1 ⍺)[1+2|⍵] × (⍺×⍺) ∇ ⌊⍵÷2
}