char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);}
quine = a + b + Ea + c + Ee + d + e
s1,s2 = 's1,s2 = ', "\nprint s1+repr(s1)+', '+repr(s2)+s2" print s1+repr(s1)+', '+repr(s2)+s2
# this is quine s1 = '# this is quine' s2 = 'print s1\nprint "s1="+repr(s1)\nprint "s2="+repr(s2)\nprint s2' print s1 print "s1="+repr(s1) print "s2="+repr(s2) print s2
RUN quine = quine
. Q(F,f,g,h,i,j) = a + b + Ef + c + Ej + d + e -- a,b,c,d,e - () F g,h,i. RUN Q(F,f,g,h,i,j) = f + g + Ff + h + Fj + i + j
# this is Q def F(s) : ''' F ''' s1 = 'Ef' s2 = 'Ej' print s1 + 'Eg' + F(s1) + 'Eh' + F(s2) + 'Ei' + s2 # Ef, Eg, Eh, Ei, Ej — -
RUN Q(F,f,g,h,i,j) = Q(F,f,g,h,i,j)
RUN Q(F,f,g,h,i,j) = f + b + Ff + c + Fj + d + e Q(F,f,g,h,i,j) = a + b + Ff + c + Ej + d + e
printer = p + Sq + r RUN printer = q
P(q) = p + Sq + r
RUN P(q) = q
#include <stdio.h> int main() { printf("%s", "hello\nhabr"); return 0; }
print """ hello RSDN """
#include <stdio.h> int main() { putchar(114);putchar(115);putchar(100);putchar(110); return 0; }
Pmeta (q) = PPq = P(p + Sq + r) = p + S(p + Sq + r) + r = p + Sp + SSq + Sr + r pmeta = p + Sp Smeta = SS rmeta = Sr + r RUN (RUN( Pmeta(q) )) = q
Pbilingua(q) = P'P"q = P'(p" + S"q + r") = p' + S'p" + S'S"q + S'r" + r' RUN"(RUN'(Pbilingua(q))) = RUN"(RUN'(P'P"(q))) = RUN"(P"(q)) = q
Pmulti(q) = pmulti + Smultiq + rmulti pmulti = p1 + S1p2 + S1S2p3 + S1S2S3p4 Smulti = S1S2S3S4 rmulti = S1S2S3r4 + S1S2r3 + S1r2 + r1
p0 = "" r0 = "" S0 = id
RUN ping = pong RUN pong = ping
ping = P pong = p + S pong + r = p + S(a + b + Ef + c + Ej + d + e) + r = p + Sa + Sb + SEf + Sc + SEj + Sd + Se + r = (p + Sa + Sb) + SEf + Sc + SEj + (Sd + Se + r) ping = RUN pong = f + g + Ff + h + Fj + i + j
f = p+Sa+Sb
, and not g=Sa+Sb
, for example?pong = a+b + E(p+Sa+Sb) + c + E(Sd+Se+r) + d+e
pong = R(F,x,y,z) = a + Ex + b + Ez + c + Ey + d RUN R(F,x,y,z) = x + Fx + y + Fz + z P pong = p+Sa + SEx + Sb + SEz + Sc+SEy+Sd+r RUN pong = x + Fx + y + Fz + z
F = SE x = p+Sa y = Sb z = Sc+SEy+Sd+r = Sc + SESb + Sd + r
pong = R(F,x,y,z) = a + Ex + b + Ey + b + Ez + c RUN R(F,x,y,z) = x + Fx + y + Fy + y + Fz + z
P pong = p+Sa + SEx + Sb + SEy + Sb + SEz + Sc+r RUN pong = x + Fx + y + Fy + y + Fz + z
P = {S, p,r}
and for R = {E,a,b,c}
, then we will immediately turn them into ping-pong. And do not forget that P can be a multi-printer. Then the ping-pong will oscillate with a period of n + 1, where n is the multiplicity of the multiprinter. And if P is a null printer, then ping-pong oscillates with a period of 1 and (who would have thought?) Becomes quine.F(abcd…) = Fa + Fb + Fc + Fd + …
FG(abcd…) = FGa + FGb + FGc + FGd + …
{Sk,pk,rk}
in which languages are unknown (all we need are only table implementations of Sk functions);{E,a(F),b,c(F)}
, where a or d reserve space for an arbitrary codebook F (therefore, a and c are not strings or functions above strings, but functions of higher order).{S,p,r}
, calculating S1S2...
according to the tables.F = SE
.x=(p+Sa), y=(Sb), z=(Sc+r)
.a+Ex+b+Ey+b+Ey+c
. #-*- coding: utf-8 -*- # - , def I(c) : ''' id-, ''' return c def C(c) : ''' ''' if c=='"' or c=='\\' or ord(c)<32 or ord(c)>126 : return '\\%03o' % ord(c) # , , # , # : \x24bad - chr(0x24BAD), $bad else : return c def decor(F,s) : ''' ''' return ''.join(map(F,s)) # def compose(F,G) : ''' ''' return lambda c : decor(F,G(c)) # - (S,p,r) def make_printer(S, tpl, tag = '<-T->') : ''' ( <-T-> , ) ''' p,r = tpl.split(tag) return S,p,r nul_printer = (I,'','') def show_printer(prn, t) : ''' t ''' S,p,r = prn return p + decor(S,t) + r def meta_printer(prn1, prn2) : ''' ''' S1,p1,r1 = prn1 S2,p2,r2 = prn2 S = compose(S1,S2) p = p1 + decor(S1,p2) r = decor(S1,r2) + r1 return S,p,r # - , - (E, am, b, cm) # am cm - decorator -> string def make_quiner(E, M, tpl, tagX = '<-X->', tagF = '<-F->') : ''' <-X-> x,y,z, <-F-> , F E - , M ''' a,b,b_,c = tpl.split(tagX) assert b==b_ am = lambda F : a.replace(tagF, M(F)) if tagF in a else a cm = lambda F : c.replace(tagF, M(F)) if tagF in c else c return E,am,b,cm def show_quiner(qnr, F,x,y,z) : ''' a,Ex,b,Ey,b,Ez,c -- x,Fx,y,Fy,y,Fz,z -- , (RUN) ''' E,am,b,cm = qnr a,c = am(F), cm(F) ex,ey,ez = decor(E,x), decor(E,y), decor(E,z) return a + ex + b + ey + b + ez + c def show_quiner_printer(qnr,prn) : ''' p+Sa,SEx,Sb,SEy,Sb,SEz,Sc+r -- x , Fx, y , Fy, y , Fz, z -- ''' E,am,b,cm = qnr S,p,r = prn F = compose(S,E) a,c = am(F), cm(F) x = p + decor(S,a) y = decor(S,b) z = decor(S,c) + r ex,ey,ez = decor(E,x), decor(E,y), decor(E,z) return a + ex + b + ey + b + ez + c ############################################################# # : c_quine_tpl = '''/* C quine */ #include <stdio.h> const char* f[128] = {<-F->}; const char* xyz[3] = {"<-X->", "<-X->", "<-X->"}; void ps(const char* s) { while(*s) putchar(*s++); } void pm(const char* s) { while(*s) ps(f[*s++]); } int main() { ps(xyz[0]); /* x */ pm(xyz[0]); /* Fx */ ps(xyz[1]); /* y */ pm(xyz[1]); /* Fy */ ps(xyz[1]); /* y */ pm(xyz[2]); /* Fz */ ps(xyz[2]); /* z */ return 0; } ''' def c_quine_M(F) : ''' - ''' codes = [ '"%s"' % decor(C,decor(F,chr(i))) for i in xrange(128) ] return ', '.join(codes) c_quiner = make_quiner(C, c_quine_M, c_quine_tpl) # , py_quine_tpl = '''#!/usr/bin/python import sys m = [ <-F-> ] xyz = [ "<-X->", "<-X->", "<-X->" ] def ps(s) : sys.stdout.write(s) def pm(s) : for c in s : ps(m[ord(c)]) ps(xyz[0]) pm(xyz[0]) ps(xyz[1]) pm(xyz[1]) ps(xyz[1]) pm(xyz[2]) ps(xyz[2]) ''' py_quiner = make_quiner(C, c_quine_M, py_quine_tpl) # ################### # : c_printer_tpl = '''#include <stdio.h> int main() { printf("%s", "<-T->"); return 0; } ''' c_printer = make_printer(C, c_printer_tpl) py_printer_tpl = '''import sys sys.stdout.write("<-T->") ''' py_printer = make_printer(C, py_printer_tpl) #################### # ! c_c_printer = meta_printer(c_printer, c_printer) py_py_printer = meta_printer(py_printer, py_printer) # 1 c_quine = show_quiner_printer(c_quiner, nul_printer) py_quine = show_quiner_printer(py_quiner, nul_printer) # 2 c_c_quine = show_quiner_printer(c_quiner, c_printer) py_py_quine = show_quiner_printer(py_quiner, py_printer) # 2 - c_py_quine = show_quiner_printer(c_quiner, py_printer) py_c_quine = show_quiner_printer(py_quiner, c_printer) # 3 - - c_c_c_quine = show_quiner_printer(c_quiner, c_c_printer) py_py_py_quine = show_quiner_printer(py_quiner, py_py_printer) c_py_py_quine = show_quiner_printer(c_quiner, py_py_printer) py_c_c_quine = show_quiner_printer(py_quiner, c_c_printer) sys.stdout.write(py_py_py_quine) # , , - ...
Source: https://habr.com/ru/post/188852/
All Articles