Для памяти
Jul. 26th, 2025 10:28 pmТеперь мы умеем писать интроспективные программы (quine) на БЭСМ-6 на всех Фортранах
(для Форекса, не требующего PROGRAM, можно чуть короче),
на Паскале-Мониторе
(на Паскале-Автокоде тоже можно, в принципе)
и на АЛГОЛе-ГДР
На АЛГОЛЕ-БЭСМ им. Курочкина, по-видимому, это невозможно: неизвестен способ напечатать закрывающую кавычку.
На ассемблерах, очевидно, тоже можно, но ломает.
РRОGRАМQ
RЕАLХ(14)
DАТА Х /84Н(6Х8НРRОGRАМQ/6Х9НRЕАLХ(14)/6Х12НDАТА Х /84Н9А6/5Х1НС
С5А6,1Н//6Х9НРRINТ Х,Х/6Х3HЕND)/
РRINТ Х,Х
ЕND
(для Форекса, не требующего PROGRAM, можно чуть короче),
на Паскале-Мониторе
PROGRAM MAIN(OUTPUT);TYPE STRING=PACKED ARRAY[1..60]OF CHAR; VAR L:ARRAY[1..6]OF STRING; I,J:INTEGER; Q,S:CHAR; BEGIN L[1]:=’PROGRAM MAIN(OUTPUT);TYPE STRING=PACKED ARRAY[1..60]OF CHAR;’; L[2]:=’VAR L:ARRAY[1..6]OF STRING; I,J:INTEGER; Q,S:CHAR; BEGIN ’; L[3]:=’Q:=ZZZZ; FOR I:=1 TO 2 DO WRITELN(L[I]); FOR I := 1 TO 6 DO ’; L[4]:=’WRITELN(ZL[Z,I:1,Z]:=Z,Q,L[I],Q,Z;Z); FOR I:=3 TO 6 DO BEGIN’; L[5]:=’FOR J:=1 TO 60 DO BEGIN S:=L[I][J]; IF S=ZZZ THEN IF J<>43 ’; L[6]:=’THEN S:=Q; WRITE(S) END; WRITELN END END. ’; Q:=’’’’; FOR I:=1 TO 2 DO WRITELN(L[I]); FOR I := 1 TO 6 DO WRITELN(’L[’,I:1,’]:=’,Q,L[I],Q,’;’); FOR I:=3 TO 6 DO BEGIN FOR J:=1 TO 60 DO BEGIN S:=L[I][J]; IF S=’Z’ THEN IF J<>43 THEN S:=Q; WRITE(S) END; WRITELN END END.
(на Паскале-Автокоде тоже можно, в принципе)
и на АЛГОЛе-ГДР
’BEGIN’’STRING’’ARRAY’L[1:7];’INTEGER’I,J;’STRING’Q,R,S; ’PROCEDURE’P(S);’STRING’S;’BEGIN’’FOR’J:=1’STEP’1’UNTIL’ LENGTH(S)’DO’PRINT(’IF’J’NE’45’AND’S[J] = ’’/’’ ’THEN’ Q ’ELSE’ S[J]); PRINT(NEWLINE) ’END’; R := ’’1234567’’; L[1]:=’’/BEGIN//STRING//ARRAY/L[1:7];/INTEGER/I,J;/STRING/Q,R,S;’’; L[2]:=’’/PROCEDURE/P(S);/STRING/S;/BEGIN//FOR/J:=1/STEP/1/UNTIL/’’; L[3]:=’’LENGTH(S)/DO/PRINT(/IF/J/NE/45/AND/S[J] = ///// /THEN/ Q’’; L[4]:=’’/ELSE/ S[J]); PRINT(NEWLINE) /END/; R := //1234567//;’’; L[5]:=’’Q:=///47///;/FOR/ I:=1,2,3,4/DO/P(L[I]); /FOR/I:=1,2,3,4,’’; L[6]:=’’5,6,7/DO/PRINT(//L[//,R[I],//]:=//,Q,Q,L[I],Q,Q,//;//,’’; L[7]:=’’NEWLINE);/FOR/ I:=5,6,7 /DO/ P(L[I]); /END//EOP/’’; Q:=’’’47’’’;’FOR’ I:=1,2,3,4’DO’P(L[I]); ’FOR’I:=1,2,3,4, 5,6,7’DO’PRINT(’’L[’’,R[I],’’]:=’’,Q,Q,L[I],Q,Q,’’;’’, NEWLINE);’FOR’ I:=5,6,7 ’DO’ P(L[I]); ’END’’EOP’
На АЛГОЛЕ-БЭСМ им. Курочкина, по-видимому, это невозможно: неизвестен способ напечатать закрывающую кавычку.
На ассемблерах, очевидно, тоже можно, но ломает.