программа распечатывающая сама себя

Elen13

мб кто-нить напомнит сабж?
вроде пару лет назад в форуме проскакивали тексты

VitMix

Сам напиши. Так даже интереснее. А на каком языке должна быть программа?

artimon


#!/bin/bash
cat $0


Olga22

0
1
2
3
4
5

Elen13

спасибо

Zhich

1 LIST
PS: Это Бейсик

Aleksei66

Типа так


let q = '"';;
type str_entity = String of string | Char of char | PrList | CR;;
let program = [String "let q = '"; Char q; String "';;"; CR; String "type str_entity =
String of string | Char of char | Char cr;;"; CR; String "let program = [";
PrList; String "];;"; CR; String "let print_list list first = "; CR;
String " match list with"; CR; String " [] -> ";
CR; String " | (String str)::t -> (if (first == 0) then
(print_char '; ') else ; print_string "; Char q; String "String "; Char
q; String "; print_char q; print_string str; print_char c; print_list t
0)];;"; CR; String " | (Char _)::t -> (print_string "; Char
q; String "; Char q"; Char q; String "; print_list t 0);"; CR; String " |
(CR)::t -> (print_char '\n'; print_list t 0)"; CR; String " |
(PrList)::t -> (print_string "; Char q; String "; PrList"; Char q;
String "print_list t 0);;"; CR; String "let rec print list ="; CR;
String " match list with"; CR; String " [] -> ";
CR; String " | (String str)::t -> (print_string str; print
t)"; CR; String " | (Char c)::t -> (print_char c; print
t)"; CR; String " | (CR)::t -> (print_char '\n'; print t)";
CR; String " | (PrList) -> (print_list program 1; print
t);;"; CR; String "let main = print program;;"];;
let print_list list first =
match list with
[] ->
| (String str)::t -> (if (first == 0) then (print_char '; ') else ; print_string "String ";
print_char q; print_string str; print_char c; print_list t 0)
| (Char _)::t -> (print_string "; Char q"; print_list t 0);
| (CR)::t -> (print_char '\n'; print_list t 0)
| (PrList)::t -> (print_string "; PrList"; print_list t 0);;
let rec print list =
match list with
[] ->
| (String str)::t -> (print_string str; print t)
| (Char c)::t -> (print_char c; print t)
| (CR)::t -> (print_char '\n'; print t)
| (PrList) -> (print_list program 1; print t);;
let main = print program;

oyuriyu

Одна строчка (если не считать пустой программы, которая является наименьшей в классе )


#!/bin/cat

sergey_m

knave, эти проги однотипные и не интересные. Самое главное, они подогнаны под распечатку самих себя. В них не вставишь еще каких нибудь операций.
Что типа такого:
Makefile который definит значение которое является телом программы на момент компиляции. Возможно придется сделать какую-то сериализацию. Эта значение распечатывается из программы.

dam555

Такие программы называются интроспективными, много всего про них написано в инете.
> knave, эти проги однотипные и не интересные
Согласен, но не со всем. При наличии специфических ограничений все становиться достстаточно интересным. Даже проходят соревнования по их написанию.

Elina74

#include<stdio.h>
#include<string.h>
void main{
int i,j;
char*a="#include<stdio.h>\n#include<string.h>\nvoid main{\n int i,j;\n char*a=%s%s%s;\n char b[1100];\n char*k=%s%s%s%s;\n char*s=%s%s%s%s;\n for(i=0,j=0;i<strlen(a);i++){\n switch(a){\n case '%sn':\n b[j]='%s%s';\n b[j+1]='n';\n j+=2;\n break;\n case '%s%s':\n b[j]='%s%s';\n b[j+1]='%s%s';\n j+=2;\n break;\n case '%s%s':\n b[j]='%s%s';\n b[j+1]='%s%s';\n j+=2;\n break;\n default:\n b[j]=a;\n j++;\n }\n }\n b[j]='%s0';\n printf(a,k,b,k,k,s,k,k,k,s,s,k,s,s,s,s,k,s,s,s,k,s,s,s,s,s,s,s);\n}";
char b[1100];
char*k="\"";
char*s="\\";
for(i=0,j=0;i<strlen(a);i++){
switch(a){
case '\n':
b[j]='\\';
b[j+1]='n';
j+=2;
break;
case '\"':
b[j]='\\';
b[j+1]='\"';
j+=2;
break;
case '\\':
b[j]='\\';
b[j+1]='\\';
j+=2;
break;
default:
b[j]=a;
j++;
}
}
b[j]='\0';
printf(a,k,b,k,k,s,k,k,k,s,s,k,s,s,s,s,k,s,s,s,k,s,s,s,s,s,s,s);
}

yolki

Это всё жульнические методы.
Так получается тоже можно?


#include <stdio.h>
int main
{
FILE *fp=fopen(__FILE__,"r");
char c;
while(!feof(fp
{
c=fgetc(fp);
putchar(c);
}
fclose(fp);
}

artimon

Нельзя. На момент запуска программы, исходников уже может не быть

shlyumper

Хотели интересный вариант? Держите
Один из IOCCC'2000 Winners.
Инструкция:
исходник сохранить как saitou.c
Selected Author's Comments:
This one is dedicated to Saitou Hajime fans ^_^x
Instead of making one self reproducing program, what I made was a
program that generates a set of mutually reproducing programs, all of
them with cool layout!
For your enjoyment:
1. Compile saitou.c
2. Run a.out and pipe output to another .c file
3. Compile that file
4. Repeat steps 2 and 3 until eventually the output cycles

Ну и сам исходник:



#define/**/X
char*d="X0[!4cM,!"
"4cK`*!4cJc(!4cHg&!4c$j"
"8f'!&~]9e)!'|:d+!)rAc-!*m*"
":d/!4c(b4e0!1r2e2!/t0e4!-y-c6!"
"+|,c6!)f$b(h*c6!(d'b(i)d5!(b*a'`&c"
")c5!'b+`&b'c)c4!&b-_$c'd*c3!&a.h'd+"
"d1!%a/g'e+e0!%b-g(d.d/!&c*h'd1d-!(d%g)"
"d4d+!*l,d7d)!,h-d;c'!.b0c>d%!A`Dc$![7)35E"
"!'1cA!2kE`*!-d(!(k(f//g&!)f.e5'f(!+a+)"
"f%2g*!?f5f,!=f-*e/!<d6e1!9e0'f3!6f)-g5!4d*b"
"+e6!0f%k)d7!+~^'c7!)z/d-+!'n%a0(d5!%c1a+/d4"
"!2)c9e2!9b;e1!8b>e/! 7cAd-!5fAe+!7fBe(!"
"8hBd&!:iAd$![7S,Q0!1 bF 7!1b?'_6!1c,8b4"
"!2b*a,*d3!2n4f2!${4 f. '!%y4e5!&f%"
"d-^-d7!4c+b)d9!4c-a 'd :!/i('`&d"
";!+l'a+d<!)l*b(d=!' m- a &d>!&d'"
"`0_&c?!$!$!$ b < ^&d$`"
":!$d9_&l++^$!%f3a' n1 _ $ !&"
"f/c(o/_%!(f+c)q*c %! * f &d+"
"f$s&!-n,d)n(!0i- c- k) ! 3d"
"/b0h*!H`7a,![7* i] 5 4 71"
"[=ohr&o*t*q*`*d *v *r ; 02"
"7*~=h./}tcrsth &t : r 9b"
"].,b-725-.t--// #r [ < t8-"
"752793? <.~;b ].t--+r / # 53"
"7-r[/9~X .v90 <6/<.v;-52/={ k goh"
"./}q; u vto hr `.i*$engt$ $ ,b"
";$/ =t ;v; 6 =`it.`;7=` : ,b-"
"725 = / o`. .d ;b]`--[/+ 55/ }o"
"`.d : - ?5 / }o`.' v/i]q - "
"-[; 5 2 =` it . o;53- . "
"v96 <7 / =o : d =o"
"--/i ]q-- [; h. / = "
"i]q--[ ;v 9h ./ < - "
"52={cj u c&` i t . o ; "
"?4=o:d= o-- / i ]q - "
"-[;54={ cj uc& i]q - -"
"[;76=i]q[;6 =vsr u.i / ={"
"BihY_gha \0 " , o [
3217];int i, r,w,f , b ,x ,
p;n{return r <X X X X X
768?d[X(143+ X r++ + *d ) %
768]:r>2659 ? 59: ( x = d
[(r++-768)% X 947 + 768] ) ?
x^(p?6:0):(p = 34 X X X )
;}s{for(x= n ; ( x^ ( p
?6:0==32;x= n ) ;return x ; }
void/**/main X { r = p
=0;w=sprintf (X X X X X X o
,"char*d="); for ( f=1;f < * d
+143;)if(33-( b=d [ f++ X ] )
){if(b<93){if X(! p ) o
[w++]=34;for X(i = 35 +
(p?0:1);i<b; i++ ) o
[w++]=s;o[ w++ ]
=p?s:34;} else X
{for(i=92; i<b; i
++)o[w++]= 32;} }
else o [w++ ]
=10;o [
w]=0 ;
puts(o);}

shlyumper

кстати, было бы интересно узнать, что означают эти иероглифы в переводе

gopnik1994

const q=#39;var s,t:String;begin s:='const q=#39;var s,t:String;begin s:=';t:=';Writeln(s,q,s,q,#59#116#58q,t,q,t);end.';Writeln(s,q,s,q,#59#116#58q,t,q,t);

okunek

хыхы, офигенный код

Aleksei66

“Then Dennis and Brian worked on a truly warped version of Pascal,
called “A.” When we found others were actually trying to create real
programs with A, we quickly added additional cryptic features and
evolved into B, BCPL, and finally C. We stopped when we got a
clean compile on the following syntax:


for(;P("\n"R=;P("|"for(e=C;e=P("_"+(*u++/8)%2P("|"+(*u/4)%2);


(c) Ken Thompson, Unix Haters Handbook

Elina74

Виноват, в моей проге кое-где пропали


[i]

yolki

ха! давай тогда для чистоты эксперимента поставим права доступа на шелловый скрипт так, чтобы его нельзя было читать, но можно было запускать. напечатает он себя?
тогда


#!/bin/cat


и


#!/bin/sh
cat $0


я думаю не прокатят.

slonishka

#include <string.h>
void main
{
char txt[256];
strcpy(txt,"printf(\"#include <string.h> void main { char txt[256]; txt=\"%s\"; %s }\",txt,txt);");
printf("#include <string.h>\nvoid main\n{\nchar txt[256];\nstrcpy(txt,\"%s\");\n%s\n}",txt,txt);
}

slonishka

а программирую я хуйово
Оставить комментарий
Имя или ник:
Комментарий: