В 97-ом году у нас олимпиада была в универе, надо было написать самого короткого питона. На самой олимпиаде я писал на паскале (правда от паскаля там в итоге остался только begin/end и пара циклов, остальное было встроенный асм)
После я, обложившись справочниками, сваял питона на 117 байт.

Правда он был
сильно упрощён. Мог уползать влево-вправо и выползал на строку ниже-выше.
Более честная версия занимала 144 байта.
Правда сейчас под XP они не запустились. То-ли что-то с видеопамятью (я просто из фара пробовал запускать), то-ли дело в 15h прерывании которым я задержку делал.
Под DOS 6.0 в те времена работал нормально (и без дос-а, мы его пробовали в бут-сектор дискеты записывать и загружаться с неё

)
Асм я тогда плохо знал (а сейчас ещё и забыл

), поэтому откомментирован практически построчно.
Компилировалось это всё TASM-ом (из состава BC 3.1/BP 7.0)
Самый короткий и слегка нечестный вариант. 117 байт
Code: Select all
; 1997 Eugene Nikulin (LazyBear)
Field_Char EQU ' ' ; Символ заполнения поля
Field_ChAt EQU 0F2Eh
Piton_Char EQU '█' ; Символ тела питона
Rabbit_Char EQU 'K' ; Символ кролика
Code segment
org 100h
assume cs:CODE,ds:CODE,es:CODE
START:
xor AX, AX
int 10h
mov BX, 0B800h ; Установить DS на видеопамять
mov DS, BX
mov BH, 08h ; Начальное смещение головы
mov DI, BX ; Начальное смещение хвоста
mov DX, 2 ; Начальное направление движения
mov CX, DX
NEW_RABBIT:
@11:
inc BP
mov SI, [BP] ; В SI случайное число
and SI, 03FEh ; Обрезаем чтобы влезло на экран
cmp BYTE ptr [SI], Field_Char ; Это место пустое?
jnz @11 ; Место не пустое, ищем еще
mov BYTE ptr [SI], Rabbit_Char ; Нарисовать кролика
GAME_LOOP:
mov SI, [BX] ; В SI координата головы
mov BYTE ptr [SI], Piton_Char ; Нарисовать голову
add SI, DX ; Добавить смещение
add BL, CL ; Увеличить указатель головы
mov [BX], SI ; Записать новое положение головы
cmp BYTE ptr [SI], Rabbit_Char ; Проверка на съедание кролика
jz NEW_RABBIT ; Кролик съеден!
cmp BYTE ptr [SI], Field_Char ; Проверка на попадание в поле
jnz END_GAME ; В поле не попали
push DX ; Задержка через 15h прерывание
xor DX, DX ; Задержка на 020000h мс
mov AH, 86h
int 15h
pop DX
xchg DI, BX ; В BX указатель на хвост
mov SI, [BX] ; В SI координата хвоста
mov BYTE ptr [SI], Field_Char ; Затереть хвост
add BL, CL ; Увеличение указателя на хвост
xchg DI, BX
mov AH, 01 ; Проверка на нажатую клавишу
int 16h ; В AX код клавиши
je GAME_LOOP ; Клавиша не нажата
xchg AH, AL ; 'cmp AL' занимает меньше места
; чем 'cmp AH' !
cmp AL, 4Bh ; Клавиша влево?
jnz @1
mov DX, -2
@1:
cmp AL, 4Dh ; Клавиша вправо?
jnz @2
mov DX, CX ; CX = 2
@2:
cmp AL, 50h ; Клавиша ввниз?
jnz @3
mov DX, AX ; AX = 50h = 80
@3:
cmp AL, 48h ; Клавиша вверх?
jnz @4
mov DX, -80
@4:
xor AH, AH
int 16h ; Очистка буфера клавиатуры
cmp AL, 27 ; Проверка на 'Esc'
jnz GAME_LOOP
END_GAME:
ret
Code ends
end start
Более честный и цветной. 144 байта
Code: Select all
; 1997 Eugene Nikulin (LazyBear)
Field_Char EQU 2Eh ; Символ заполнения поля
Field_ChAt EQU 0F2Eh
Piton_Char EQU 0DBh ; Символ тела питона
Piton_ChAt EQU 0ADBh
Rabbit_Char EQU 4Bh ; Символ кролика
Rabbit_ChAt EQU 0C4Bh
Field_Width EQU 35
Field_Height EQU 20
Code segment
org 100h
assume cs:CODE,ds:CODE,es:CODE
START:
xor AX, AX
int 10h
mov BX, 0B800h ; Установить DS на видеопамять
mov DS, BX
mov ES, BX
xor DI, DI
mov DX, Field_Height
mov AX, Field_ChAt
@15:
mov CX, Field_Width
rep stosw
add DI, 10
dec DX
jnz @15
mov BH, 08h ; Начальное смещение головы
mov [BX], 810 ; Начальная координата головы
mov DI, BX ; Начальное смещение хвоста
mov DL, 2 ; Начальное направление движения
mov CX, DX
NEW_RABBIT:
@11:
inc BP
mov SI, [BP] ; В SI случайное число
cmp BYTE ptr [SI], Field_Char ; Это место пустое?
jnz NEW_RABBIT ; Место не пустое, ищем еще
mov BYTE ptr [SI], Rabbit_Char ; Нарисовать кролика
GAME_LOOP:
mov SI, [BX] ; В SI координата головы
mov BYTE ptr [SI], Piton_Char ; Нарисовать голову
add SI, DX ; Добавить смещение
add BL, CL ; Увеличить указатель головы
mov [BX], SI ; Записать новое положение головы
cmp BYTE ptr [SI], Rabbit_Char ; Проверка на съедание кролика
jz NEW_RABBIT ; Кролик съеден!
cmp BYTE ptr [SI], Field_Char ; Проверка на попадание в поле
jnz END_GAME ; В поле не попали
push DX ; Задержка через 15h прерывание
xor DX, DX ; Задержка на 020000h мс
mov AH, 86h
int 15h
pop DX
xchg DI, BX ; В BX указатель на хвост
mov SI, [BX] ; В SI координата хвоста
mov BYTE ptr [SI], Field_Char ; Затереть хвост
add BL, CL ; Увеличение указателя на хвост
xchg DI, BX
mov AH, 01 ; Проверка на нажатую клавишу
int 16h ; В AX код клавиши
je GAME_LOOP ; Клавиша не нажата
xchg AH, AL ; 'cmp AL' занимает меньше места
; чем 'cmp AH' !
cmp AL, 4Bh ; Клавиша влево?
jnz @1
mov DX, -2
@1:
cmp AL, 4Dh ; Клавиша вправо?
jnz @2
mov DX, CX ; CX = 2
@2:
cmp AL, 50h ; Клавиша ввниз?
jnz @3
mov DX, AX ; AX = 50h = 80
@3:
cmp AL, 48h ; Клавиша вверх?
jnz @4
mov DX, -80
@4:
xor AH, AH
int 16h ; Очистка буфера клавиатуры
cmp AL, 27 ; Проверка на 'Esc'
jnz GAME_LOOP
END_GAME:
mov AX, 0003h
int 10h
ret
Code ends
end start