Skip to content

Instantly share code, notes, and snippets.

@alucky0707
Last active August 29, 2015 13:56
Show Gist options
  • Save alucky0707/9028980 to your computer and use it in GitHub Desktop.
Save alucky0707/9028980 to your computer and use it in GitHub Desktop.
The Duodecuple Quine. Please execute run.bat on Windows.

#The Duodecuple Quine

#Interpriter and Compiler version

  • node.js v10.25
  • python 3.3.3
  • ruby 2.0.0p195
  • tcc 0.9.26
  • g++ 4.7.2
  • java 1.7.0_21
  • gauche 0.9.3.3
  • ghc 7.6.3
  • cmd 6.2.9200
  • perl 5.8.8
module BF
class State < Struct.new :buffer, :position
def current
buffer[position].to_i
end
def current= val
buffer[position] = (val + 0x100) % 0x100
end
def position= val
raise "buffer underflow!" if val < 0
super
end
end
class Opcode < Struct.new :operator, :operand
def initialize(operator, operand = nil)
super
end
end
module Compiler
def self.compile src
code, src2 = compile_impl src.split ""
raise "compile error: expected eof" unless src2.empty?
code
end
private
def self.compile_impl src
code = []
while c = src.shift
case c
when *%w(+ - < > . ,)
code << Opcode.new(c.intern)
when ?[
code2, _ = compile_impl src
raise "compile error: expected ']'" unless src.shift == "]"
code << Opcode.new(:"[", code2)
when ?]
src.unshift c
break
end
end
return code, src
end
end
module Executer
def self.execute(code, state = State.new([], 0))
code.each do |c|
case c.operator
when :+ then state.current += 1
when :- then state.current -= 1
when :> then state.position += 1
when :< then state.position -= 1
when :"." then $stdout.putc state.current
when :"," then state.current = $stdin.readchar.unpack('C').first
when :"[" then execute c.operand, state until state.current == 0
end
end
end
end
end
src = $<.read
BF::Executer.execute BF::Compiler.compile src
eval((d=("\\"),s=["r=Math.random();c=',';q=JSON.stringify;n=eval(q('').slice(",
"0,1)+d+'n'+q('').slice(1,2));console.log(['print','puts'][+(r<=0.5)]+'('+q('",
"main(){puts('+q('#include <iostream>'+n+'int main(void){std::cout<<'+q('clas",
"s quine{public static void main(String... args){String s='+q('(display'+q('m",
"ain=putStrLn'+q('package main'+n+'import('+q('fmt')+n+q('strings')+')'+n+'fu",
"nc main(){s:='+q('print join('+q(q('').charAt(0)+c+n)+',split(/'+q(c).slice(",
"0,-1)+'/,'+q('eval((d=('+q(d)+'),s='+q(s.match(/^.{58}|.{1,76}/g))+'.join('+",
"q('')+')))////')+'))')+';fmt.Print('+q('@echo ')+'+strings.Replace(strings.Joi",
"n(strings.Split(s,'+q('')+'),'+q('^')+'),'+q('@')+c+q(d+'@')+c+'-1))}'))+')'",
")+';int b=0;for(int i=0;i<s.length();i++){int c=(int)s.charAt(i);if(c>b)for(",
"int j=0;j<c-b;j++)System.out.print('+q('+')+');else for(int j=b-c;j>0;j--)Sy",
"stem.out.print('+q('-')+');System.out.println('+q('.')+');b=c;}}}') +'<<std:",
":endl;}')+');}')+')');console.error(r<=0.5?'ruby':'python')"].join("")))////
@REM node.js >> python or ruby >> c >> c++ >> java >> brainfuck
@REM >> scheme >> haskell >> go >> bat >> perl >> node.js >> (...endless)
@node quine.js 1> quine.pyrb 2> nextrun
@for /F %%r in (nextrun) do @%%r quine.pyrb|tcc -run - > quine.cxx
@g++ quine.cxx -o quine.exe
@quine.exe > quine.java
@javac quine.java
@java quine | ruby brainfuck.rb | gosh | runghc > quine.go
@go run quine.go > quine.bat
@quine.bat | perl
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment