diogenes.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. #!/usr/bin/env pypy2
  2. # coding: utf-8
  3. #### license: creative commons cc0 1.0 (public domain)
  4. #### http://creativecommons.org/publicdomain/zero/1.0/
  5. proginf = "diogenes 0.1, jun 2020 mn"
  6. # plato once defined man as a "featherless biped".
  7. # diogenes plucked a chicken for plato and said "behold a man!"
  8. # is free culture as important as free software?
  9. # rms considers programming languages separate and "practical"
  10. # (they do stuff). for copyright eligibility, that point matters.
  11. # this is a programming language which turns verbatim-copy-only
  12. # essays by richard stallman into non-free software.
  13. # $ cat saying-no-even-once.txt | diogenes.py > man.py
  14. # compiles saying-no-even-once.txt to man.py
  15. # % turn on/off printing
  16. # @ quit program
  17. # a, A cycle colour backwards
  18. # b, B cycle colour
  19. # c, C copy next variable value to following character variable
  20. # d, D move down most recent variable value
  21. # e, E toggle print default upper/lower (starts lower)
  22. # f, F move to 1, 1
  23. # g, G get next character variable value
  24. # h, H append next variable value to following character variable
  25. # i, I set next variable to empty string
  26. # j, J fi
  27. # k, K if most recent variable value is true, do the following
  28. # l, L move left most recent variable value
  29. # m, M convert most recent value to uppercase
  30. # n, N convert most recent value to lowercase
  31. # o, O set next variable to 0
  32. # p, P print most recent variable value
  33. # q, Q exit loop early (limited)
  34. # r, R move right most recent variable value
  35. # s, S turn off print default case
  36. # t, T set next variable to random number 0 to 99
  37. # u, U move up most recent variable value
  38. # v, V set next letter to following character
  39. # w, W loop most recent variable value times
  40. # x, X mark end of loop
  41. # y, Y wait next value seconds
  42. # z, Z clear screen
  43. funcs = """
  44. vars = {}
  45. locx = 10
  46. locy = 10
  47. locolour = 7
  48. togprint = 0
  49. lutog = 0
  50. from random import randint
  51. for each in "abcdefghijklmnopqrstuvwxyz":
  52. vars[each] = ""
  53. import sys
  54. from time import sleep
  55. from sys import stdout
  56. def colour(colour_f, colour_b):
  57. if colour_f == None: colour_f = 0
  58. if colour_b == None: colour_b = 0
  59. colour_n = "0"
  60. if colour_f > 7: colour_n = "1" ; colour_f = colour_f - 8
  61. if colour_f == 1: colour_f = 4 ## switch ansi colours for dos cga
  62. elif colour_f == 4: colour_f = 1 ## 1 = blue not red, 4 = red not blue
  63. if colour_f == 3: colour_f = 6
  64. elif colour_f == 6: colour_f = 3
  65. if colour_b > 7: colour_b = colour_b - 8
  66. if colour_b == 1: colour_b = 4
  67. elif colour_b == 4: colour_b = 1
  68. if colour_b == 3: colour_b = 6
  69. elif colour_b == 6: colour_b = 3
  70. stdout.write("\x1b[" + colour_n + ";" + str(30+colour_f) +
  71. ";" + str(40+colour_b) + "m")
  72. stdout.flush()
  73. def xy(mx, my, loc):
  74. stdout.write("\x1b["+str(my)+";"+str(mx)+"H")
  75. colour(0, loc)
  76. stdout.write(" ")
  77. colour(loc, 0)
  78. def cls():
  79. esc = chr(27)
  80. stdout.write(esc + "[2J" + esc + "[1;1H")
  81. sys.stdout.flush()
  82. def val(n):
  83. try:
  84. n = float(n)
  85. except:
  86. n = 0
  87. if float(int(n)) == float(n):
  88. n = int(n)
  89. return n
  90. def figure(p, vars, t):
  91. about = vars[p]
  92. if t == "n":
  93. if about in ("0", 0):
  94. return 0
  95. if val(about) != 0:
  96. return val(about)
  97. return len(about)
  98. def app(p, s):
  99. if type(p) == str:
  100. return p + str(s)
  101. else:
  102. return p + val(s)
  103. def lu(p, s):
  104. if s == -1: return str(p).lower()
  105. if s == 1: return str(p).upper()
  106. return str(p)
  107. """
  108. print funcs
  109. import sys
  110. from sys import stdin
  111. p = stdin.read()
  112. indent = 0
  113. mode = "n"
  114. dloop = 0
  115. loopcount = 0
  116. vars = {}
  117. alph = "abcdefghijklmnopqrstuvwxyz"
  118. for each in alph:
  119. vars[each] = ""
  120. mrv = "a"
  121. for etter in p:
  122. letter = etter.lower()
  123. if letter in "%@" + alph:
  124. if mode == "n":
  125. if letter == "%":
  126. d = chr(32) * 4 * indent
  127. print d + "if togprint: togprint = 0"
  128. print d + "else: togprint = 1"
  129. if letter == "e":
  130. d = chr(32) * 4 * indent
  131. print d + "if togprint == 0: togprint = -1"
  132. print d + "else: togprint = togprint * -1"
  133. elif letter == "s":
  134. print chr(32) * 4 * indent + "lutog = 0"
  135. elif letter == "@":
  136. print chr(32) * 4 * indent + "quit()"
  137. elif letter == "z":
  138. print chr(32) * 4 * indent + "cls()"
  139. elif letter == "y":
  140. mode = "y"
  141. elif letter == "t":
  142. mode = "t"
  143. elif letter == "o":
  144. mode = "o"
  145. elif letter == "i":
  146. mode = "i"
  147. elif letter == "g":
  148. mode = "g"
  149. elif letter == "j":
  150. dloop = 0
  151. if indent > 0:
  152. indent -= 1
  153. elif letter == "x":
  154. dloop = 0
  155. if indent > 0:
  156. indent -= 1
  157. elif letter == "k":
  158. d = chr(32) * 4 * indent
  159. print d + "if vars['" + mrv + "']:"
  160. indent += 1
  161. print chr(32) * 4 * indent + "d0 = 0"
  162. elif letter == "p":
  163. d = chr(32) * 4 * indent
  164. print d + "if togprint: print lu(vars['" + mrv + "'], lutog)"
  165. elif letter == "w":
  166. dloop = 1
  167. loopcount += 1
  168. d = chr(32) * 4 * indent + "for loop" + str(loopcount)
  169. print d + " in range(figure('" + mrv + "', vars, 'n')):"
  170. indent += 1
  171. print chr(32) * 4 * indent + "sleep(0.0001)"
  172. elif letter == "q":
  173. if dloop > 0:
  174. print chr(32) * 4 * indent + "break"
  175. elif letter == "u":
  176. if letter:
  177. print chr(32) * 4 * indent + "xy(locx, locy, locolour)"
  178. loopcount += 1
  179. d = chr(32) * 4 * indent + "for loop" + str(loopcount)
  180. print d + " in range(figure('" + mrv + "', vars, 'n')):"
  181. indent += 1
  182. print chr(32) * 4 * indent + "if locy > 0: locy -= 1"
  183. print chr(32) * 4 * indent + "xy(locx, locy, locolour)"
  184. indent -= 1
  185. elif letter == "l":
  186. if letter:
  187. print chr(32) * 4 * indent + "xy(locx, locy, locolour)"
  188. loopcount += 1
  189. d = chr(32) * 4 * indent + "for loop" + str(loopcount)
  190. print d + " in range(figure('" + mrv + "', vars, 'n')):"
  191. indent += 1
  192. print chr(32) * 4 * indent + "if locx > 0: locx -= 1"
  193. print chr(32) * 4 * indent + "xy(locx, locy, locolour)"
  194. indent -= 1
  195. elif letter == "r":
  196. if letter:
  197. print chr(32) * 4 * indent + "xy(locx, locy, locolour)"
  198. loopcount += 1
  199. d = chr(32) * 4 * indent + "for loop" + str(loopcount)
  200. print d + " in range(figure('" + mrv + "', vars, 'n')):"
  201. indent += 1
  202. print chr(32) * 4 * indent + "locx += 1"
  203. print chr(32) * 4 * indent + "xy(locx, locy, locolour)"
  204. indent -= 1
  205. elif letter == "d":
  206. if letter:
  207. print chr(32) * 4 * indent + "xy(locx, locy, locolour)"
  208. loopcount += 1
  209. d = chr(32) * 4 * indent + "for loop" + str(loopcount)
  210. print d + " in range(figure('" + mrv + "', vars, 'n')):"
  211. indent += 1
  212. print chr(32) * 4 * indent + "locy += 1"
  213. print chr(32) * 4 * indent + "xy(locx, locy, locolour)"
  214. indent -= 1
  215. elif letter == "m":
  216. d = chr(32) * 4 * indent
  217. print d + "if type(vars['" + mrv + "']) == str:"
  218. d = chr(32) * 4 + d
  219. print d + "vars['" + mrv + "'] = vars['" + mrv + "'].upper()"
  220. elif letter == "n":
  221. d = chr(32) * 4 * indent
  222. print d + "if type(vars['" + mrv + "']) == str:"
  223. d = chr(32) * 4 + d
  224. print d + "vars['" + mrv + "'] = vars['" + mrv + "'].lower()"
  225. elif letter == "f":
  226. d = chr(32) * 4 * indent
  227. print d + """stdout.write("\x1b["+str(1)+";"+str(1)+"H")"""
  228. print d + "stdout.flush()"
  229. elif letter == "v":
  230. mode = "v"
  231. elif letter == "c":
  232. mode = "c"
  233. elif letter == "h":
  234. mode = "h"
  235. elif letter == "b":
  236. print chr(32) * 4 * indent + "locolour += 1"
  237. print chr(32) * 4 * indent + "if locolour > 7: locolour = 0"
  238. print chr(32) * 4 * indent + "colour(locolour, 0)"
  239. elif letter == "a":
  240. print chr(32) * 4 * indent + "locolour -= 1"
  241. print chr(32) * 4 * indent + "if locolour < 0: locolour = 7"
  242. print chr(32) * 4 * indent + "colour(locolour, 0)"
  243. else: print "# " + letter
  244. elif mode == "y":
  245. if letter in alph:
  246. d = chr(32) * 4 * indent
  247. print d + "sleep(figure('" + letter + "', vars, 'n'))"
  248. mode = "n"
  249. mrv = letter
  250. elif mode == "t":
  251. if letter in alph:
  252. d = chr(32) * 4 * indent
  253. print d + "vars['" + mrv + "'] = randint(0, 99)"
  254. mode = "n"
  255. mrv = letter
  256. elif mode == "o":
  257. if letter in alph:
  258. d = chr(32) * 4 * indent
  259. print d + "vars['" + mrv + "'] = 0"
  260. mode = "n"
  261. mrv = letter
  262. elif mode == "i":
  263. if letter in alph:
  264. d = chr(32) * 4 * indent
  265. print d + "vars['" + mrv + "'] = ''"
  266. mode = "n"
  267. mrv = letter
  268. elif mode == "g":
  269. if letter in alph:
  270. mode = "n"
  271. mrv = letter
  272. elif mode == "v":
  273. if letter in alph:
  274. d = chr(32) * 4 * indent
  275. mode = "v2"
  276. mrv = letter
  277. elif mode == "v2":
  278. if letter:
  279. d = chr(32) * 4 * indent
  280. print d + "vars['" + mrv + "'] = chr(" + str(ord(etter)) + ")"
  281. mode = "n"
  282. elif mode == "c":
  283. if letter in alph:
  284. d = chr(32) * 4 * indent
  285. print d + "copythis = vars['" + letter + "']"
  286. mode = "c2"
  287. mrv = letter
  288. elif mode == "c2":
  289. if letter:
  290. d = chr(32) * 4 * indent
  291. print d + "vars['" + letter + "'] = copythis"
  292. mode = "n"
  293. mrv = letter
  294. elif mode == "h":
  295. if letter in alph:
  296. d = chr(32) * 4 * indent
  297. print d + "appthis = vars['" + letter + "']"
  298. mode = "h2"
  299. mrv = letter
  300. elif mode == "h2":
  301. if letter:
  302. d = chr(32) * 4 * indent + "vars['" + letter + "'] = "
  303. print d + "app(vars['" + letter + "'], appthis)"
  304. mode = "n"
  305. mrv = letter
  306. print "colour(7, 0)"