Showing preview only (244K chars total). Download the full file or copy to clipboard to get everything.
Repository: mame/quine-relay
Branch: master
Commit: c2aa5098d3e9
Files: 45
Total size: 231.7 KB
Directory structure:
gitextract_2_dvvpj1/
├── .gitattributes
├── .github/
│ ├── FUNDING.yml
│ └── workflows/
│ └── main.yml
├── .gitignore
├── Dockerfile
├── Makefile
├── QR.rb
├── README.md
├── SHA256SUMS
├── src/
│ ├── Dockerfile.gen.rb
│ ├── Makefile.gen.rb
│ ├── QR.rb.gen.rb
│ ├── README.md.gen.rb
│ ├── Rakefile
│ ├── SHA256SUMS.gen.rb
│ ├── blc-boot.dat.gen.rb
│ ├── code-gen-pool.rb
│ ├── code-gen.rb
│ ├── dot.github.workflows.main.yml.gen.rb
│ ├── grass-boot.dat.gen.rb
│ ├── langs.png.gen.rb
│ ├── lazyk-boot.dat.gen.rb
│ ├── test.rb
│ ├── thumbnail.png.gen.rb
│ ├── uroboros.txt
│ └── wasm-tmpl.dat.gen.rb
└── vendor/
├── .gitignore
├── Makefile
├── README
├── aheui.rb
├── ante.rb
├── bf.rb
├── blc.rb
├── cfunge-0.9.0.tar.bz2
├── dummy-wasi-runtime.c
├── false.rb
├── golfscript.rb
├── grass.rb
├── lazyk.c
├── ook-to-bf.rb
├── subleq.rb
├── thue.rb
├── unlambda.rb
├── wasi-runtime.js
└── whitespace.rb
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
/Dockerfile linguist-generated
/Makefile linguist-generated
/QR.rb linguist-generated linguist-language=prose
/README.md linguist-generated
/SHA256SUMS linguist-generated
/langs.png linguist-generated
/thumbnail.png linguist-generated
/vendor linguist-vendored
================================================
FILE: .github/FUNDING.yml
================================================
github: mame
================================================
FILE: .github/workflows/main.yml
================================================
name: CI
on:
- push
- pull_request
- workflow_dispatch
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: docker build
run: |
sudo docker build -t quine-relay .
- name: docker run
run: |
sudo docker run --privileged --name qr -e CI=true -t quine-relay
- name: push spoiler
run: |
git clone https://${GITHUB_ACTOR}:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git spoiler --branch spoiler
git -C spoiler rm --quiet -r '*'
sudo docker cp qr:/usr/local/share/quine-relay/QR.rb spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.rs spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.scala spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.scm spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.sci spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.sed spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.spl spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.sl spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.nut spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.sml spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.sq spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.ss spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.swift spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.tcl spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.tcsh spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.t spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.ts spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.unl spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.vala spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.mid spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.v spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.vim spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.vb spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.wasm spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.wat spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.ws spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.xslt spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.yab spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.yorick spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.azm spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.zsh spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.+ spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/qr.adb spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.als spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.aheui spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.a68 spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.ante spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.aj spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.asy spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.dats spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.awk spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.bash spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.bc spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.bsh spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.bef spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.Blc spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.bf spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.c spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.cpp spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.cs spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.chef spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.clj spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.cmake spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.cob spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.coffee spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.lisp spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.cr spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.d spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.dc spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.dhall spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.exs spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.el spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.erl spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.e spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.fsx spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.false spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.fl spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.fish spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.fs spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.f spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.f90 spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.gbs spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.g spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.gdb spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.gel spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.plt spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.go spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.gs spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.gpt spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.grass spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.groovy spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.gz spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.hs spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.hx spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.icn spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.i spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.j spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.java spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.js spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.jq spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.jsfuck spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.kt spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.ksh spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.lazy spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.ls spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.ll spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.lol spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.lua spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.m4 spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.mk spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.mzn spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.mod spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.il spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.mustache spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.asm spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.neko spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.5c spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.nim spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.m spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.ml spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.octave spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.ook spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.gp spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.p spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.pas spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.pl spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.pl6 spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.php spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.png spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.pike spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.ps spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.prolog spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.pr spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.py spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.R spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.ratfor spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.rc spoiler/
sudo docker cp qr:/usr/local/share/quine-relay/QR.rexx spoiler/
cd spoiler
git add .
GIT_AUTHOR_NAME="$(git show -s --format=%an "$GITHUB_SHA")" \
GIT_AUTHOR_EMAIL="$(git show -s --format=%ae "$GITHUB_SHA")" \
GIT_AUTHOR_DATE="$(git show -s --format=%ad "$GITHUB_SHA")" \
GIT_COMMITTER_NAME='GitHub Actions' \
GIT_COMMITTER_EMAIL='actions@github.com' \
TZ=UTC \
git commit --allow-empty -m "spoiler: $(git show -s --format=%s "$GITHUB_SHA")"
git push --quiet origin spoiler
echo The intermediate sources are available: https://github.com/${GITHUB_REPOSITORY}/tree/spoiler
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
================================================
FILE: .gitignore
================================================
/QR*
/qr*
/tmp
/nimcache
/.curry
!QR.rb
gst.im
/src/lazyk-boot.dat
/src/blc-boot.dat
/src/grass-boot.dat
*.sw*
tmp.*proj
================================================
FILE: Dockerfile
================================================
FROM ubuntu:25.10
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get upgrade -y
RUN apt-get -qq install -y apt-utils > /dev/null
RUN apt-get -qq install -y moreutils
RUN chronic apt-get -qq install -y afnix algol68g aplus-fsf aspectj && chronic apt-get clean
RUN chronic apt-get -qq install -y asymptote ats2-lang bash bc && chronic apt-get clean
RUN chronic apt-get -qq install -y bison bsh clisp clojure && chronic apt-get clean
RUN chronic apt-get -qq install -y cmake coffeescript crystal curl && chronic apt-get clean
RUN chronic apt-get -qq install -y dc dhall dotnet8 elixir && chronic apt-get clean
RUN chronic apt-get -qq install -y emacs-nox erlang execline f2c && chronic apt-get clean
RUN chronic apt-get -qq install -y fish flex fp-compiler g++ && chronic apt-get clean
RUN chronic apt-get -qq install -y gambas3-gb-pcre gambas3-scripter gap gawk && chronic apt-get clean
RUN chronic apt-get -qq install -y gcc gdb gdc genius && chronic apt-get clean
RUN chronic apt-get -qq install -y gforth gfortran ghc ghostscript && chronic apt-get clean
RUN chronic apt-get -qq install -y gm2 gnat gnucobol4 gnuplot && chronic apt-get clean
RUN chronic apt-get -qq install -y gobjc golang gpt groff && chronic apt-get clean
RUN chronic apt-get -qq install -y groovy guile-3.0 gzip haxe && chronic apt-get clean
RUN chronic apt-get -qq install -y icont iconx intercal iverilog && chronic apt-get clean
RUN chronic apt-get -qq install -y jasmin-sable jq kotlin ksh && chronic apt-get clean
RUN chronic apt-get -qq install -y libevent-dev libgd-dev libpng-dev libpolyml-dev && chronic apt-get clean
RUN chronic apt-get -qq install -y livescript llvm lua5.3 m4 && chronic apt-get clean
RUN chronic apt-get -qq install -y make minizinc mono-devel nasm && chronic apt-get clean
RUN chronic apt-get -qq install -y neko nickle nim node-typescript && chronic apt-get clean
RUN chronic apt-get -qq install -y nodejs ocaml octave openjdk-11-jdk && chronic apt-get clean
RUN chronic apt-get -qq install -y pari-gp parser3-cgi perl php-cli && chronic apt-get clean
RUN chronic apt-get -qq install -y pike8.0 polyml python3 r-base && chronic apt-get clean
RUN chronic apt-get -qq install -y rakudo ratfor rc regina-rexx && chronic apt-get clean
RUN chronic apt-get -qq install -y ruby ruby-mustache rustc scala && chronic apt-get clean
RUN chronic apt-get -qq install -y scilab-cli sed slsh spin && chronic apt-get clean
RUN chronic apt-get -qq install -y squirrel3 surgescript swi-prolog swiftlang && chronic apt-get clean
RUN chronic apt-get -qq install -y tcl tcsh valac vim && chronic apt-get clean
RUN chronic apt-get -qq install -y wabt xsltproc yabasic yorick && chronic apt-get clean
RUN chronic apt-get -qq install -y zoem zsh && chronic apt-get clean
ADD . /usr/local/share/quine-relay
WORKDIR /usr/local/share/quine-relay
RUN make -C vendor
CMD make check -j 10000
================================================
FILE: Makefile
================================================
MAKEFLAGS += --no-print-directory
PATH := $(CURDIR)/vendor/local/bin:/usr/games:$(PATH)
CLASSPATH := .
find_any0 = $(firstword $(foreach x,$(1),$(if $(shell which $(x) 2>/dev/null),$(x),)))
check = $(if $(2),$(2),$(error $(1) interpreter not found!))
find_any = $(call check,$(1),$(call find_any0,$(2)))
JAVASCRIPT := $(call find_any,JavaScript,nodejs node js)
SCHEME := $(call find_any,Scheme,guile csi gosh)
GBS := $(call find_any,Gambas script,gbs3 gbs2 gba3)
WASI_RUNTIME := $(call find_any,WASI runtime,wasmtime node)
ifeq ($(SCHEME),csi)
SCHEME := csi -s
endif
ifeq ($(WASI_RUNTIME),node)
WASI_RUNTIME := node --experimental-wasi-unstable-preview1 vendor/wasi-runtime.js
endif
.DELETE_ON_ERROR:
all: QR2.rb
@echo
@echo "#############"
@echo "## CHECK ##"
@echo "#############"
@echo
diff -s QR.rb QR2.rb
check: all
@sha256sum --quiet -c SHA256SUMS
QR.rs: QR.rb
@echo
@echo "#######################"
@echo "## 1: Ruby -> Rust ##"
@echo "#######################"
@echo
ruby QR.rb > QR.rs
QR.scala: QR.rs
@echo
@echo "########################"
@echo "## 2: Rust -> Scala ##"
@echo "########################"
@echo
rustc QR.rs
./QR > QR.scala
QR.scm: QR.scala
@echo
@echo "##########################"
@echo "## 3: Scala -> Scheme ##"
@echo "##########################"
@echo
scalac QR.scala
scala QR > QR.scm
QR.sci: QR.scm
@echo
@echo "###########################"
@echo "## 4: Scheme -> Scilab ##"
@echo "###########################"
@echo
$(SCHEME) QR.scm > QR.sci
QR.sed: QR.sci
@echo
@echo "########################"
@echo "## 5: Scilab -> sed ##"
@echo "########################"
@echo
scilab-cli -nb -f QR.sci > QR.sed
QR.spl: QR.sed
@echo
@echo "#############################"
@echo "## 6: sed -> Shakespeare ##"
@echo "#############################"
@echo
sed -E -f QR.sed QR.sed > QR.spl
QR.sl: QR.spl
@echo
@echo "################################"
@echo "## 7: Shakespeare -> S-Lang ##"
@echo "################################"
@echo
spl2c < QR.spl > QR.spl.c
gcc -z muldefs -o QR -I ./vendor/local/include -L ./vendor/local/lib QR.spl.c -lspl -lm
./QR > QR.sl
QR.nut: QR.sl
@echo
@echo "#############################"
@echo "## 8: S-Lang -> Squirrel ##"
@echo "#############################"
@echo
slsh QR.sl > QR.nut
QR.sml: QR.nut
@echo
@echo "##################################"
@echo "## 9: Squirrel -> Standard ML ##"
@echo "##################################"
@echo
squirrel QR.nut > QR.sml
QR.sq: QR.sml
@echo
@echo "#################################"
@echo "## 10: Standard ML -> Subleq ##"
@echo "#################################"
@echo
polyc -o QR QR.sml
./QR > QR.sq
QR.ss: QR.sq
@echo
@echo "#################################"
@echo "## 11: Subleq -> SurgeScript ##"
@echo "#################################"
@echo
ruby vendor/subleq.rb QR.sq > QR.ss
QR.swift: QR.ss
@echo
@echo "################################"
@echo "## 12: SurgeScript -> Swift ##"
@echo "################################"
@echo
surgescript QR.ss > QR.swift
QR.tcl: QR.swift
@echo
@echo "########################"
@echo "## 13: Swift -> Tcl ##"
@echo "########################"
@echo
swiftc QR.swift
./QR > QR.tcl
QR.tcsh: QR.tcl
@echo
@echo "#######################"
@echo "## 14: Tcl -> tcsh ##"
@echo "#######################"
@echo
tclsh QR.tcl > QR.tcsh
QR.t: QR.tcsh
@echo
@echo "########################"
@echo "## 15: tcsh -> Thue ##"
@echo "########################"
@echo
tcsh QR.tcsh > QR.t
QR.ts: QR.t
@echo
@echo "##############################"
@echo "## 16: Thue -> TypeScript ##"
@echo "##############################"
@echo
ruby vendor/thue.rb QR.t > QR.ts
QR.unl: QR.ts
@echo
@echo "##################################"
@echo "## 17: TypeScript -> Unlambda ##"
@echo "##################################"
@echo
tsc --outFile QR.ts.js QR.ts
$(JAVASCRIPT) QR.ts.js > QR.unl
QR.vala: QR.unl
@echo
@echo "############################"
@echo "## 18: Unlambda -> Vala ##"
@echo "############################"
@echo
ruby vendor/unlambda.rb QR.unl > QR.vala
QR.mid: QR.vala
@echo
@echo "##########################"
@echo "## 19: Vala -> Velato ##"
@echo "##########################"
@echo
valac QR.vala
./QR > QR.mid
QR.v: QR.mid
@echo
@echo "#############################"
@echo "## 20: Velato -> Verilog ##"
@echo "#############################"
@echo
mono vendor/local/bin/Vlt.exe /s QR.mid
mono QR.exe > QR.v
QR.vim: QR.v
@echo
@echo "################################"
@echo "## 21: Verilog -> Vimscript ##"
@echo "################################"
@echo
iverilog -o QR QR.v
./QR -vcd-none > QR.vim
QR.vb: QR.vim
@echo
@echo "#####################################"
@echo "## 22: Vimscript -> Visual Basic ##"
@echo "#####################################"
@echo
vim -EsS QR.vim > QR.vb
QR.wasm: QR.vb
@echo
@echo "#######################################################"
@echo "## 23: Visual Basic -> WebAssembly (Binary format) ##"
@echo "#######################################################"
@echo
echo '<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net8.0</TargetFramework><EnableDefaultCompileItems>false</EnableDefaultCompileItems></PropertyGroup><ItemGroup><Compile Include="QR.vb" /></ItemGroup></Project>' > tmp.vbproj
DOTNET_NOLOGO=1 dotnet run --project tmp.vbproj > QR.wasm
QR.wat: QR.wasm
@echo
@echo "####################################################################"
@echo "## 24: WebAssembly (Binary format) -> WebAssembly (Text format) ##"
@echo "####################################################################"
@echo
$(WASI_RUNTIME) QR.wasm > QR.wat
QR.ws: QR.wat
@echo
@echo "###################################################"
@echo "## 25: WebAssembly (Text format) -> Whitespace ##"
@echo "###################################################"
@echo
wat2wasm QR.wat -o QR.wat.wasm
$(WASI_RUNTIME) QR.wat.wasm > QR.ws
QR.xslt: QR.ws
@echo
@echo "##############################"
@echo "## 26: Whitespace -> XSLT ##"
@echo "##############################"
@echo
ruby vendor/whitespace.rb QR.ws > QR.xslt
QR.yab: QR.xslt
@echo
@echo "###########################"
@echo "## 27: XSLT -> Yabasic ##"
@echo "###########################"
@echo
xsltproc QR.xslt > QR.yab
QR.yorick: QR.yab
@echo
@echo "#############################"
@echo "## 28: Yabasic -> Yorick ##"
@echo "#############################"
@echo
yabasic QR.yab > QR.yorick
QR.azm: QR.yorick
@echo
@echo "##########################"
@echo "## 29: Yorick -> Zoem ##"
@echo "##########################"
@echo
yorick -batch QR.yorick > QR.azm
QR.zsh: QR.azm
@echo
@echo "#######################"
@echo "## 30: Zoem -> zsh ##"
@echo "#######################"
@echo
zoem -i QR.azm > QR.zsh
QR.+: QR.zsh
@echo
@echo "#####################"
@echo "## 31: zsh -> A+ ##"
@echo "#####################"
@echo
zsh QR.zsh > QR.+
qr.adb: QR.+
@echo
@echo "#####################"
@echo "## 32: A+ -> Ada ##"
@echo "#####################"
@echo
a+ QR.+ > qr.adb
QR.als: qr.adb
@echo
@echo "########################"
@echo "## 33: Ada -> AFNIX ##"
@echo "########################"
@echo
gnatmake qr.adb
./qr > QR.als
QR.aheui: QR.als
@echo
@echo "##########################"
@echo "## 34: AFNIX -> Aheui ##"
@echo "##########################"
@echo
LANG=C LD_LIBRARY_PATH=/usr/lib/afnix axi QR.als > QR.aheui
QR.a68: QR.aheui
@echo
@echo "#############################"
@echo "## 35: Aheui -> ALGOL 68 ##"
@echo "#############################"
@echo
ruby vendor/aheui.rb QR.aheui > QR.a68
QR.ante: QR.a68
@echo
@echo "############################"
@echo "## 36: ALGOL 68 -> Ante ##"
@echo "############################"
@echo
a68g QR.a68 > QR.ante
QR.aj: QR.ante
@echo
@echo "###########################"
@echo "## 37: Ante -> AspectJ ##"
@echo "###########################"
@echo
ruby vendor/ante.rb QR.ante > QR.aj
QR.asy: QR.aj
@echo
@echo "################################"
@echo "## 38: AspectJ -> Asymptote ##"
@echo "################################"
@echo
ajc QR.aj
java QR > QR.asy
QR.dats: QR.asy
@echo
@echo "############################"
@echo "## 39: Asymptote -> ATS ##"
@echo "############################"
@echo
asy QR.asy > QR.dats
QR.awk: QR.dats
@echo
@echo "######################"
@echo "## 40: ATS -> Awk ##"
@echo "######################"
@echo
patscc -o QR QR.dats
./QR > QR.awk
QR.bash: QR.awk
@echo
@echo "#######################"
@echo "## 41: Awk -> bash ##"
@echo "#######################"
@echo
awk -f QR.awk > QR.bash
QR.bc: QR.bash
@echo
@echo "######################"
@echo "## 42: bash -> bc ##"
@echo "######################"
@echo
bash QR.bash > QR.bc
QR.bsh: QR.bc
@echo
@echo "###########################"
@echo "## 43: bc -> BeanShell ##"
@echo "###########################"
@echo
BC_LINE_LENGTH=4000000 bc -q QR.bc > QR.bsh
QR.bef: QR.bsh
@echo
@echo "################################"
@echo "## 44: BeanShell -> Befunge ##"
@echo "################################"
@echo
bsh QR.bsh > QR.bef
@stty echo
QR.Blc: QR.bef
@echo
@echo "###########################"
@echo "## 45: Befunge -> BLC8 ##"
@echo "###########################"
@echo
cfunge QR.bef > QR.Blc
QR.bf: QR.Blc
@echo
@echo "#############################"
@echo "## 46: BLC8 -> Brainfuck ##"
@echo "#############################"
@echo
ruby vendor/blc.rb < QR.Blc > QR.bf
QR.c: QR.bf
@echo
@echo "##########################"
@echo "## 47: Brainfuck -> C ##"
@echo "##########################"
@echo
ruby vendor/bf.rb QR.bf > QR.c
QR.cpp: QR.c
@echo
@echo "####################"
@echo "## 48: C -> C++ ##"
@echo "####################"
@echo
$(CC) -o QR QR.c
./QR > QR.cpp
QR.cs: QR.cpp
@echo
@echo "#####################"
@echo "## 49: C++ -> C# ##"
@echo "#####################"
@echo
$(CXX) -o QR QR.cpp
./QR > QR.cs
QR.chef: QR.cs
@echo
@echo "######################"
@echo "## 50: C# -> Chef ##"
@echo "######################"
@echo
echo '<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net8.0</TargetFramework><EnableDefaultCompileItems>false</EnableDefaultCompileItems></PropertyGroup><ItemGroup><Compile Include="QR.cs" /></ItemGroup></Project>' > tmp.csproj
DOTNET_NOLOGO=1 dotnet run --project tmp.csproj > QR.chef
QR.clj: QR.chef
@echo
@echo "###########################"
@echo "## 51: Chef -> Clojure ##"
@echo "###########################"
@echo
PERL5LIB=vendor/local/lib/perl5 compilechef QR.chef QR.chef.pl
perl QR.chef.pl > QR.clj
QR.cmake: QR.clj
@echo
@echo "############################"
@echo "## 52: Clojure -> CMake ##"
@echo "############################"
@echo
clojure QR.clj > QR.cmake
QR.cob: QR.cmake
@echo
@echo "##########################"
@echo "## 53: CMake -> Cobol ##"
@echo "##########################"
@echo
cmake -P QR.cmake > QR.cob
QR.coffee: QR.cob
@echo
@echo "#################################"
@echo "## 54: Cobol -> CoffeeScript ##"
@echo "#################################"
@echo
cobc -O2 -x QR.cob
./QR > QR.coffee
QR.lisp: QR.coffee
@echo
@echo "#######################################"
@echo "## 55: CoffeeScript -> Common Lisp ##"
@echo "#######################################"
@echo
coffee --nodejs --stack_size=100000 QR.coffee > QR.lisp
QR.cr: QR.lisp
@echo
@echo "##################################"
@echo "## 56: Common Lisp -> Crystal ##"
@echo "##################################"
@echo
clisp QR.lisp > QR.cr
QR.d: QR.cr
@echo
@echo "########################"
@echo "## 57: Crystal -> D ##"
@echo "########################"
@echo
crystal QR.cr > QR.d
QR.dc: QR.d
@echo
@echo "###################"
@echo "## 58: D -> dc ##"
@echo "###################"
@echo
gdc -o QR QR.d
./QR > QR.dc
QR.dhall: QR.dc
@echo
@echo "#######################"
@echo "## 59: dc -> Dhall ##"
@echo "#######################"
@echo
dc QR.dc > QR.dhall || true
QR.exs: QR.dhall
@echo
@echo "###########################"
@echo "## 60: Dhall -> Elixir ##"
@echo "###########################"
@echo
dhall text --file QR.dhall > QR.exs
QR.el: QR.exs
@echo
@echo "################################"
@echo "## 61: Elixir -> Emacs Lisp ##"
@echo "################################"
@echo
elixir QR.exs > QR.el
QR.erl: QR.el
@echo
@echo "################################"
@echo "## 62: Emacs Lisp -> Erlang ##"
@echo "################################"
@echo
emacs -Q --script QR.el > QR.erl
QR.e: QR.erl
@echo
@echo "##############################"
@echo "## 63: Erlang -> Execline ##"
@echo "##############################"
@echo
escript QR.erl > QR.e
QR.fsx: QR.e
@echo
@echo "##########################"
@echo "## 64: Execline -> F# ##"
@echo "##########################"
@echo
execlineb QR.e > QR.fsx
QR.false: QR.fsx
@echo
@echo "#######################"
@echo "## 65: F# -> FALSE ##"
@echo "#######################"
@echo
echo '<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net8.0</TargetFramework><EnableDefaultCompileItems>false</EnableDefaultCompileItems></PropertyGroup><ItemGroup><Compile Include="QR.fsx" /></ItemGroup></Project>' > tmp.fsproj
DOTNET_NOLOGO=1 dotnet run --project tmp.fsproj > QR.false
QR.fl: QR.false
@echo
@echo "#########################"
@echo "## 66: FALSE -> Flex ##"
@echo "#########################"
@echo
ruby vendor/false.rb QR.false > QR.fl
QR.fish: QR.fl
@echo
@echo "########################"
@echo "## 67: Flex -> Fish ##"
@echo "########################"
@echo
flex -o QR.fl.c QR.fl
gcc -o QR QR.fl.c
./QR > QR.fish
QR.fs: QR.fish
@echo
@echo "#########################"
@echo "## 68: Fish -> Forth ##"
@echo "#########################"
@echo
fish QR.fish > QR.fs
QR.f: QR.fs
@echo
@echo "##############################"
@echo "## 69: Forth -> FORTRAN77 ##"
@echo "##############################"
@echo
gforth QR.fs > QR.f
QR.f90: QR.f
@echo
@echo "##################################"
@echo "## 70: FORTRAN77 -> Fortran90 ##"
@echo "##################################"
@echo
@mv QR.c QR.c.bak
gfortran -o QR QR.f
./QR > QR.f90
@mv QR.c.bak QR.c
QR.gbs: QR.f90
@echo
@echo "######################################"
@echo "## 71: Fortran90 -> Gambas script ##"
@echo "######################################"
@echo
gfortran -o QR QR.f90
./QR > QR.gbs
QR.g: QR.gbs
@echo
@echo "################################"
@echo "## 72: Gambas script -> GAP ##"
@echo "################################"
@echo
$(GBS) QR.gbs > QR.g
QR.gdb: QR.g
@echo
@echo "######################"
@echo "## 73: GAP -> GDB ##"
@echo "######################"
@echo
gap -q QR.g > QR.gdb
QR.gel: QR.gdb
@echo
@echo "###############################"
@echo "## 74: GDB -> GEL (Genius) ##"
@echo "###############################"
@echo
gdb -q -x QR.gdb > QR.gel
QR.plt: QR.gel
@echo
@echo "###################################"
@echo "## 75: GEL (Genius) -> Gnuplot ##"
@echo "###################################"
@echo
genius QR.gel > QR.plt
QR.go: QR.plt
@echo
@echo "#########################"
@echo "## 76: Gnuplot -> Go ##"
@echo "#########################"
@echo
gnuplot QR.plt > QR.go
QR.gs: QR.go
@echo
@echo "############################"
@echo "## 77: Go -> GolfScript ##"
@echo "############################"
@echo
go run QR.go > QR.gs
QR.gpt: QR.gs
@echo
@echo "####################################"
@echo "## 78: GolfScript -> G-Portugol ##"
@echo "####################################"
@echo
ruby vendor/golfscript.rb QR.gs > QR.gpt
QR.grass: QR.gpt
@echo
@echo "###############################"
@echo "## 79: G-Portugol -> Grass ##"
@echo "###############################"
@echo
mv QR.c QR.c.bak
gpt -t QR.c QR.gpt
gcc -o QR QR.c
./QR > QR.grass
mv QR.c.bak QR.c
QR.groovy: QR.grass
@echo
@echo "###########################"
@echo "## 80: Grass -> Groovy ##"
@echo "###########################"
@echo
ruby vendor/grass.rb QR.grass > QR.groovy
QR.gz: QR.groovy
@echo
@echo "##########################"
@echo "## 81: Groovy -> Gzip ##"
@echo "##########################"
@echo
groovy QR.groovy > QR.gz
QR.hs: QR.gz
@echo
@echo "###########################"
@echo "## 82: Gzip -> Haskell ##"
@echo "###########################"
@echo
gzip -cd QR.gz > QR.hs
QR.hx: QR.hs
@echo
@echo "###########################"
@echo "## 83: Haskell -> Haxe ##"
@echo "###########################"
@echo
rm -f QR.o
ghc QR.hs
./QR > QR.hx
QR.icn: QR.hx
@echo
@echo "########################"
@echo "## 84: Haxe -> Icon ##"
@echo "########################"
@echo
haxe -main QR -neko QR.n
neko QR.n > QR.icn
QR.i: QR.icn
@echo
@echo "############################"
@echo "## 85: Icon -> INTERCAL ##"
@echo "############################"
@echo
icont -s QR.icn
./QR > QR.i
QR.j: QR.i
@echo
@echo "##############################"
@echo "## 86: INTERCAL -> Jasmin ##"
@echo "##############################"
@echo
@mv QR.c QR.c.bak
ick -bfOc QR.i
gcc -std=c99 -static QR.c -I /usr/include/ick-* -o QR -lick
./QR > QR.j
@mv QR.c.bak QR.c
QR.java: QR.j
@echo
@echo "##########################"
@echo "## 87: Jasmin -> Java ##"
@echo "##########################"
@echo
jasmin QR.j
java QR > QR.java
QR.js: QR.java
@echo
@echo "##############################"
@echo "## 88: Java -> JavaScript ##"
@echo "##############################"
@echo
javac QR.java
java QR > QR.js
QR.jq: QR.js
@echo
@echo "############################"
@echo "## 89: JavaScript -> Jq ##"
@echo "############################"
@echo
$(JAVASCRIPT) QR.js > QR.jq
QR.jsfuck: QR.jq
@echo
@echo "########################"
@echo "## 90: Jq -> JSFuck ##"
@echo "########################"
@echo
jq -r -n -f QR.jq > QR.jsfuck
QR.kt: QR.jsfuck
@echo
@echo "############################"
@echo "## 91: JSFuck -> Kotlin ##"
@echo "############################"
@echo
ulimit -s unlimited && $(JAVASCRIPT) --stack_size=100000 QR.jsfuck > QR.kt
QR.ksh: QR.kt
@echo
@echo "#########################"
@echo "## 92: Kotlin -> ksh ##"
@echo "#########################"
@echo
kotlinc QR.kt -include-runtime -d QR.jar
kotlin QR.jar > QR.ksh
QR.lazy: QR.ksh
@echo
@echo "#########################"
@echo "## 93: ksh -> Lazy K ##"
@echo "#########################"
@echo
ksh QR.ksh > QR.lazy
QR.ls: QR.lazy
@echo
@echo "################################"
@echo "## 94: Lazy K -> LiveScript ##"
@echo "################################"
@echo
lazyk QR.lazy > QR.ls
QR.ll: QR.ls
@echo
@echo "##################################"
@echo "## 95: LiveScript -> LLVM asm ##"
@echo "##################################"
@echo
@mv QR.c QR.c.bak
lsc QR.ls > QR.ll
@mv QR.c.bak QR.c
QR.lol: QR.ll
@echo
@echo "###############################"
@echo "## 96: LLVM asm -> LOLCODE ##"
@echo "###############################"
@echo
@mv QR.bc QR.bc.bak
llvm-as QR.ll
lli QR.bc > QR.lol
@mv QR.bc.bak QR.bc
QR.lua: QR.lol
@echo
@echo "##########################"
@echo "## 97: LOLCODE -> Lua ##"
@echo "##########################"
@echo
lci QR.lol > QR.lua
QR.m4: QR.lua
@echo
@echo "#####################"
@echo "## 98: Lua -> M4 ##"
@echo "#####################"
@echo
lua5.3 QR.lua > QR.m4
QR.mk: QR.m4
@echo
@echo "##########################"
@echo "## 99: M4 -> Makefile ##"
@echo "##########################"
@echo
m4 QR.m4 > QR.mk
QR.mzn: QR.mk
@echo
@echo "#################################"
@echo "## 100: Makefile -> MiniZinc ##"
@echo "#################################"
@echo
make -f QR.mk > QR.mzn
QR.mod: QR.mzn
@echo
@echo "#################################"
@echo "## 101: MiniZinc -> Modula-2 ##"
@echo "#################################"
@echo
minizinc --solver COIN-BC --soln-sep '' QR.mzn > QR.mod
QR.il: QR.mod
@echo
@echo "#############################"
@echo "## 102: Modula-2 -> MSIL ##"
@echo "#############################"
@echo
gm2 -fiso QR.mod -o QR
./QR > QR.il
QR.mustache: QR.il
@echo
@echo "#############################"
@echo "## 103: MSIL -> Mustache ##"
@echo "#############################"
@echo
ilasm QR.il
mono QR.exe > QR.mustache
QR.asm: QR.mustache
@echo
@echo "#############################"
@echo "## 104: Mustache -> NASM ##"
@echo "#############################"
@echo
mustache QR.mustache QR.mustache > QR.asm
QR.neko: QR.asm
@echo
@echo "#########################"
@echo "## 105: NASM -> Neko ##"
@echo "#########################"
@echo
nasm -felf QR.asm
ld -m elf_i386 -o QR QR.o
./QR > QR.neko
QR.5c: QR.neko
@echo
@echo "###########################"
@echo "## 106: Neko -> Nickle ##"
@echo "###########################"
@echo
nekoc QR.neko
neko QR.n > QR.5c
QR.nim: QR.5c
@echo
@echo "##########################"
@echo "## 107: Nickle -> Nim ##"
@echo "##########################"
@echo
nickle QR.5c > QR.nim
QR.m: QR.nim
@echo
@echo "###############################"
@echo "## 108: Nim -> Objective-C ##"
@echo "###############################"
@echo
nim compile QR.nim
./QR > QR.m
QR.ml: QR.m
@echo
@echo "#################################"
@echo "## 109: Objective-C -> OCaml ##"
@echo "#################################"
@echo
gcc -o QR QR.m
./QR > QR.ml
QR.octave: QR.ml
@echo
@echo "############################"
@echo "## 110: OCaml -> Octave ##"
@echo "############################"
@echo
ocaml QR.ml > QR.octave
QR.ook: QR.octave
@echo
@echo "###########################"
@echo "## 111: Octave -> Ook! ##"
@echo "###########################"
@echo
mv QR.m QR.m.bak
octave -qf QR.octave > QR.ook
mv QR.m.bak QR.m
QR.gp: QR.ook
@echo
@echo "############################"
@echo "## 112: Ook! -> PARI/GP ##"
@echo "############################"
@echo
ruby vendor/ook-to-bf.rb QR.ook QR.ook.bf
ruby vendor/bf.rb QR.ook.bf > QR.gp
QR.p: QR.gp
@echo
@echo "################################"
@echo "## 113: PARI/GP -> Parser 3 ##"
@echo "################################"
@echo
gp -f -q QR.gp > QR.p
QR.pas: QR.p
@echo
@echo "###############################"
@echo "## 114: Parser 3 -> Pascal ##"
@echo "###############################"
@echo
parser3 QR.p > QR.pas
QR.pl: QR.pas
@echo
@echo "#############################"
@echo "## 115: Pascal -> Perl 5 ##"
@echo "#############################"
@echo
fpc QR.pas
./QR > QR.pl
QR.pl6: QR.pl
@echo
@echo "#############################"
@echo "## 116: Perl 5 -> Perl 6 ##"
@echo "#############################"
@echo
perl QR.pl > QR.pl6
QR.php: QR.pl6
@echo
@echo "##########################"
@echo "## 117: Perl 6 -> PHP ##"
@echo "##########################"
@echo
perl6 QR.pl6 > QR.php
QR.png: QR.php
@echo
@echo "########################"
@echo "## 118: PHP -> Piet ##"
@echo "########################"
@echo
php QR.php > QR.png
QR.pike: QR.png
@echo
@echo "#########################"
@echo "## 119: Piet -> Pike ##"
@echo "#########################"
@echo
npiet QR.png > QR.pike
QR.ps: QR.pike
@echo
@echo "###############################"
@echo "## 120: Pike -> PostScript ##"
@echo "###############################"
@echo
pike QR.pike > QR.ps
QR.prolog: QR.ps
@echo
@echo "#################################"
@echo "## 121: PostScript -> Prolog ##"
@echo "#################################"
@echo
gs -dNODISPLAY -q QR.ps > QR.prolog
QR.pr: QR.prolog
@echo
@echo "#####################################"
@echo "## 122: Prolog -> Promela (Spin) ##"
@echo "#####################################"
@echo
swipl -q -t qr -f QR.prolog > QR.pr
QR.py: QR.pr
@echo
@echo "#####################################"
@echo "## 123: Promela (Spin) -> Python ##"
@echo "#####################################"
@echo
spin -T QR.pr > QR.py
QR.R: QR.py
@echo
@echo "########################"
@echo "## 124: Python -> R ##"
@echo "########################"
@echo
python3 QR.py > QR.R
QR.ratfor: QR.R
@echo
@echo "########################"
@echo "## 125: R -> Ratfor ##"
@echo "########################"
@echo
R --slave -f QR.R > QR.ratfor
QR.rc: QR.ratfor
@echo
@echo "#########################"
@echo "## 126: Ratfor -> rc ##"
@echo "#########################"
@echo
ratfor -o QR.ratfor.f QR.ratfor
gfortran -o QR QR.ratfor.f
./QR > QR.rc
QR.rexx: QR.rc
@echo
@echo "#######################"
@echo "## 127: rc -> REXX ##"
@echo "#######################"
@echo
rc QR.rc > QR.rexx
QR2.rb: QR.rexx
@echo
@echo "#########################"
@echo "## 128: REXX -> Ruby ##"
@echo "#########################"
@echo
rexx ./QR.rexx > QR2.rb
clean:
@mv QR.rb quine-relay.rb
rm -f qr QR qr.* QR.* QR2.rb *.class gst.im
@mv quine-relay.rb QR.rb
================================================
FILE: QR.rb
================================================
eval$s=%q(eval(%w(B=92.chr;g=32.chr;puts(eval(%q(N=10.chr;n=0;e=->s{Q[Q[s,B],?"].K(N,B+?n)};E=->s{'("'+e[s]+'")'};d=->s,t=?"{s.K(t){t+t}};def~f(s,n)s.K(/.{1,#{n*255}}/m){yield$S=E[$s=$&]}end;Q=->s,t=?${s.K(t){B+$&}};R=";return~0;";V=->s,a,z{s.K(/(
#{B*4})+/){a+"#{$&.size/2}"+z}};C=%w(System.Console~Write);$C=C*?.;$D="program~QR";$G="~contents~of"+$F="~the~mix!g~bowl";$L="public~static";$W="s.WriteByte";rp=->s,r{v="";[r.!ject(s){|s,j|o={};m=n=0;s.size.times{|i|o[f=s[i,2]]||=0;c=o[f]+=1;m<c&&
(m=c;n=f)};v=n+v;s.K(n,(j%256).chr)},v]};%(fn~mX{Z`x21("{}",#{E["object~QR~extends~App{#{f(%((display~"#{e[%(Zf("1d;s/.//;s/1/~the~sum~of~a~son~and0/g;s/0/~twice/g;s/2/`x59ou~are~as~bad~as/g;s/3/~a~son`x21Speak~your~m!d`x21/g^n#The~Relay~of~Qu!e.^
n#Ajax,~a~man.^n#Ford,~a~man.^n#Act~i:~Qu!e.^n#Scene~i:~Relay.^n#[Enter~Ajax~and~Ford]^n#Ajax:^n#");function[]=f(s);for~i=1:2:length(s),Zf("2%s3",part(dec2b!(hex2dec(part(s,i:i+1))),$:-1:2)),end;endfunction`n#{s,v=rp["Z"+E[%(fun~p~n=Z(Int.toSJ~n`x
5e"~");fun~mX=(p~0;p~0;p~130;List.tabulate(127,p);SJ.map(fn~c=>(p(3+ord~c);Z"-1~0~";c))#{E[~~~~~~%(object"Application"{state"ma!"{foreach(s~![#{f("Z#{E[%(puts~"#{Q[e[%(echo~'a::=`x7e#{Q[Q["let~s=#{E[%(void~p(!t[]c){foreach(!t~v~!~c)stdout.Zf("%c%c
",v/256,v%256);}void~mX{!t[]a;p({19796,26724,0,6,0,1,480,19796,29291,#{s=%(module~QR;!itial~beg!~#{f((%(Module~QR`nSub~MX`nDim~c,n:Dim~s~As~Object=#{C[0]}.OpenStandardOutput():Dim~t()As~Short={26,34,86,127,148,158,200}:For~Each~d~!"BasmCBBBCRE`x60
F<<<<C<`x60C<B`x60BBD#C`x58wasi_snapshot_preview1`x4afd_HBBEEDCDGECB@IUD`x48memoryDB`x48_startBDL|DRBAC~BA`x4alACA4RB9MiCD<AERCA>D`x21BE@ABRCABRCABRCA`x4a`x21CE@~B-BB~CACk:CvACqRC~COBMADRCACRCADRCABRCABRC~BACj:B-BBOBMADRCADRCADRCAFRCMM}CBABM`x7e#{
40.chr}BBBCBBB,BBBDBBB0BBBDBBB4BBB=BBB?BBB;BBB~...^t..^n..(module(import~:wasi_snapshot_preview1:~:fd_H:~(func(param~i32~i32~i32~i32)(result~i32)))(memory(export~:memory:)(data~:^08^00^00^00$:))(func(export~:_start:)i32.const~1~i32.const~0~i32.con
st~1~i32.const~0~call~0~drop))":c=Asc(d):If~c=36:For~c=0To~11:#$W(If(c~Mod~3,Asc(#{s="<?xml#{O="~version='1.0'"}?><?xml-#{I="stylesheet"}~type='text/xsl'href='QR.xslt'?><xsl:#{I+O}~xmlns:xsl='http://www.w3.org/1999/`x58SL/Transform'><xsl:output~me
thod='text'/><#{U="xsl:template"}~match='/'><`x21[CDATA[#{%(su b~f(s$,n) Z(s$);:for~i=1to~n~Z("Y");:next:end~sub:f("#{V[e[%(H,format="#{y="";f("^H{-}{txt}{#{Q["echo~-E~$'#{Q[Q[E[%(with~Ada.Text_Io;procedure~qr~is~beg!~Ada.Text_Io.Put("#{d[%(trans
~B(Buffer)`ntrans~O(n){`nB:add(Byte(+~128~n))}`ntra ns~f(v ~n){ `nO(+(/~ n~64)107)`nO(n:mod~64)`nO~v}`ntrans~D(n){if(<~n~4){f(+(*~6~n)9)48}{if(n:odd-p){D(-~n~3)`nf~27~48`nf~36~11}{D(/~n~2)`nf~21~48`nf~48~20}}}`ntrans~S(Buffer"#{e[%W[ST
RINGz:=~226+~153,a:=z+~166,b:=a+"2"+z+~160,c:=b+" 8"+ z +~165,t:="#{d[%(class~QR{#$L~void~ma!(SJ[]a){a=#{E["H('#{Q[e["implement~ma!0()=Z"+E[ "BEGIN{Z#{E[%(echo~'#{%(f(s){System.out.Z(s);}s="389**6+44*6+00
p45*,";for(c:#{E[(s="#!clude<iostream>`n!t~mX{s td ::cout<<#{E[%(class~Program{#$L~void~MX{#$C("Qu!e~Relay~Coffee. ^n^nIngredients.^n");for(!t~i=9;i++<126;)#$C($"{i}~g~ca
ffe!e~{i}^n");#$C("^nMethod.^n");foreach(char ~c~!#{E[%((doseq[s(lazy-cat["IDENTIFICATION~DIVISION.""PROGR AM-ID.~QR.""PROCEDURE~DIVISION."'DISPLA`x59](map~#
(str"~~~~^""(.replace~%1"^"""^"^"")"^"")(re- seq~#".{1,45}""#{e["(f=(n)->Array(n+1).jo!~'Y');c onsole.log('%s',#{V[E[%((H-l!e"#{e["puts#{E["i
mport~std.stdio;void~mX{H(`x60#{"['']p[#{"I O.puts"+E[%((pr!c~"#{e["`nma!(_)->`nio:fH# {d[E[%(echo~"#{e['Zfn("""'+d[?"+"%option~no
yywrap`n%%`n%%`n!t~mX{puts#{E["echo~'#{Q[ Q[%(~:~A~."#{g*9}"~;~:~B~A~."~WRITE(*,*)' "~A~;~:~C~B~T`x59PE~."~'"~CR~;~:~D~S"~#$
D"~C~S^"~Z~^"(&"~C~S^"~#{e[%(Z"#{e["s:= Outp utTextUser();WriteAll(s,#{E[%(Zf"# {e[d[f('set~Z" -";Z'+E[%(package~ma!;import"fmt";fun
c~mX{fmt.Pr!t#{E[%(236:j;{119:i;{206i- :i;.4 8<{71+}{[i]^48-*}if}%}:t;"al goritmo~QR;!"[195][173]++'ci o~imprima("'"013141"t"/12131"t~6*"/1
:1918151:??6271413/4=3626612/2/353251 215/ `x5a0`x5a0R"t"#{e[%(z=new~j ava.util.zip.G`x5aIPOutputStream(Syste m.out);z.H('#{"ma!=putStr"+E["clas
s~QR{#$L~function~mX{neko.Lib.Z#{E[%( procedure~mX;i:=c:=0;s :=#{E[%(.class~public~ QR`n.super~#{$T="java/io/Pr!tStream"}`n.meth od~#$L~ma!([L#{S="java/lang/S"}J
;)V~;]`n.limit~stack~2`ngetstatic~#{S }yst em/out~L#$T;`nldc~"#{e[%(class~QR{ #$L~void~ma!(SJ[] v){SJ~c[]=new~SJ[99999],y="",z=y,s="#{z=t=(0..r=q= 126).map{|n|[n,[]]};a="";b=->n{
a<<(n%78+55)%84+42};(%(P={0:'[+[]]',m:' ((+[])'+(C="['constructor']")+"+[])['11']"};for(R ~!~B=('`x21[] @`x21`x21[]@[][[]]@'+(A="[]['fill']")+"@([]+[])['fontc olor']([])@(+('11e20')+[])['s
plit']([])@"+A+C+"('return~escape')( )("+A+')').split('@'))for(E~!~D=eval(G='('+B[R]+'+[ ])'))P[T=D[E ]]=P[T]||G+"['"+E+"']";for(G='[',B=0;++B<36;)P[D=B.toSJ(36 )]=B<10?(G+='+`x21+[]')+']':
P[D]||"(+('"+B+"'))['to'+([]+[])" +C+"['name']]('36')";A+=C+"('console.log(unescape(^"";fo r(E~!~G= #{E["fun~ma!(a:Array<SJ>){Z#{Q[E[%(p(){~echo~-n~$1;};f(){~for ~x~!~$(p~"$1"|od~-An~-tu1~-
v);do;p~$4;for((j=$3;j--;));do;h ~$2~$x~$j;done;done;};p~k^`x60;h(){~p~^`x60${1:$(($2>>$3&1)) :2}; };f~'console.log#{Q[E[%(@s=global[#{i=(s=%(`x48AI~1.2`nVISIBLE~"# {"x=sJ.K(#{V[E["changequot
e(<@,@>)`ndef!e(p,<@#{"all:`n` t@echo~'#{d["solve~satisfy;output~[#{E["MODULE~QR;FROM~StrIO~IM PO RT~WriteSJ;BEGIN~#{(%(.assembly~t{}.method~#$L~void~MX{.entrypo!t~ldstr"#{e["m{ {`x21:~x`nqr:~|-`n~:db`x60
#{e[s="$Z#{E["Zf#{E["echo#{E ["#import<stdio.h>#{N}!t~mX{puts#{E["Z_sJ"+E["s=double#{E["Z#{E["$c onsole :l!e[#{"#$D(output);beg!~H(#{f((p="eval";%($_="#{s,v=rp["$_='#{ Q[%(<?php~$z=3+$w=strlen(
$s=#{Q[E["!t~mX{H#{E["(#{Q[ "qr:-H('#{Q[e["!it{#{f(%(Z('cat("')`nfor~c~!"".jo!(["echo~'say~''%s''' ^n"%l~for~l~!#{E[d[d["eval$s=%q(#$s)",?'],?']]}.spl it("^n")]):Z('r=fput(cha
r(%d))'%ord(c))`nZ('end^n" )')#),6){"Zf#{d[$S,?%]};"}}}"],?']}').",B]})Z~quit"]+R}}"]]})*3;echo"^x8 9PNG^r^n^x1a^n";$m="";$t="^xc0^0^xff";for($i=- 1;++$i<128*$z;$m.=$c--?(
$w-$c||$i>$z)&&$i/$z<($c< $w?ord($s[(!t)($c/3)]):$c--%3+2)?$t[2].$t[$c%3%2].$t[$c%3]:"^0^0^0":"^0")$c =$i%$z;foreach(array("I`x48DR".pack("NNCV ",$w+2,128,8,2),"IDAT".g
zcompress($m),"IEND")as$d )echo~pack("NA*N",strlen($d)-4,$d,crc32($d));).K(B,"`x7f"),?']}';s:g/^x7f/Y/ ;Z~$_",128..287];s="$_='#{Q[s,c=/['Y] /]}';$n=32;$s='#{Q[v,c]}
';$s=`x7es{..}{$a=$&;$b= chr(--$n&255);`x7es/$b/$a/g;}eg;Z";(s+N*(-s.size%6)).unpack("B*")[0].K(/.{6}/){ n=$&.to_i~2;((n+14)/26*6+n+47).chr }}";s|.|$n=ord$&;substr
~unpack(B8,chr$n-!t($n/3 2)*6-41),2|eg;eval~pack'B*',$_).scan(/[~,-:A-z]+|(.)/){p="s++#{$1?"chr~#{$1.ord} +e":$&+?+};"+p};p),1){"'#$s',"} }'')end.".K(/[:;()]/){?
`x5e+$&}}]"]};quit"]};t =num2cell(b=11-ceil(s/13));for~n=1:9m={};for~i=1:141f=@(x,y,n)repmat(['Ook'~char(x )~'~Ook'~char(y)~'~'],[1~ab s(n)]);m(i)=[f(z=46,63,
n)~f(q=z-(i<13)*13,q,i- 13)~f(33,z,1)~f(63,z,n)];end;t(x=b==n)=m(diff([0~s(x)])+13);end;Zf('%%s',t{:})"]]+R }}"]}"]}`n"]};"]}`x60`n~ global~_start`n~_start:m
ov~edx,#{s.size}`n~mov~ ecx,m`n~mov~ebx,1`n~mov~eax,4`n~!t~128`n~mov~ebx,0`n~mov~eax,1`n~!t~128`nx:~|`n~}} { {{qr}}}"]}"call~void~ [mscorlib]#{C*"::"}(sJ)r
et})).K(/()[#{i=94.chr} "]+|[#{i}']+/){["WriteSJ(",$&,");"]*($1??":?')}}END~QR."]}];",?$].K(?'){"'^''"}} '" }@>)`np"], ?&,? &]},'&(%d+)&',func tion(s)return~sJ.rep('Y'
,tonumber(s))end);Z(x)" .K(/[:"]/,":^0")}"`n`x4bT`x48`x58B`x59E~B`x59E)).size+1}x~i8]c"#{s.K(/[^"`n`t]/ ) {"^%02`x58"%$ &.ord}}^00" declare~i32@put s(i8*)def!e~i32@mX{%1=cal
l~i32@puts(i8*getelement ptr([#{i}x~i8],[#{i}x~i8]*@s,i32~0,i32~0))ret~i32~0})],?#].K(?',%('"'"'))}'~k k i~7~'`x60`x60s `x60`x60s`x60` x60s` x60`x60s`x60 `x60s`x60`x60s`x60`x60s`x
60`x60si';h(){~p~${1:$(( (($2%83-10)>>((2-$3)*2))%4)):1};};f~'AG-`x48-`x48Fy.IlD==;=jdlAy=;=jldltld lt l{lAulAy=jtlldlAyFy=?=jdlAyGFyF yG2AFy>zlAFF BCjldGyGF y>GFy.AGy=G==n`x48==nlldC=
j@=jtlldltldlAut11'~ski^` x60~3)]]}~}"]})A+="'+`x21[]+'"+G.charCodeAt(E).toSJ(16);for(A+="^".repla ce(/ '+`x21[]+'/g,^"%^")))')()",R=0;R <9;R++)A=A.repla ce(/'. *?'/g,function(B){T=[];for(
E=1;B[E+1];)T.push(P[B[E++ ]]);return~T.jo!('+')});console.log('"'+A+'"'))).bytes{|n|r,z=z[n]||( b[r/78]; b[r];q<6083&&z[n]=[q+=1,[]];t[n] )};b[r/78];b[r]}";! t~i =0,n=0,q=0;for(;++n<126;)c[n
]=""+(char)n;for(;i<#{a.si ze};){q=q*78+(s.charAt(i)-13)%84;if(i++%2>0){y=q<n?c[q]:y;c[n++]=z +y.charAt( 0);System.out.Z(z=c[q]);q=0;}}}})]}"`n!vokevirtual~# $ T/Zln(L#{S}J;)V`nreturn`n.end
~method)+N]};H("DO,1<-#"||* s);s?while~t:=ord(move(1))do{i+:=1;u:=-i;every~0to~7do{u:=u*2+t %2;t/:=2};H("P LEASE")^(i%4/3);H("DO,1SUB#"||i||"<-#"||((c-u)%25 6));c:=u;};H("PLEASEREADOUT,1^
nPLEASEGIVEUP");end)]};}}"]. tr(?"+B,"`x21`x7e")}'.tr('`x7e`x21','Y`u0022')as~byte[]);z.c lose())]}"{"W""w"@ j~1+:j^-~118%1+*}%"/35512416612G61913@921/17A 331513"t'");fim')]};})],61){"Zn#
$S`n"},?%]]}"`nquit)]});CloseS tream(s);QUIT;"]}")]}"~DUP~A~."~DO~10~I=1,"~.~CR~S"~&A, &"~C~."~10~~~~~~CONTI NUE"~CR~S^"~&A)^",&"~C~0~DO~B~."~&char( "~COUNT~.~."~),&'"~CR~LOOP~S^"~&^
"^""~C~S"~end~#$D"~C~A~."~STOP" ~CR~A~."~END"~CR~B`x59E~;~D~),B],?`x21].K(?',%('"'" '))}'"]};}".K(?"){'"34," '}.K(N){'"10,"'}+?",?%]+'~""")' ]}")],?`x7e]}."]}"))]}]p['']pq"}`x6
0);}"]}"]}"))].K(?`x60,"Yx60"),'# {f(',')}']})"]}"))["~~~~^"~^".""STOP~RUN."])] (Zln(str"message(STATUS~^"~~ ~~~"(.replace(.rep lace(str~s)"Y""YY")"^"""Y^"")"^")")))
).reverse]})#$C($"Put~caffe!e~{(!t) c}~!to#$F.^n");#$C("Liquify#$G.^nPour#$ G~!to~the~bak!g~dish.^n^nServes~1. ^n");}})]};}/****//****/";t={};b="";L="
";n=i=0;D=->n{L<<(n+62)%92+35;D};s.by tes{|c|n>0?n-=1:(t[c]=(t[c]||[ ]).reject{|j|j<i-3560};x=[];t[c].map{| j|k=(0..90).f!d{|k|not~s[i+1+k]==s[j+k]}|
|91;k>4&&x<<[k,j]};x=x.max)?(n,j=x;x=b. size;(u=[x,3999 ].m!;D[u%87][u/87];L<<b[0,u];b[0,u]="";x-=u) while~x>0;x=4001+i-j;D[x%87][x/87][n-5]):b<<
c;t[c]+=[i+=1]};"#!clude<stdio.h>`nchar*p= #{E[L]},s[999999],*q=s;!t~mX{!t~n,m;for(;*p;){n=(* p-5)%92+(p[1]-5)%92*87;p+=2;if(n>3999)for(m=(*p
++-5)%92+6;m--;q++)*q=q[4000-n];else~for(;n-- ;)*q++=*p++;}puts(s)#{R}}")]}){s+="00g,";for(m=1;m<256;m* =2)s+="00g,4,:"+(c/m%2>0?"4+":"")+",";f(s);s="4,:,"
;}f(s+s);for(c:Base64.getDecoder().decode("kaARERE `x58/I0ALn3n5ef6l/Pz8+fnz58/BOf5/7/hE`x58/O`x5azM5mC`x58/Oczm`x5a zBPn5+`x58/OczMznBL/nM5m`x5azBPu++fPPOc5zngnnO`x5azO`x5
agnBMGAW7A==")){c=c<0?256+c:c;for(i=0;i++<3;c/=8)f(c%8); f("8*+8*+,");}f("@");).K(?',%('"'"'))}'|sed~-e's/Y/YY/g'~-e's/"/Yq/g'~-e's/.*/Z ~"&"^nquit/')]}}"]],?']}');".K(/^+/){"`x5e#{$&.size}`x5e"}]}.s
plit("Y`x5e");for(!t~i=1;i<a.length;a[0]+=a[i+1],i+=2){a[0]+="Y".repeat(Integer.parseInt(a[i]));}System.out.Z(a[0]);}})]}";FORiTO`~UPBtDO`~INTn:=ABSt[i];Z(~(50+n%64)+c+~(50+n%8MOD8)+c+~(50+nMOD8)+b+"`x4a"+a)OD]*"REPR"]}")`nwhile(`x21=(S:length)0){
`ntrans~c(S:read)`nD(c:to-!teger)`nf~35~39}`nf~24~149`n!terp:library"afnix-sio"`ntrans~o(afnix:sio:OutputTerm)`no:H~B)].K(N,'"&Character'+?'+'Val(10)&"')}");end;)]+"`nsys.exit~0",B],?']}'",/[^{}]/]}}",35){y<<",`n"+$S;"%s"}}")+y],'",','):f("']}",0)
)}]]></#{U}></xsl:#{I}>";s.size*16+3}.ToSJ("x8")(1`x58or~7-c*2^3)),92)):Next:Else:n=(c>124)*(8*c-#{s.size+1294}):Do~While~n>127:#$W(128+(127And~n)):n^=128:Loop:#$W(If(c<125,If((c-1)^7-8,c+66*(c>65And~c<91),t(c-57)),n)):End~If:Next:For~Each~c~!"#{d
[s].K~N,'"&~VbLf~&"'}":#$W(Asc(c)):Next:End~Sub:End~Module)).l!es.map{|s|"let~s=#{E[s]}`nput=s`nZ`n"}.jo!+"qa`x21",3){%($H("%s",#$S);)+N}}end~endmodule);W=s.size*72+4;"%d,%d"%[W/65536,W%65536]}});foreach(!t~c~!#{E[s]}.data)foreach(!t~v~!~a={0,9,7,
4,5,c/100*7/6+1,c%100/10*7/6+1,c%10*7/6+1,7})p({144,v=15450+v*256,384,v});p({255,12032});})]},i=0,t='k';while(s[i])t='^x60.'+s[i++]+t;console.log(t)",B],?`x21].K(?',%('"'"'))}'"^n::=^na")],/[`[`]$]/]}")]}",4){$S+?,}}])Console.H(s);Application.exit
();}})]};Z"0~0~-1");)],127..255];f(%(variable~s=`x60#{s.K(/.{1,234}/){$&.K("`x60",%(`x60+"`x60"+`x60))+"`x60+`n`x60"}}`x60,i;for(i=0;i<129;i++)s=strreplace(s,pack("C",255-i),substrbytes(`x60#{v[0,99]}`x60+`n`x60#{v[99..-1]}`x60,i*2+1,2));Zf("%s",s
)),7){"f('%s')`n"%$s.unpack("`x48*")}}Zf("^n#[Exeunt]");quit)]}")),196){%(Z#$S;)}}}"]});})).gsub(/[!HJKXYZ^`~]/){[B*2,:write,B,:tring,:gsub,"ain()",B*4,:print,g,:in][$&.ord%47%12]})))*"")#_buffer_for_future_bug_fixes_#_buffer_for_future_bug_fixes_
#_buffer_for_future_bug_fixes_#_buffer_for_future_bug_fixes_#_buffer_for_future_bug_fixes_#_buffer_for_future_bug_fixes_#_buffer_for_future_bug_fixes_#_buffer_for_future_bug_fixes_#_buffer_for_future_bug_fixes_#_buffer_for_future_bug_fixes_#_buffe
#################################################################################### Quine Relay -- Copyright (c) 2013, 2014 Yusuke Endoh (@mametter), @hirekoke ###################################################################################)
================================================
FILE: README.md
================================================
# Quine Relay
[](https://github.com/mame/quine-relay/actions?query=workflow%3ACI)
## What this is
[QR.rb](https://github.com/mame/quine-relay/blob/master/QR.rb) is a Ruby program that generates
a Rust program that generates
a Scala program that generates
...(through 128 languages in total)...
a REXX program that generates
the original Ruby code again.
![Language Uroboros][langs]
[langs]: langs.png
(If you want to see the old 50-language version, see the [50](https://github.com/mame/quine-relay/tree/50) branch.)
## Usage
### Ubuntu
If you are using Ubuntu 25.10 (Questing Quokka), you can follow these steps.
#### 1. Install all the interpreters/compilers.
First, you need to type the following apt-get command to install them all.
$ sudo apt-get install afnix algol68g aplus-fsf aspectj asymptote \
ats2-lang bash bc bsh clisp clojure cmake coffeescript crystal dc \
dhall dotnet8 elixir emacs-nox erlang execline f2c fish flex \
fp-compiler g++ gambas3-gb-pcre gambas3-scripter gap gawk gcc gdb gdc \
genius gforth gfortran ghc ghostscript gm2 gnat gnucobol4 gnuplot \
gobjc golang gpt groovy guile-3.0 gzip haxe icont iconx intercal \
iverilog jasmin-sable jq kotlin ksh libevent-dev libpolyml-dev \
livescript llvm lua5.3 m4 make minizinc mono-devel nasm neko nickle \
nim node-typescript nodejs ocaml octave openjdk-11-jdk pari-gp \
parser3-cgi perl php-cli pike8.0 polyml python3 r-base rakudo ratfor \
rc regina-rexx ruby ruby-mustache rustc scala scilab-cli sed slsh spin \
squirrel3 surgescript swi-prolog swiftlang tcl tcsh valac vim wabt \
xsltproc yabasic yorick zoem zsh
Then, build the bundled interpreters.
$ sudo apt-get install cmake libpng-dev libgd-dev groff bison curl
$ make -C vendor
#### 2. Run each program on each interpreter/compiler.
$ ulimit -s unlimited
$ ruby QR.rb > QR.rs
$ rustc QR.rs && ./QR > QR.scala
$ scalac QR.scala && scala QR > QR.scm
$ guile QR.scm > QR.sci
$ scilab-cli -nb -f QR.sci > QR.sed
$ sed -E -f QR.sed QR.sed > QR.spl
$ spl2c < QR.spl > QR.spl.c && gcc -z muldefs -o QR -I ./vendor/local/include -L ./vendor/local/lib QR.spl.c -lspl -lm &&
./QR > QR.sl
$ slsh QR.sl > QR.nut
$ squirrel QR.nut > QR.sml
$ polyc -o QR QR.sml && ./QR > QR.sq
$ ruby vendor/subleq.rb QR.sq > QR.ss
$ surgescript QR.ss > QR.swift
$ swiftc QR.swift && ./QR > QR.tcl
$ tclsh QR.tcl > QR.tcsh
$ tcsh QR.tcsh > QR.t
$ ruby vendor/thue.rb QR.t > QR.ts
$ tsc --outFile QR.ts.js QR.ts && nodejs QR.ts.js > QR.unl
$ ruby vendor/unlambda.rb QR.unl > QR.vala
$ valac QR.vala && ./QR > QR.mid
$ mono vendor/local/bin/Vlt.exe /s QR.mid && mono QR.exe > QR.v
$ iverilog -o QR QR.v && ./QR -vcd-none > QR.vim
$ vim -EsS QR.vim > QR.vb
$ echo '<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net8.0</TargetFramework><EnableDefaultCompileItems>false</EnableDefaultCompileItems></PropertyGroup><ItemGroup><Compile Include="QR.vb" /></ItemGroup></Project>' > tmp.vbproj &&
DOTNET_NOLOGO=1 dotnet run --project tmp.vbproj > QR.wasm
$ $(WASI_RUNTIME) QR.wasm > QR.wat
$ wat2wasm QR.wat -o QR.wat.wasm && $(WASI_RUNTIME) QR.wat.wasm > QR.ws
$ ruby vendor/whitespace.rb QR.ws > QR.xslt
$ xsltproc QR.xslt > QR.yab
$ yabasic QR.yab > QR.yorick
$ yorick -batch QR.yorick > QR.azm
$ zoem -i QR.azm > QR.zsh
$ zsh QR.zsh > QR.+
$ a+ QR.+ > qr.adb
$ gnatmake qr.adb && ./qr > QR.als
$ LANG=C LD_LIBRARY_PATH=/usr/lib/afnix axi QR.als > QR.aheui
$ ruby vendor/aheui.rb QR.aheui > QR.a68
$ a68g QR.a68 > QR.ante
$ ruby vendor/ante.rb QR.ante > QR.aj
$ ajc QR.aj && java QR > QR.asy
$ asy QR.asy > QR.dats
$ patscc -o QR QR.dats && ./QR > QR.awk
$ awk -f QR.awk > QR.bash
$ bash QR.bash > QR.bc
$ BC_LINE_LENGTH=4000000 bc -q QR.bc > QR.bsh
$ bsh QR.bsh > QR.bef
$ cfunge QR.bef > QR.Blc
$ ruby vendor/blc.rb < QR.Blc > QR.bf
$ ruby vendor/bf.rb QR.bf > QR.c
$ gcc -o QR QR.c && ./QR > QR.cpp
$ g++ -o QR QR.cpp && ./QR > QR.cs
$ echo '<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net8.0</TargetFramework><EnableDefaultCompileItems>false</EnableDefaultCompileItems></PropertyGroup><ItemGroup><Compile Include="QR.cs" /></ItemGroup></Project>' > tmp.csproj &&
DOTNET_NOLOGO=1 dotnet run --project tmp.csproj > QR.chef
$ PERL5LIB=vendor/local/lib/perl5 compilechef QR.chef QR.chef.pl &&
perl QR.chef.pl > QR.clj
$ clojure QR.clj > QR.cmake
$ cmake -P QR.cmake > QR.cob
$ cobc -O2 -x QR.cob && ./QR > QR.coffee
$ coffee --nodejs --stack_size=100000 QR.coffee > QR.lisp
$ clisp QR.lisp > QR.cr
$ crystal QR.cr > QR.d
$ gdc -o QR QR.d && ./QR > QR.dc
$ dc QR.dc > QR.dhall || true
$ dhall text --file QR.dhall > QR.exs
$ elixir QR.exs > QR.el
$ emacs -Q --script QR.el > QR.erl
$ escript QR.erl > QR.e
$ execlineb QR.e > QR.fsx
$ echo '<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net8.0</TargetFramework><EnableDefaultCompileItems>false</EnableDefaultCompileItems></PropertyGroup><ItemGroup><Compile Include="QR.fsx" /></ItemGroup></Project>' > tmp.fsproj &&
DOTNET_NOLOGO=1 dotnet run --project tmp.fsproj > QR.false
$ ruby vendor/false.rb QR.false > QR.fl
$ flex -o QR.fl.c QR.fl && gcc -o QR QR.fl.c && ./QR > QR.fish
$ fish QR.fish > QR.fs
$ gforth QR.fs > QR.f
$ gfortran -o QR QR.f && ./QR > QR.f90
$ gfortran -o QR QR.f90 && ./QR > QR.gbs
$ gbs3 QR.gbs > QR.g
$ gap -q QR.g > QR.gdb
$ gdb -q -x QR.gdb > QR.gel
$ genius QR.gel > QR.plt
$ gnuplot QR.plt > QR.go
$ go run QR.go > QR.gs
$ ruby vendor/golfscript.rb QR.gs > QR.gpt
$ mv QR.c QR.c.bak && gpt -t QR.c QR.gpt && gcc -o QR QR.c && ./QR > QR.grass &&
mv QR.c.bak QR.c
$ ruby vendor/grass.rb QR.grass > QR.groovy
$ groovy QR.groovy > QR.gz
$ gzip -cd QR.gz > QR.hs
$ rm -f QR.o && ghc QR.hs && ./QR > QR.hx
$ haxe -main QR -neko QR.n && neko QR.n > QR.icn
$ icont -s QR.icn && ./QR > QR.i
$ ick -bfOc QR.i && gcc -std=c99 -static QR.c -I /usr/include/ick-* -o QR -lick &&
./QR > QR.j
$ jasmin QR.j && java QR > QR.java
$ javac QR.java && java QR > QR.js
$ nodejs QR.js > QR.jq
$ jq -r -n -f QR.jq > QR.jsfuck
$ nodejs --stack_size=100000 QR.jsfuck > QR.kt
$ kotlinc QR.kt -include-runtime -d QR.jar && kotlin QR.jar > QR.ksh
$ ksh QR.ksh > QR.lazy
$ lazyk QR.lazy > QR.ls
$ lsc QR.ls > QR.ll
$ llvm-as QR.ll && lli QR.bc > QR.lol
$ lci QR.lol > QR.lua
$ lua5.3 QR.lua > QR.m4
$ m4 QR.m4 > QR.mk
$ make -f QR.mk > QR.mzn
$ minizinc --solver COIN-BC --soln-sep '' QR.mzn > QR.mod
$ gm2 -fiso QR.mod -o QR && ./QR > QR.il
$ ilasm QR.il && mono QR.exe > QR.mustache
$ mustache QR.mustache QR.mustache > QR.asm
$ nasm -felf QR.asm && ld -m elf_i386 -o QR QR.o && ./QR > QR.neko
$ nekoc QR.neko && neko QR.n > QR.5c
$ nickle QR.5c > QR.nim
$ nim compile QR.nim && ./QR > QR.m
$ gcc -o QR QR.m && ./QR > QR.ml
$ ocaml QR.ml > QR.octave
$ mv QR.m QR.m.bak && octave -qf QR.octave > QR.ook && mv QR.m.bak QR.m
$ ruby vendor/ook-to-bf.rb QR.ook QR.ook.bf && ruby vendor/bf.rb QR.ook.bf > QR.gp
$ gp -f -q QR.gp > QR.p
$ parser3 QR.p > QR.pas
$ fpc QR.pas && ./QR > QR.pl
$ perl QR.pl > QR.pl6
$ perl6 QR.pl6 > QR.php
$ php QR.php > QR.png
$ npiet QR.png > QR.pike
$ pike QR.pike > QR.ps
$ gs -dNODISPLAY -q QR.ps > QR.prolog
$ swipl -q -t qr -f QR.prolog > QR.pr
$ spin -T QR.pr > QR.py
$ python3 QR.py > QR.R
$ R --slave -f QR.R > QR.ratfor
$ ratfor -o QR.ratfor.f QR.ratfor && gfortran -o QR QR.ratfor.f &&
./QR > QR.rc
$ rc QR.rc > QR.rexx
$ rexx ./QR.rexx > QR2.rb
You will see that `QR.rb` is the same as `QR2.rb`.
$ diff QR.rb QR2.rb
Alternatively, just type `make`.
$ make
Note: It may take a lot of memory to compile some files.
### Docker
Simply build the image and run a container as follows:
$ docker build -t qr .
$ docker run --privileged --rm -e CI=true qr
Note: You must run in privileged mode, otherwise the `maxima` command will fail.
If you want to check the generated files, you can mount the local directory in the Docker container (but still use the `vendor` directory of the container), as follows:
$ docker run --privileged --rm -e CI=true -v $(pwd):/usr/local/share/quine-relay -v /usr/local/share/quine-relay/vendor qr
### Other platforms
You may find [instructions for other platforms in the wiki](https://github.com/mame/quine-relay/wiki/Installation).
If you do not use these Linux distributions, please find your own way.
If you manage it, please let me know. I wish you good luck.
## Interpreter/compiler versions tested
I used the following Ubuntu deb packages to test this program.
\# |language |ubuntu package |version
----|----------------------------|----------------------------------|--------------------------------
1 |Ruby |ruby |1:3.3
2 |Rust |rustc |1.85.1ubuntu1
3 |Scala |scala |2.11.12-6
4 |Scheme |guile-3.0 |3.0.10+really3.0.10-5
5 |Scilab |scilab-cli |2024.1.0+dfsg-7ubuntu1
6 |sed |sed |4.9-2build2
7 |Shakespeare |*N/A* |-
8 |S-Lang |slsh |2.3.3-5
9 |Squirrel |squirrel3 |3.1-8.2
10 |Standard ML |polyml, libpolyml-dev |5.7.1-5build1
11 |Subleq |*N/A* |-
12 |SurgeScript |surgescript |0.5.4.4-1.1
13 |Swift |swiftlang |6.0.3-2build1
14 |Tcl |tcl |8.6.16
15 |tcsh |tcsh |6.24.13-2
16 |Thue |*N/A* |-
17 |TypeScript |node-typescript |5.0.4+ds1-2
18 |Unlambda |*N/A* |-
19 |Vala |valac |0.56.18-2
20 |Velato |*N/A* |-
21 |Verilog |iverilog |12.0-2build2
22 |Vimscript |vim |2:9.1.0967-1ubuntu6
23 |Visual Basic |dotnet8 |8.0.120-8.0.20-0ubuntu1
24 |WebAssembly (Binary format) |wabt |1.0.36+dfsg+\~cs1.0.36-2ubuntu1
25 |WebAssembly (Text format) |wabt |1.0.36+dfsg+\~cs1.0.36-2ubuntu1
26 |Whitespace |*N/A* |-
27 |XSLT |xsltproc |1.1.43-0.1
28 |Yabasic |yabasic |1:2.91.4-1
29 |Yorick |yorick |2.2.04+dfsg1-14
30 |Zoem |zoem |21-341-2
31 |zsh |zsh |5.9-8ubuntu2
32 |A+ |aplus-fsf |4.22.1-13
33 |Ada |gnat |14.1ubuntu1
34 |AFNIX |afnix |3.8.0-1.1ubuntu1
35 |Aheui |*N/A* |-
36 |ALGOL 68 |algol68g |3.1.2-1
37 |Ante |*N/A* |-
38 |AspectJ |aspectj |1.9.6-1
39 |Asymptote |asymptote |3.05+ds-2
40 |ATS |ats2-lang |0.4.2-3
41 |Awk |gawk |1:5.3.2-1build1
42 |bash |bash |5.2.37-2ubuntu5
43 |bc |bc |1.07.1-4
44 |BeanShell |bsh |2.0b4-20
45 |Befunge |*N/A* |-
46 |BLC8 |*N/A* |-
47 |Brainfuck |*N/A* |-
48 |C |gcc |4:15.2.0-4ubuntu1
49 |C++ |g++ |4:15.2.0-4ubuntu1
50 |C# |dotnet8 |8.0.120-8.0.20-0ubuntu1
51 |Chef |*N/A* |-
52 |Clojure |clojure |1.12.0-1
53 |CMake |cmake |3.31.6-2ubuntu6
54 |Cobol |gnucobol4 |4.0\~early\~20200606-8
55 |CoffeeScript |coffeescript |2.7.0+dfsg1-2
56 |Common Lisp |clisp |1:2.49.20250504.gitf662209-1
57 |Crystal |crystal, libevent-dev |1.14.0+dfsg-1
58 |D |gdc |4:15.2.0-4ubuntu1
59 |dc |dc |1.07.1-4
60 |Dhall |dhall |1.42.1-1build2
61 |Elixir |elixir |1.18.3.dfsg-1
62 |Emacs Lisp |emacs-nox |1:30.1+1-9ubuntu1
63 |Erlang |erlang |1:27.3.4.1+dfsg-1build1
64 |Execline |execline |2.9.6.1-1
65 |F# |dotnet8 |8.0.120-8.0.20-0ubuntu1
66 |FALSE |*N/A* |-
67 |Flex |flex |2.6.4-8.2build1
68 |Fish |fish |4.0.6-0ubuntu1
69 |Forth |gforth |0.7.3+dfsg-9build4.1
70 |FORTRAN77 |f2c |20240504-1
71 |Fortran90 |gfortran |4:15.2.0-4ubuntu1
72 |Gambas script |gambas3-scripter, gambas3-gb-pcre |3.20.4-1build1
73 |GAP |gap |4.15.0-1
74 |GDB |gdb |16.3-1ubuntu2
75 |GEL (Genius) |genius |1.0.27-1build4
76 |Gnuplot |gnuplot |6.0.2+dfsg1-2ubuntu1
77 |Go |golang |2:1.24\~2
78 |GolfScript |*N/A* |-
79 |G-Portugol |gpt |1.1-8
80 |Grass |*N/A* |-
81 |Groovy |groovy |2.4.21-10
82 |Gzip |gzip |1.13-1ubuntu4
83 |Haskell |ghc |9.6.6-4
84 |Haxe |haxe |1:4.3.7-1
85 |Icon |icont, iconx |9.5.25a-1
86 |INTERCAL |intercal |30:0.30-6
87 |Jasmin |jasmin-sable |2.5.0-3
88 |Java |openjdk-11-jdk |11.0.28+6-1ubuntu1
89 |JavaScript |nodejs |20.19.4+dfsg-1
90 |Jq |jq |1.8.1-3ubuntu1
91 |JSFuck |nodejs |20.19.4+dfsg-1
92 |Kotlin |kotlin |1.3.31+ds1-3
93 |ksh |ksh |20240113-1.0.10-2
94 |Lazy K |*N/A* |-
95 |LiveScript |livescript |1.6.1+dfsg-3
96 |LLVM asm |llvm |1:20.0-63ubuntu1
97 |LOLCODE |*N/A* |-
98 |Lua |lua5.3 |5.3.6-2build2
99 |M4 |m4 |1.4.19-8
100 |Makefile |make |4.4.1-2
101 |MiniZinc |minizinc |2.9.2+dfsg1-1
102 |Modula-2 |gm2 |4:15.2.0-4ubuntu1
103 |MSIL |mono-devel |6.12.0.199+dfsg-6
104 |Mustache |ruby-mustache |1.1.1-2
105 |NASM |nasm |2.16.03-1
106 |Neko |neko |2.4.1-1
107 |Nickle |nickle |2.103
108 |Nim |nim |2.2.4-1
109 |Objective-C |gobjc |4:15.2.0-4ubuntu1
110 |OCaml |ocaml |5.3.0-3
111 |Octave |octave |9.4.0-1
112 |Ook! |*N/A* |-
113 |PARI/GP |pari-gp |2.17.2-1
114 |Parser 3 |parser3-cgi |3.5.1-3
115 |Pascal |fp-compiler |3.2.2+dfsg-46
116 |Perl 5 |perl |5.40.1-6build1
117 |Perl 6 |rakudo |2024.09-4
118 |PHP |php-cli |2:8.4+96ubuntu1
119 |Piet |*N/A* |-
120 |Pike |pike8.0 |8.0.1956-1
121 |PostScript |ghostscript |10.05.0dfsg1-0ubuntu4
122 |Prolog |swi-prolog |9.2.9+dfsg-1
123 |Promela (Spin) |spin |6.5.2+dfsg-2
124 |Python |python3 |3.13.7-1
125 |R |r-base |4.5.1-1
126 |Ratfor |ratfor |1.07-1
127 |rc |rc |1.7.4+97.gceb59bb-6
128 |REXX |regina-rexx |3.9.5+dfsg1-0.2
Note that some languages are not available in Ubuntu (marked as *N/A*).
This repository contains their implementations in `vendor/`.
See also `vendor/README` for detail.
## Frequently asked questions
### Q. Why?
A. [Take your pick](https://github.com/mame/quine-relay/issues/11).
### Q. How?
A. Good news: I have published a book, ["The World of Obfuscated, Esoteric, Artistic Programming"](http://gihyo.jp/book/2015/978-4-7741-7643-7).
It explains how to write a quine, an ascii-art quine, and an uroboros quine like this quine-relay.
You can buy my book on [amazon.co.jp](http://www.amazon.co.jp/dp/4774176435).
(It also contains my almost all of my (about forty) works, including
[alphabet-only Ruby program](http://www.slideshare.net/mametter/ruby-esoteric-obfuscated-ruby-programming-5088683),
[radiation-hardened quine](https://github.com/mame/radiation-hardened-quine),
etc., and explains many techniques for writing such programs.)
Bad news: It is written in Japanese.
I hope you can translate it into English <strike>and help me earn royalties</strike>.
### Q. Language XXX is missing!
A. See [the language inclusion criteria][criteria] in detail. (In short, please create a deb package and contribute it to Ubuntu.)
See also [:heart:][sponsors].
[criteria]: https://github.com/mame/quine-relay/wiki/Language-inclusion-criteria
[sponsors]: https://github.com/sponsors/mame
### Q. Does it really work?
A. [](https://github.com/mame/quine-relay/actions?query=workflow%2ACI)
### Q. How long did it take you?
A. [Are you trying to cross the world line?](https://github.com/mame/quine-relay/issues/60)
### Q. The code does not fit in my screen!
A. [Here you go][thumbnail].
[thumbnail]: thumbnail.png
### Q. How was the code generated?
A.
$ sudo apt-get install rake ruby-cairo ruby-rsvg2 ruby-gdk-pixbuf2 \
optipng advancecomp ruby-chunky-png
$ cd src
$ rake clobber
$ rake
## History
## for Ubuntu 13.04
[50 languages](https://github.com/mame/quine-relay/tree/ad3f8222c796969db8cfb1bae015a46c2387b3d6)
Added: Ruby, Scala, Scheme, bash, Smalltalk, Unlambda, Tcl, Whitespace, Verilog, Vala, Ada, ALGOL 68, Awk, Brainfuck, Boo, C, C++, C#, Cobol, Clojure, Fortran90, FORTRAN77, Forth, Common Lisp, CoffeeScript, Groovy, Go, INTERCAL, Icon, Haskell, Jasmin, Java, LLVM asm, Logo, Lua, Makefile, MSIL, Objective-C, JavaScript, OCaml, Octave, Parrot asm, Pascal, Perl, PHP, Pike, Prolog, Python, R, REXX
## for Ubuntu 13.10
[50 languages](https://github.com/mame/quine-relay/tree/ea4d39fb1ebc7ee23ec6f60ca7bfa0d465b5806a)
## for Ubuntu 14.04
[50 languages](https://github.com/mame/quine-relay/tree/d16bf072e3063dc476dc440c8f3e33d7426e98db)
## for Ubuntu 14.10
[64 languages](https://github.com/mame/quine-relay/tree/e449baba456d4885102482cbd365335be59241b2)
Added: Scilab, S-Lang, SPL, LOLCODE, Maxima, NASM, Neko, Nickle, Ook!, PARI/GP, Piet, PPT (Punched tape), PostScript, Ratfor
## for Ubuntu 15.04
[100 languages](https://github.com/mame/quine-relay/tree/7749715289ca162eb1c1eb1ff1ed1393edc41630)
Added: Subleq, Standard ML, Thue, Visual Basic, XSLT, Yorick, Zoem, A+, AFNIX, Ante, Asymptote, ATS, BLC8, Befunge, bc, Chef, CDuce, D, dc, eC, Emacs Lisp, Erlang, F#, Falcon, FALSE, Gambas script, GAP, GEL (Genius), Gnuplot, G-Portugol, Gri, Haxe, Julia, Lisaac, Lazy K, Kaya
## for Ubuntu 15.10
[100 languages](https://github.com/mame/quine-relay/tree/f45035f867c7c8f7b4e12fa63e7c8eef9aabecad)
Removed: Boo, Falcon, Kaya
Added: Elixir, Jq, Nim
## for Ubuntu 16.04
[100 languages](https://github.com/mame/quine-relay/tree/233ba8b4e1d7e4c59a46d64481048a8ea7f4400e)
## for Ubuntu 17.04
[100 languages](https://github.com/mame/quine-relay/tree/e65a798da23df0367d9eb5e4d46f00d87e6cb342)
Removed: SPL, Gri, Logo, Parrot asm
Added: Squirrel, Dafny, Grass, MiniZinc
## for Ubuntu 17.10
[100 languages](https://github.com/mame/quine-relay/tree/943b83801a1bd019ebf348adc78df2cdfde06513)
Removed: CDuce
Added: Rust
## for Ubuntu 18.04
[128 languages](https://github.com/mame/quine-relay/tree/6e173d76e972e1da7992b84768bf9f4c788949ed)
Removed: Gambas script, Perl
Added: Shakespeare, sed, tcsh, TypeScript, Velato, Vimscript, Yabasic, zsh, Aheui, AspectC++, AspectJ, BeanShell, CMake, Flex, Fish, GDB, GolfScript, Gzip, Gri, JSFuck, ksh, LiveScript, M4, Mustache, nesC, Parser 3, Perl 5, Perl 6, Promela (Spin), rc
## for Ubuntu 19.04
[128 languages](https://github.com/mame/quine-relay/tree/c8898351500682cea02219313e9203da7eca5505)
Removed: Scilab, G-Portugol, nesC
Added: Curry, Gambas script, GeneratorScriptingLanguage
## for Ubuntu 19.10
[128 languages](https://github.com/mame/quine-relay/tree/13041dbf3f80a90c9221ef94f8e8bc385800b6fd)
Removed: Gri
Added: Scilab
## for Ubuntu 20.04
[128 languages](https://github.com/mame/quine-relay/tree/62e2cc2d61d99719328094d185d899bc03a851fb)
## for Ubuntu 20.10
[128 languages](https://github.com/mame/quine-relay/tree/114f44fefd610812d2f5e3032603762752ed51b2)
Removed: AspectC++, eC
Added: SurgeScript, Dhall
## for Ubuntu 21.04
[128 languages](https://github.com/mame/quine-relay/tree/d8df33bad3693afd0bd3bf1c2b1cedd5753325dc)
Removed: Curry
Added: G-Portugol
## for Ubuntu 21.10
[128 languages](https://github.com/mame/quine-relay/tree/158b6251d36a48122ec0006feaf759d8b1973b0f)
## for Ubuntu 22.04
[128 languages](https://github.com/mame/quine-relay/tree/7b81d8704549d31814499c5300be2be9568467c8)
Removed: Julia, Nim, Pike
Added: WebAssembly (Text format), WebAssembly (Binary format), Kotlin
## for Ubuntu 22.10
[128 languages](https://github.com/mame/quine-relay/tree/362962dd2d55d7c36dd9fa3e0d4c0c52c0e6a18f)
## for Ubuntu 23.04
[128 languages](https://github.com/mame/quine-relay/tree/5dfdada5aa58f6a97ae85b84f86c7eb091225a8c)
Removed: Squirrel, GeneratorScriptingLanguage
Added: Crystal, Nim
## for Ubuntu 23.10
[128 languages](https://github.com/mame/quine-relay/tree/74c4cc7d79fccbb1c8315070b9efea03cb787755)
Removed: Smalltalk
Added: Modula-2
## for Ubuntu 24.04
[128 languages](https://github.com/mame/quine-relay/tree/20d7f437c053b8e0b301ba996d124a4b812e3571)
Removed: PPT (Punched tape)
Added: Pike
## for Ubuntu 24.10
[128 languages](https://github.com/mame/quine-relay/tree/2ed61a62c9d31121b39e740c89107085c122f478)
Removed: Dafny, Maxima
Added: Execline, Squirrel
## for Ubuntu 25.04
[128 languages](https://github.com/mame/quine-relay/tree/b9c8056cad4589fe650163a3fd0cea4b3055fce4)
## for Ubuntu 25.10
[128 languages](https://github.com/mame/quine-relay/tree/5298413382ea707061e04aa077f99872d159a7b8)
Removed: Lisaac
Added: Swift
## License
The MIT License applies to all resources
*except* the files in the `vendor/` directory.
The files in the `vendor/` directory are from third-parties
and are distributed under different licenses.
See `vendor/README` in detail.
---
The MIT License (MIT)
Copyright (c) 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024 Yusuke Endoh (@mametter), @hirekoke
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
================================================
FILE: SHA256SUMS
================================================
12623f713c91a8a66799c2c48fc6d69b5c8e667534e6ba0f6456eb874076c081 *QR.rb
9df1959f513e14e295e338bd60324068555aa69f9a39d70f24e789f494d0a82c *QR.rs
7099d0b66ce499616935a8f40948421faade9fa32f3ade5e61b112fbf90c7b67 *QR.scala
9e8be7aa29be0373379ce94135a4f3eb3dfb7d13eadf9217f92fdea2aae42bec *QR.scm
6d765ab621adc206990eeb6b56de0c5fb04ef82b8d927e7b4016f289fdffe4e3 *QR.sci
b2a6f25d27c2ec1331d64cde25397a6f3ad279664634b5625397c4fa072abf50 *QR.sed
8960c90239ca53a093cd169c36b82096ffd5e861554023ac9a71c4865d43776e *QR.spl
1f5a84b47ce3806a97094d2ccb19f598c0cd65be90bbb9860e2c2c6dd9c1490f *QR.sl
c9e148f618bb8ce458cf105b894ac6dc5c88ab35003998a126bdacc5c1060c07 *QR.nut
6ec2a8743395bcaa0449aef53561ce3cfedcf043d241ac2309406f5d4bd21f38 *QR.sml
7e9d0dfa4b902adebc72111b1dc9d820bcacfad059930c01085ac7b3f81e2a1e *QR.sq
62a990a76ac114ebc67e45382a6dce8bbbbddd550b3a87bc6f3c3fc9233134b1 *QR.ss
16e55ff01e922ccdd8f8f60588b0ca520835c7962ba4bba78cadc17768295234 *QR.swift
414a439517704a14dd257be4d9cceeee411a94fceffd8f67808bbd5beb7c8e17 *QR.tcl
afd18299f737e2b106aa34d937affb01e09a00be66488f2598942791224ad8b4 *QR.tcsh
de3f2b463d6c24fb873b73bf33e4c64c1fa05b77d001641f6b95ed26ec9c720f *QR.t
c046065994ea12c8e3d79c2f22db10d7bc4b467f6bd5497e17b94e03252d285f *QR.ts
c1f686f2e5e28135ebe443443a2e42aa919e9d211d40271c6b75b5b536df0333 *QR.unl
dfa15a63952a7b401935bdb529c01cbe5c09a4cb2f8f40ca504abdf575662b8d *QR.vala
21a09c188ce2b7e6a207572ec4e8b5b0ad019d7a7205f362c0d4b7a840897026 *QR.mid
5f17ee6f8b2c9071220edd280e2e36924a4986c5035b97a79306cd802e509e21 *QR.v
5c62c705bdc929fc7948abe930e9a9c6ad424e8e0ba39d2e87dec145216d2286 *QR.vim
45056322828773f4a0d5d20c54be4b846bf0203af201eaac51cf14d539d2d060 *QR.vb
43790b395321678896f721d8da7fab91a784d0d5c69b1dae9f745f8afc56e036 *QR.wasm
67a51a505f0f37e6f2ea6f47eabdd0fce42effc4b950d75158ada64459361edd *QR.wat
aaec5d6e1cf79681ef6dfc04fe7796afc568eb4283ae209c43670083a3cbb174 *QR.ws
5368d3e1658d37b0dfb75a14ed23250a35bc7311301b91450cbc1a7d73eff891 *QR.xslt
4b426b6364d3b759f321d29737ab0b8bed4e6b1dbff6276afedccd85b129c5af *QR.yab
310af9cf037708d18f99580d96af2c949f9a536715ebc1b3edcb33b71b2fa478 *QR.yorick
aba3b8abecce9ad46c14597e47d8c7acae5e54069b09b59a001ff04bf9cc2000 *QR.azm
6b437b52493d214197d834282b7b07d60e6a126689be4f2c7fdca43e27de6e45 *QR.zsh
bf00ee4220495a50727cc37e345d641202c0a372a6c31ceb522d835b885fba3d *QR.+
89dba8652bfa4c9e56508c5981258503b49091a8641c40a1b1cc683ad63fdfff *qr.adb
cf1c668b168e26a401581389c08d41560ed3c0b5e37c35e21552e671a872c524 *QR.als
c502a439d37b41518368dd277033d335f6ebb54d61d6b17496ba29caea132c34 *QR.aheui
e0d785bd6bcbae22956ab50265413b8535458896303d7ab9470fdec60db9c6e4 *QR.a68
8fabf20d41561d2876ff024f550f2c19edda0009579643468a0277fbbd403d28 *QR.ante
0ad2978a1a2f8aa60929c895557031ce201edd6cb56993735d2e48e3d1947c30 *QR.aj
ac615a877bb6f8434cdec39813a4e052c514a6d3fe0304f0c4b32f9de195772b *QR.asy
5cd48139791b9f32140664deb448108c97d8aae3578d795ed0a365f8922f9d98 *QR.dats
a21fdb1bc5cc1f8468defac905921156b642cea98f9bd82147b8c7c28b111514 *QR.awk
dca132455085f2745bacd50cbb9cc8a57a4cf8d1a5de99de8222ff705e3aaaf5 *QR.bash
d802710fb2ce4af4abf8b6749ed5f66f2e96964f2238c4ef387b030407372efd *QR.bc
49f6bbf2ad1b3540da516aefa5e12ad866a08b0d3886e36b1e809bcfe244376a *QR.bsh
de30728cc7125000e0e6cf6f6640538e536c3ff39178a5290e0b67008969c27a *QR.bef
04fb756bf661fae309465e04d86b030832b45f21969f13a39ca4a37e1f244bd0 *QR.Blc
fb520c3323b946fc6026179e2312d6e345dd44a384b1dfd38280aadba472c728 *QR.bf
2f90d2915d01b7d4f5eb01e38efa4f9174551e5e1803dfa1e41aa14dc4d19670 *QR.c
0b9a14819367894121cb7ac096179c48a5142531a29c05c49892eb51638d7a84 *QR.cpp
e638911ea743a293eb031011c0099e3749fc01d7d211ef755dc93bdf6616edb8 *QR.cs
56f4e86a9306260a0b04e5fa33e2b2629ba5a35263ccba2d7e23ec9353835e3f *QR.chef
0b37f015a5bc532e9a98c308181851ae6881fd47d87eaa969b47050c396a1717 *QR.clj
e2d787d27bf447a41e42b1a56e6f12036650ba1f28a45d81e0332b8c22be04cd *QR.cmake
f042e6896aec32247ff3e83b78ed946e34cf88861acf44de0d822568b66a845e *QR.cob
026db578fb2d1a4df22bc2b2a573cdc96886be831a042ec4a3a1e78e114ed3ef *QR.coffee
8ae17e1600f94c49604758fd947630b6742bf4d75d5674068e20af80a0e88c6c *QR.lisp
6065e90fbc5390d7aff7794cc5f0722cd8317704809b2916be4426938b9e4055 *QR.cr
9c4e3a3e80bff9ba0ffc7584e217e9c279158823870e3d1eb6c6e83053a4282f *QR.d
1d779f095d0c2b033fb543b20a21f23e4fabaf67b1ef8a8509eb553b58d7eb98 *QR.dc
589b275a368d00943eef8153d420cb7e45c61072176f5f019abaf47e69a3f871 *QR.dhall
f78a791439f3855552c8403823e879936fcb5aab24430fddad4ffbe2e2749512 *QR.exs
be237d208d1d2cc397adc15e4e2e6b9b5006a487f27b2e3cd449c237ff6fea19 *QR.el
aac501df84bed42ab741cc045a8adf8f789c2edb6ec165de31657acebf02781f *QR.erl
d916525e98362d3d6f52b9054de1b517147b0c21a5b491137ab960b3fc136226 *QR.e
971320ceddf347f91b105992aa0714bf1588c61b19fcebe55b86baec25c73db7 *QR.fsx
86c6dd5a0d58ec1e68b1ed21332a7a4b5bd4e46acf8958a90011d2c2ed996d5e *QR.false
c9e193115153ce16773ba8837fb935bfa93e24709e5ffb32d85236076daa0d92 *QR.fl
e9f759f28ecbfeebf7b7b3248074244de4d0043f7a9d7cb86ac7dd5fef5fdb40 *QR.fish
1657cfafda71d29987615f79c8fd82cbc36b34d56718d4a1d7f51baccebf5c34 *QR.fs
10f6b1742f4372ee4d054e02a2a10d31e8079270664f77620fc827a1e09fdcdc *QR.f
f7a2bbdec2bc47162966d206b7b85c6d51a00ab04d8231e90575015153b7c891 *QR.f90
f56167c040a8fa8ae35db8041e48f1e0c15b8da6222dea044ab27ec06acfa9ca *QR.gbs
39beb2f88d9289944cd784f674db09bde2054213023e0a1bbe095051024add92 *QR.g
0fdb573c2c19b7b50c5fbe8b0d69ea607e80eaef1041dd553dbef08fe1685fb9 *QR.gdb
381830f625dc5359177d3a15dfad69848fdbe705ae83087e6b748ddc8b1c71df *QR.gel
418cdd7f990d1f019ab8687645d1a4f4252f17bb3c8b838fb2d8b45ec06e3170 *QR.plt
c603a7a903c99d4ac7098831f31a4601046b88bbb61efbd909f0c2c7b2816183 *QR.go
94251e39c4e0a7acc1c10904d5eb1080ced2588d96ff0f05cda6e116ff40f6f4 *QR.gs
c49dc6ccb84103de4d881e2a109fa6bad80b1fb8c6f1e59cc031835f5f135fa4 *QR.gpt
389faf61261586ec08c209ffe78239ede67f91955a6df12a8fd447025cac36b4 *QR.grass
6b17989e98a11754c741f7d462bddba17d6c0795294510277aa237053c595c01 *QR.groovy
f57be29f963e19e54cfc558722b5d8023a66409619c9a00407b44c77a291db88 *QR.gz
4b5aa836e0e8c7e4a82763e948f66d6bf969474c37176104f1018ca4c9a9207b *QR.hs
18e31dac4491412fa5b600bf269ebcbbf6084c80540599608370bdcd482ee671 *QR.hx
33726b852a2b3a55319ea8f764410f2dbe7d2960a06b91e200b4d923a861b2e7 *QR.icn
a53f3bb0269f323e284bbd4007af41a261d9fd9420004806c6ce5e153c1543cc *QR.i
74c9a0dfe67d4a89b97ee54bf24704d7215b48862d03c80151214269b38c09d6 *QR.j
1d692da0ba8c6b04a60aefc87ac7da1cb937bab8b1f501a34b1a7013e9688305 *QR.java
8039f166ab0ce892e0bcdd78fc5f203bb115f94748f374a63cf241f6a33776fb *QR.js
83e07ba7dff9a8db351a0449e6ef4a1b08b5a069fb357c1e05599fa6bf50e672 *QR.jq
944b6cf24bf7ddc4a1ce1e40130dacf60b5999d6914f8efa047c1188bdd2ce06 *QR.jsfuck
ad65cf3eda51297f6665d6c14b0b5d3676611f4d595ab07e52a74133f58ef4a2 *QR.kt
e4955fd14ec9af1409c3c930fa2d26b378cc5a439fb68873698e044cd2f6789f *QR.ksh
633b7936c4981d8a0e7d75a3f5ee72f17f65c0fc750084e2fe923b4de7d0e06b *QR.lazy
358ec5fb72e695845036595aef0b0a7c98bdb6c8e0c365faafc898d8b15926a1 *QR.ls
1d50d0deeeca335bb589f27dfbfe4214ec87cf075268e2822f17ce019d4df930 *QR.ll
7ad8bfd091fef07608038101557e10454eaf71b1aa0d05ac07904121acf2a1e2 *QR.lol
a0207688cdd56e2a3061a000230affc8de557ae34d77287b62bea1ee8fae1b9f *QR.lua
d17ae7faca6eedce73d2cad23166eb6b6e55c2a3675c1a9119fd7eea48ee9251 *QR.m4
4eeffb7c5c3a20a26dfd66fe5ccbbe2bbe0ced830e0ddcab63cc3cf8f2f4eeb9 *QR.mk
ca4359361ae7702db6f816a8e7482ae5b419af8b69be866765164de3acfaceff *QR.mzn
af97b86c1721993b8476ad2cc9b0aa78880e48588144f099108e52b10e8f7c3d *QR.mod
2497238e2b1f7977b22e67277c6279921e871b0c2804a9a32212e710d8f85f11 *QR.il
4af6900b554510b99b8e922ca55871a1783ad4b9f77dd48ef7ea767fdca477fe *QR.mustache
923564cbf178e5c2025fb8a7e06652f40931bdb4100d3488aaa956bd999f672d *QR.asm
0a4d3bf1bc0b619e7de55a684788372178450eb4d5eeb9fb7e637fbc45d00eaa *QR.neko
8d0f55a65ee193fe742b580927c3c71366fa2d386a9fcd52c3660e9435509ad7 *QR.5c
a8a6a3bb228d60182e6855266b77c6f7d43fc28a6d321ee7541511bcc6e86b42 *QR.nim
b1ccccd92cf89f33119be28a63b536bccaa1789a50ff73d20b1252a2a5af0ef5 *QR.m
c4d62f4ed17c8734bd9d33e1312fc4b357e0503ab67a25f98c42975a2b6bfaf3 *QR.ml
1e98dddc2dcf041ed95b44b786772447151bd0dafd52049964b193b11324f9ce *QR.octave
d855fad9b90051da6e46928f1dc550d014701e2924b138f65214e3a9367266f0 *QR.ook
adb0980458098bc1a168858461d840242109e9e900cb883ab0d9516a99a0e9c3 *QR.gp
0b0e2b15a611acd8e2ef03dfb107de9dbea67e04afcf4dc75ce5f6bf33b2ea80 *QR.p
f76ca81f5cd8f8bf13cc578a051b2268cd422dabe0c755bde02dba75567ce83e *QR.pas
e73c69d99568d5293561b198933dac0ca1f255258c936c8cf63824794eb8821a *QR.pl
e5bd8ac748f20dae70c4792280e95fc477a03cbe34696ace3a10c85ebcca0a25 *QR.pl6
cee0abe37b1f2ee044d18934dba7f2af43287e1a1ed3ae8ab7304f6c41c61c94 *QR.php
18f3abe96e38466c31969fb5ceea480170f1f9d7089d6620a2a08d5b913386c4 *QR.png
7639f1d7c80abc8d8c44f3effe72158e2dc8d8d1c0624c68c81f0a8225dcca22 *QR.pike
cbd418d7d572ceaccd8856bf5153e8f8c3740dc55d47bbd1dbdae55e83285888 *QR.ps
5a0456754a1f2f5c87b82ca83cf35ddaca605057ba675c758744dc5bf1f8d9f4 *QR.prolog
e8252e383bcc102cbcb51f0b6d35e44890c70ff0fc2cef6ac0cbe604e7a88a0b *QR.pr
83ec85f8784ee7765e2679616962250891b99a9d98d42f6300b622a1e52bd56f *QR.py
3ca5fa842d5ce951ee7a287ea578f63401e8e9e64b8fdec8040abbc0b6df2dd5 *QR.R
db14c6a8343fa742e3056f6882f0f024458bcf431b546e9af4d4edf28c34fce8 *QR.ratfor
ea356e5891386571c753178d30d2e86cb59cf7612e925cd1262c87869b849ae9 *QR.rc
5b74c101ae27ab30e67cb070d25cdadf1436a6f11593edc16320d960a468ae67 *QR.rexx
================================================
FILE: src/Dockerfile.gen.rb
================================================
require_relative "code-gen"
apts = RunSteps.flat_map {|s| s.apt }
other_packages = %w(libpng-dev libgd-dev groff flex bison curl)
apts = [*apts.flatten.compact.uniq, *other_packages].uniq.sort
dockerfile = []
dockerfile << "FROM ubuntu:#{ `bash -c 'source /etc/os-release && echo $VERSION_ID'`.chomp }"
dockerfile << "ENV DEBIAN_FRONTEND noninteractive"
dockerfile << "RUN apt-get update && apt-get upgrade -y"
dockerfile << "RUN apt-get -qq install -y apt-utils > /dev/null"
dockerfile << "RUN apt-get -qq install -y moreutils"
apts.each_slice(4) do |apt|
dockerfile << "RUN chronic apt-get -qq install -y #{ apt.join(" ") } && chronic apt-get clean"
end
dockerfile << "ADD . /usr/local/share/quine-relay"
dockerfile << "WORKDIR /usr/local/share/quine-relay"
dockerfile << "RUN make -C vendor"
dockerfile << "CMD make check -j 10000"
File.write("../Dockerfile", dockerfile.join("\n") + "\n")
================================================
FILE: src/Makefile.gen.rb
================================================
require_relative "code-gen"
OUT = []
def banner(s1, s2=nil, i=nil)
s = "## #{ "#{ i + 1 }: " if i }#{ s1 }#{ ' -> ' + s2 if s2 } ##"
OUT << "\t@echo"
OUT << "\t@echo \"#{ "#" * s.size }\""
OUT << "\t@echo \"#{ s }\""
OUT << "\t@echo \"#{ "#" * s.size }\""
OUT << "\t@echo"
end
OUT << <<-END
MAKEFLAGS += --no-print-directory
PATH := $(CURDIR)/vendor/local/bin:/usr/games:$(PATH)
CLASSPATH := .
find_any0 = $(firstword $(foreach x,$(1),$(if $(shell which $(x) 2>/dev/null),$(x),)))
check = $(if $(2),$(2),$(error $(1) interpreter not found!))
find_any = $(call check,$(1),$(call find_any0,$(2)))
JAVASCRIPT := $(call find_any,JavaScript,nodejs node js)
SCHEME := $(call find_any,Scheme,guile csi gosh)
GBS := $(call find_any,Gambas script,gbs3 gbs2 gba3)
WASI_RUNTIME := $(call find_any,WASI runtime,wasmtime node)
ifeq ($(SCHEME),csi)
SCHEME := csi -s
endif
ifeq ($(WASI_RUNTIME),node)
WASI_RUNTIME := node --experimental-wasi-unstable-preview1 vendor/wasi-runtime.js
endif
.DELETE_ON_ERROR:
END
OUT << "all: QR2.rb"
banner("CHECK")
OUT << "\tdiff -s QR.rb QR2.rb"
OUT << ""
OUT << "check: all"
OUT << "\t@sha256sum --quiet -c SHA256SUMS"
[*RunSteps, RunStep["Ruby", "QR2.rb"]].each_cons(2).with_index do |(s1, s2), i|
cmd = s1.cmd_make.gsub("OUTFILE", s2.src)
OUT << ""
OUT << "#{ s2.src }: #{ s1.src }"
banner(s1.name, s2.name, i)
if s1.backup
if s1.backup.is_a?(String)
OUT << "\t@mv #{ s1.backup } #{ s1.backup }.bak"
else
OUT << "\t@#{ s1.backup[0] }"
end
end
cmd.split("&&").each {|c| OUT << "\t" + c.strip.gsub(/^!/, "ulimit -s unlimited && ") }
if s1.name == "BeanShell"
# workaround; bsh disables terminal echo
OUT << "\t@stty echo"
end
if s1.backup
if s1.backup.is_a?(String)
OUT << "\t@mv #{ s1.backup }.bak #{ s1.backup }"
else
OUT << "\t@#{ s1.backup[1] }"
end
end
end
OUT << <<-END
clean:
\t@mv QR.rb quine-relay.rb
\trm -f qr QR qr.* QR.* QR2.rb *.class gst.im
\t@mv quine-relay.rb QR.rb
END
File.write("../Makefile", OUT.join("\n"))
================================================
FILE: src/QR.rb.gen.rb
================================================
require_relative "code-gen"
gen_prologue_1 = GenPrologue.split(?;)[0, 2].join(?;)
gen_prologue_2 = GenPrologue.split(?;)[2..-1].join(?;)
s =
gen_prologue_2 + ?; +
GenSteps[0..-2].inject('"eval$s=%q(#$s)"') {|code, s| s.code.sub("PREV"){ code }.chomp }
if false
# search characters rarely used
h = {}
32.upto(126) {|c| h[c.chr] = 0 }
s.chars.group_by {|c| c }.map do |c, a|
h[c] = a.size
end
%w(( ) [ ] { } \ \\ \").each {|c| h.delete(c) }
p *h.sort_by {|k, v| v }
exit
end
if false
# search sequences that often appear
h = Hash.new(0)
2.upto(10) do |n|
s.chars.each_cons(n) do |a|
h[a.join] += n-1
end
end
p *h.sort_by {|k, v| v }.reverse
exit
end
# a table of short-hand character for sequences that often appear
ABBREV = {
?~ => " ",
?` => "\\",
?^ => "``",
?Z => "print",
?X => "ain()",
?J => "tring",
?H => "write",
?K => "gsub",
?! => "in",
?Y => "^^",
}
s = s.gsub(/[#{ ABBREV.keys.join }]/){"\\x%02x" % $&.ord}
# search perfect and simplest hash
a = ABBREV.keys.join.bytes
max = 1000
a.size.upto(90) do |n|
a.size.upto(90) do |m|
b = a.map {|c| c%n%m }
if b.uniq.size >= a.size&&b.max<max
$N, $M, $B = n, m, b
max = b.max
end
end
end
ABBREV.each do |k, v|
s = s.gsub(v, k)
end
a = [0] * ($B.max + 1)
ABBREV.each do |k, v|
v = case v
when "\\" then "B"
when "``" then "B*2"
when "^^" then "B*4"
when " " then "g"
when "ain()" then %("ain()")
else ":#{ v }"
end
a[k.ord % $N % $M] = v
end
a = a.join(",")
code = <<-END.split.join
eval$s=%q(eval(%w(
#{gen_prologue_1};
puts(eval(
%q(#{ s }).gsub(/[#{ ABBREV.keys.sort.join }]/){[#{ a }][$&.ord%#{ $N }%#{ $M }]}
))
)*""))
END
$stderr.puts "size: #{ code.b.size }"
code.chop!
TEMPLATE = File.read("uroboros.txt")
width = TEMPLATE[/.*/].size
while TEMPLATE.count("#") - width < code.size
s = TEMPLATE.count("#")
line = TEMPLATE[/^#*$/]
TEMPLATE.replace((line + "\n" + TEMPLATE + line).gsub!(/^|$/, "######") + "\n")
width = TEMPLATE[/.*/].size
warn "overflow!: #{ s - width }->#{ TEMPLATE.count("#") - width }"
end
PADDING = "".ljust(width, "#_buffer_for_future_bug_fixes_")
COPYRIGHT =
" Quine Relay -- Copyright (c) 2013, 2014 Yusuke Endoh (@mametter), @hirekoke ".
center(width, "#")[0..-2]
code = TEMPLATE.gsub(/#+/) { w = $&.size; code.slice!(0, w).ljust(w, PADDING) }.chomp
code[-1] = ")"
code[-1 - COPYRIGHT.size, COPYRIGHT.size] = COPYRIGHT
File.write("../QR.rb", code + "\n")
================================================
FILE: src/README.md.gen.rb
================================================
require_relative "code-gen"
require "erb"
require "cairo"
other_packages = %w(cmake libpng-dev libgd-dev groff bison curl)
other_packages.each do |package|
`dpkg -s #{ package }` # just check the packages
end
pkg_versions = {}
apts = RunSteps.map {|s| s.apt }
`which apt-get >/dev/null && dpkg -s #{ apts.join(" ") }`.b.split("\n\n").each do |s|
name = s[/^Package: (.*)$/, 1]
version = s[/^Version: (.*)$/, 1]
pkg_versions[name] = version if name && version
end
rows = [["\\#", "language", "ubuntu package", "version"]]
rows += RunSteps.map.with_index do |s, idx|
if s.apt.is_a?(Array)
apt = s.apt.join(", ")
ver = pkg_versions.values_at(*s.apt)
#raise if ver.uniq.size > 1
ver = ver.first
else
apt = s.apt || "*N/A*"
ver = pkg_versions[apt]
end
ver = ver.gsub("~") { "\\~" } if ver
[(idx + 1).to_s, s.name, apt, ver || "-"]
end
ws = rows.transpose.map {|row| row.map {|s| s.size }.max + 1 }
rows[1, 0] = [ws.map {|w| "-" * w }]
rows = rows.map do |col|
(col.zip(ws).map {|s, w| s.ljust(w) } * "|").rstrip
end
apt_get = "sudo apt-get install #{ [*apts.flatten.compact.uniq].sort * " " }"
apt_get.gsub!(/.{,70}( |\z)/) do
$&[-1] == " " ? $& + "\\\n " : $&
end
cmds = [*RunSteps, RunStep["Ruby", "QR2.rb"]].each_cons(2).map do |s1, s2|
cmd = s1.cmd_raw
src = s2.src
cmd = cmd.gsub("OUTFILE", src)
cmd = cmd.gsub(/^!/, "")
cmd = cmd.gsub(/.{60,}?&&/, "\\0\n ")
cmd
end
File.write("../README.md", ERB.new(DATA.read, trim_mode: "%").result(binding))
__END__
# Quine Relay
[](https://github.com/mame/quine-relay/actions?query=workflow%3ACI)
## What this is
[QR.rb](https://github.com/mame/quine-relay/blob/master/QR.rb) is a <%= RunSteps[0].name %> program that generates
a <%= RunSteps[1].name %> program that generates
a <%= RunSteps[2].name %> program that generates
...(through <%= RunSteps.size %> languages in total)...
a <%= RunSteps[-1].name %> program that generates
the original <%= RunSteps[0].name %> code again.
![Language Uroboros][langs]
[langs]: langs.png
(If you want to see the old 50-language version, see the [50](https://github.com/mame/quine-relay/tree/50) branch.)
## Usage
### Ubuntu
If you are using Ubuntu <%= `bash -c 'source /etc/os-release && echo $VERSION'`.chomp %>, you can follow these steps.
#### 1. Install all the interpreters/compilers.
First, you need to type the following apt-get command to install them all.
$ <%= apt_get %>
Then, build the bundled interpreters.
$ sudo apt-get install <%= other_packages.join(" ") %>
$ make -C vendor
#### 2. Run each program on each interpreter/compiler.
$ ulimit -s unlimited
% cmds.each do |cmd|
$ <%= cmd %>
% end
You will see that `QR.rb` is the same as `QR2.rb`.
$ diff QR.rb QR2.rb
Alternatively, just type `make`.
$ make
Note: It may take a lot of memory to compile some files.
### Docker
Simply build the image and run a container as follows:
$ docker build -t qr .
$ docker run --privileged --rm -e CI=true qr
Note: You must run in privileged mode, otherwise the `maxima` command will fail.
If you want to check the generated files, you can mount the local directory in the Docker container (but still use the `vendor` directory of the container), as follows:
$ docker run --privileged --rm -e CI=true -v $(pwd):/usr/local/share/quine-relay -v /usr/local/share/quine-relay/vendor qr
### Other platforms
You may find [instructions for other platforms in the wiki](https://github.com/mame/quine-relay/wiki/Installation).
If you do not use these Linux distributions, please find your own way.
If you manage it, please let me know. I wish you good luck.
## Interpreter/compiler versions tested
I used the following Ubuntu deb packages to test this program.
% rows.each do |row|
<%= row %>
% end
Note that some languages are not available in Ubuntu (marked as *N/A*).
This repository contains their implementations in `vendor/`.
See also `vendor/README` for detail.
## Frequently asked questions
### Q. Why?
A. [Take your pick](https://github.com/mame/quine-relay/issues/11).
### Q. How?
A. Good news: I have published a book, ["The World of Obfuscated, Esoteric, Artistic Programming"](http://gihyo.jp/book/2015/978-4-7741-7643-7).
It explains how to write a quine, an ascii-art quine, and an uroboros quine like this quine-relay.
You can buy my book on [amazon.co.jp](http://www.amazon.co.jp/dp/4774176435).
(It also contains my almost all of my (about forty) works, including
[alphabet-only Ruby program](http://www.slideshare.net/mametter/ruby-esoteric-obfuscated-ruby-programming-5088683),
[radiation-hardened quine](https://github.com/mame/radiation-hardened-quine),
etc., and explains many techniques for writing such programs.)
Bad news: It is written in Japanese.
I hope you can translate it into English <strike>and help me earn royalties</strike>.
### Q. Language XXX is missing!
A. See [the language inclusion criteria][criteria] in detail. (In short, please create a deb package and contribute it to Ubuntu.)
See also [:heart:][sponsors].
[criteria]: https://github.com/mame/quine-relay/wiki/Language-inclusion-criteria
[sponsors]: https://github.com/sponsors/mame
### Q. Does it really work?
A. [](https://github.com/mame/quine-relay/actions?query=workflow%2ACI)
### Q. How long did it take you?
A. [Are you trying to cross the world line?](https://github.com/mame/quine-relay/issues/60)
### Q. The code does not fit in my screen!
A. [Here you go][thumbnail].
[thumbnail]: thumbnail.png
### Q. How was the code generated?
A.
$ sudo apt-get install rake ruby-cairo ruby-rsvg2 ruby-gdk-pixbuf2 \
optipng advancecomp ruby-chunky-png
$ cd src
$ rake clobber
$ rake
## History
## for Ubuntu 13.04
[50 languages](https://github.com/mame/quine-relay/tree/ad3f8222c796969db8cfb1bae015a46c2387b3d6)
Added: Ruby, Scala, Scheme, bash, Smalltalk, Unlambda, Tcl, Whitespace, Verilog, Vala, Ada, ALGOL 68, Awk, Brainfuck, Boo, C, C++, C#, Cobol, Clojure, Fortran90, FORTRAN77, Forth, Common Lisp, CoffeeScript, Groovy, Go, INTERCAL, Icon, Haskell, Jasmin, Java, LLVM asm, Logo, Lua, Makefile, MSIL, Objective-C, JavaScript, OCaml, Octave, Parrot asm, Pascal, Perl, PHP, Pike, Prolog, Python, R, REXX
## for Ubuntu 13.10
[50 languages](https://github.com/mame/quine-relay/tree/ea4d39fb1ebc7ee23ec6f60ca7bfa0d465b5806a)
## for Ubuntu 14.04
[50 languages](https://github.com/mame/quine-relay/tree/d16bf072e3063dc476dc440c8f3e33d7426e98db)
## for Ubuntu 14.10
[64 languages](https://github.com/mame/quine-relay/tree/e449baba456d4885102482cbd365335be59241b2)
Added: Scilab, S-Lang, SPL, LOLCODE, Maxima, NASM, Neko, Nickle, Ook!, PARI/GP, Piet, PPT (Punched tape), PostScript, Ratfor
## for Ubuntu 15.04
[100 languages](https://github.com/mame/quine-relay/tree/7749715289ca162eb1c1eb1ff1ed1393edc41630)
Added: Subleq, Standard ML, Thue, Visual Basic, XSLT, Yorick, Zoem, A+, AFNIX, Ante, Asymptote, ATS, BLC8, Befunge, bc, Chef, CDuce, D, dc, eC, Emacs Lisp, Erlang, F#, Falcon, FALSE, Gambas script, GAP, GEL (Genius), Gnuplot, G-Portugol, Gri, Haxe, Julia, Lisaac, Lazy K, Kaya
## for Ubuntu 15.10
[100 languages](https://github.com/mame/quine-relay/tree/f45035f867c7c8f7b4e12fa63e7c8eef9aabecad)
Removed: Boo, Falcon, Kaya
Added: Elixir, Jq, Nim
## for Ubuntu 16.04
[100 languages](https://github.com/mame/quine-relay/tree/233ba8b4e1d7e4c59a46d64481048a8ea7f4400e)
## for Ubuntu 17.04
[100 languages](https://github.com/mame/quine-relay/tree/e65a798da23df0367d9eb5e4d46f00d87e6cb342)
Removed: SPL, Gri, Logo, Parrot asm
Added: Squirrel, Dafny, Grass, MiniZinc
## for Ubuntu 17.10
[100 languages](https://github.com/mame/quine-relay/tree/943b83801a1bd019ebf348adc78df2cdfde06513)
Removed: CDuce
Added: Rust
## for Ubuntu 18.04
[128 languages](https://github.com/mame/quine-relay/tree/6e173d76e972e1da7992b84768bf9f4c788949ed)
Removed: Gambas script, Perl
Added: Shakespeare, sed, tcsh, TypeScript, Velato, Vimscript, Yabasic, zsh, Aheui, AspectC++, AspectJ, BeanShell, CMake, Flex, Fish, GDB, GolfScript, Gzip, Gri, JSFuck, ksh, LiveScript, M4, Mustache, nesC, Parser 3, Perl 5, Perl 6, Promela (Spin), rc
## for Ubuntu 19.04
[128 languages](https://github.com/mame/quine-relay/tree/c8898351500682cea02219313e9203da7eca5505)
Removed: Scilab, G-Portugol, nesC
Added: Curry, Gambas script, GeneratorScriptingLanguage
## for Ubuntu 19.10
[128 languages](https://github.com/mame/quine-relay/tree/13041dbf3f80a90c9221ef94f8e8bc385800b6fd)
Removed: Gri
Added: Scilab
## for Ubuntu 20.04
[128 languages](https://github.com/mame/quine-relay/tree/62e2cc2d61d99719328094d185d899bc03a851fb)
## for Ubuntu 20.10
[128 languages](https://github.com/mame/quine-relay/tree/114f44fefd610812d2f5e3032603762752ed51b2)
Removed: AspectC++, eC
Added: SurgeScript, Dhall
## for Ubuntu 21.04
[128 languages](https://github.com/mame/quine-relay/tree/d8df33bad3693afd0bd3bf1c2b1cedd5753325dc)
Removed: Curry
Added: G-Portugol
## for Ubuntu 21.10
[128 languages](https://github.com/mame/quine-relay/tree/158b6251d36a48122ec0006feaf759d8b1973b0f)
## for Ubuntu 22.04
[128 languages](https://github.com/mame/quine-relay/tree/7b81d8704549d31814499c5300be2be9568467c8)
Removed: Julia, Nim, Pike
Added: WebAssembly (Text format), WebAssembly (Binary format), Kotlin
## for Ubuntu 22.10
[128 languages](https://github.com/mame/quine-relay/tree/362962dd2d55d7c36dd9fa3e0d4c0c52c0e6a18f)
## for Ubuntu 23.04
[128 languages](https://github.com/mame/quine-relay/tree/5dfdada5aa58f6a97ae85b84f86c7eb091225a8c)
Removed: Squirrel, GeneratorScriptingLanguage
Added: Crystal, Nim
## for Ubuntu 23.10
[128 languages](https://github.com/mame/quine-relay/tree/74c4cc7d79fccbb1c8315070b9efea03cb787755)
Removed: Smalltalk
Added: Modula-2
## for Ubuntu 24.04
[128 languages](https://github.com/mame/quine-relay/tree/20d7f437c053b8e0b301ba996d124a4b812e3571)
Removed: PPT (Punched tape)
Added: Pike
## for Ubuntu 24.10
[128 languages](https://github.com/mame/quine-relay/tree/2ed61a62c9d31121b39e740c89107085c122f478)
Removed: Dafny, Maxima
Added: Execline, Squirrel
## for Ubuntu 25.04
[128 languages](https://github.com/mame/quine-relay/tree/b9c8056cad4589fe650163a3fd0cea4b3055fce4)
## for Ubuntu 25.10
[128 languages](https://github.com/mame/quine-relay/tree/5298413382ea707061e04aa077f99872d159a7b8)
Removed: Lisaac
Added: Swift
## License
The MIT License applies to all resources
*except* the files in the `vendor/` directory.
The files in the `vendor/` directory are from third-parties
and are distributed under different licenses.
See `vendor/README` in detail.
---
The MIT License (MIT)
Copyright (c) 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024 Yusuke Endoh (@mametter), @hirekoke
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
================================================
FILE: src/Rakefile
================================================
require "rake/clean"
CLEAN.include("../QR.*")
CLEAN.include("../qr.*")
CLEAN.include("../QR$*")
CLEAN.include("../QR")
CLEAN.include("../qr")
CLEAN.include("../QR2.rb")
CLEAN.include("../README.md")
CLEAN.include("../langs.png")
CLEAN.include("../Makefile")
LIBS = %w(code-gen.rb code-gen-pool.rb lazyk-boot.dat blc-boot.dat grass-boot.dat wasm-tmpl.dat)
file "lazyk-boot.dat" => "lazyk-boot.dat.gen.rb" do
ruby "lazyk-boot.dat.gen.rb"
end
file "blc-boot.dat" => "blc-boot.dat.gen.rb" do
ruby "blc-boot.dat.gen.rb"
end
file "grass-boot.dat" => "grass-boot.dat.gen.rb" do
ruby "grass-boot.dat.gen.rb"
end
file "wasm-tmpl.dat" => "wasm-tmpl.dat.gen.rb" do
ruby "wasm-tmpl.dat.gen.rb"
end
file "../QR.rb" => ["QR.rb.gen.rb", *LIBS, "uroboros.txt"] do
ruby "QR.rb.gen.rb"
end
file "../README.md" => ["README.md.gen.rb", *LIBS] do
ruby "README.md.gen.rb"
end
file "../langs.png" => ["langs.png.gen.rb", "uroboros.svg", *LIBS] do
ruby "langs.png.gen.rb"
end
file "../thumbnail.png" => ["thumbnail.png.gen.rb", "../QR.rb"] do
ruby "thumbnail.png.gen.rb"
end
file "../Makefile" => ["Makefile.gen.rb", *LIBS] do
ruby "Makefile.gen.rb"
end
file "../.github/workflows/main.yml" => ["dot.github.workflows.main.yml.gen.rb", *LIBS] do
ruby "dot.github.workflows.main.yml.gen.rb"
end
file "../Dockerfile" => ["Dockerfile.gen.rb", *LIBS] do
ruby "Dockerfile.gen.rb"
end
task :test do
ruby "test.rb"
end
task :default => %w(
../QR.rb
../README.md
../langs.png
../thumbnail.png
../Makefile
../.github/workflows/main.yml
../Dockerfile
)
task "../SHA256SUMS" => ["SHA256SUMS.gen.rb", *LIBS] do
ruby "SHA256SUMS.gen.rb"
end
task :run => :default do
sh "make -C .."
end
task :gen => [:run, "../SHA256SUMS"]
================================================
FILE: src/SHA256SUMS.gen.rb
================================================
require_relative "code-gen"
Dir.chdir("..") do
system("sha256sum", "-b", *RunSteps.map {|s| s.src }, out: "SHA256SUMS")
end
================================================
FILE: src/blc-boot.dat.gen.rb
================================================
def dump(e, env)
if e.is_a?(Symbol)
?1 * (env.index(e) + 1) + ?0
elsif e[0] == :abs!
vs = [*e[1]].reverse
"00" * vs.size + dump(e[2], vs + env)
else
"01" * (e.size - 1) + e.map {|x| dump(x, env) } * ""
end
end
L = -> x, y { [:abs!, x, y] }
Let = -> v, x, y { [L[v, y], x] }
Cons = -> x, y { L[:f, [:f, x, y]] }
False = L[[:x, :y], :y]
True = L[[:x, :y], :x]
Num = -> n {
[n[7] == 1 ? :ConsFalse : :ConsTrue,
[n[6] == 1 ? :ConsFalse : :ConsTrue,
[n[5] == 1 ? :ConsFalse : :ConsTrue,
[n[4] == 1 ? :ConsFalse : :ConsTrue,
[n[3] == 1 ? :ConsFalse : :ConsTrue,
[n[2] == 1 ? :ConsFalse : :ConsTrue,
[n[1] == 1 ? :ConsFalse : :ConsTrue,
[n[0] == 1 ? :ConsFalse : :ConsTrue, False]]]]]]]]
}
OutBF = -> tl { [:Cons, Num[?..ord], [:ConsGt, tl]] }
DblBF = # [->++<]>
L[:tl,
Let[:ConsTrue, :ConsTrue,
Let[:ConsFalse, :ConsFalse,
[:Cons, Num[?[.ord],
[:Cons, Num[?-.ord],
[:ConsGt,
[:ConsPlus,
[:ConsPlus,
[:Cons, Num[?<.ord],
[:Cons, Num[?].ord],
[:ConsGt, :tl]]]]]]]]]]]
# each_bit bit tl =
# ("[->++<]>" concat (tl each_bit))
EachBit =
[L[:x, [:x, :x]], # recursive
L[[:self, :bit, :tl, :next],
[:tl, [:self, :self], [:DblBF, [:bit, [:ConsPlus, :next], :next]]]]]
# each_byte byte tl =
# (byte each_bit ".>") concat (tl each_byte)
EachByte =
[L[:x, [:x, :x]], # recursive
L[[:self, :byte, :tl],
Let[:Cons, L[[:x, :y, :f], [:f, :x, :y]],
Let[:ConsTrue, [:Cons, True],
Let[:ConsFalse, [:Cons, False],
Let[:ConsPlus, [:Cons, Num[?+.ord]],
Let[:ConsGt, [:Cons, Num[?>.ord]],
Let[:DblBF, DblBF,
[:byte, EachBit, OutBF[[:tl, [:self, :self]]]]]]]]]]]]
tree = EachByte
boot = "10" + dump(tree, [])
# 20 x ? boot = 00010100 x ? boot = \a (\b x) ? boot = \a x boot
# 22 x y = 00010110 x y = \a a x y = cons x y
# 4 222 = 00000100 11011110 = \a \b (\c b) (????) = \a \b b = false
# 4 226 = 00000100 11100010 = \a \b (\c a) (\c c) = \a \b a = true
if ARGV[0]
$stderr.puts(boot.size, (boot.size + 7) / 8)
a = [20]
("foo" * 100 + "\n").each_byte do |b|
a << 22
0.upto(7) do |i|
a << 22 << 4 << 222 + b[i] * 4
end
a << 4 << 222
end
a << 4 << 222
print a.pack("C*") + [boot].pack("B*")
else
File.write("blc-boot.dat", [boot].pack("B*"))
end
================================================
FILE: src/code-gen-pool.rb
================================================
original_list_size = CodeGen::List.size
#class NesC < CodeGen
# Name = "nesC"
# File = "QR.nc"
# Cmd = "nescc -o QR QR.nc && ./QR > OUTFILE"
# Apt = "nescc"
# def code
# <<-'END'.lines.map {|l| l.strip }.join
# %(
# #include<stdio.h>\n
# module QR{}implementation{
# int main()__attribute__((C,spontaneous)){
# puts#{E[PREV]};
# return 0;
# } }
# )
# END
# # avoid "}}" because of Mustache
# end
#end
#class Nim_NVSPL2 < CodeGen
# After = Nim
# Obsoletes = Nim
# File = ["QR.nim", "QR.nvspl2"]
# Cmd = ["nim c QR.nim && ./QR > OUTFILE", "ruby vendor/nvspl2.rb QR.nvspl2 > OUTFILE"]
# Apt = ["nim", nil]
# Code = %q(%((for i, c in#{E[PREV]}:echo ",",int(c),"CO");echo "Q"))
#end
CodeGen::List.slice!(original_list_size..-1).each do |s|
i = CodeGen::List.find_index(s::After)
CodeGen::List.insert(i, s)
[*s::Obsoletes].each {|s_| CodeGen::List.delete(s_) } if defined?(s::Obsoletes)
end
CodeGen::List.delete(GeneratorScriptingLanguage)
class Zig < CodeGen
File = "QR.zig"
Cmd = "zig run QR.zig > OUTFILE"
Apt = "zig"
Code = %q(%(pub fn main()!void{_=try @import("std").io.getStdOut().write#{E[PREV]};}))
end
# aribas
# elvish
# hare
# raku
# snek
# storm-lang
================================================
FILE: src/code-gen.rb
================================================
# A source for generating Quine Relay
GenStep = Struct.new(:name, :code, :run_steps)
RunStep = Struct.new(:name, :src, :cmd_make, :cmd_raw, :backup, :apt)
# A class that generates Ruby code that generates a code (in a language X) that prints PREV.
class CodeGen
# File = source file name of X
# Cmd = command for execution/compilation
# Apt = ubuntu package name of the interpreter/compiler of X
List = []
def self.inherited(c)
List << c
end
def self.gen_step
GenStep[name, new.code, run_steps]
end
def code
self.class::Code
end
def self.run_steps
a = []
a << (defined?(self::Name) ? [*self::Name] : self.to_s.split("_"))
a << [*self::File]
a << [*self::Cmd]
a << (defined?(self::Backup) ? [*self::Backup] : [*self::Cmd].map { nil })
a << [*self::Apt]
a.transpose.map do |name, src, cmd_make, backup, apt|
cmd_raw = cmd_make
cmd_raw = cmd_raw.gsub("$(SCHEME)", "guile")
cmd_raw = cmd_raw.gsub("$(JAVASCRIPT)", "nodejs")
cmd_raw = cmd_raw.gsub("$(CC)", "gcc")
cmd_raw = cmd_raw.gsub("$(CXX)", "g++")
cmd_raw = cmd_raw.gsub("$(GBS)", "gbs3")
RunStep[name, src, cmd_make, cmd_raw, backup, apt]
end
end
end
# Common part
GenPrologue = <<-'END'.lines.map {|l| l.strip }.join
B=92.chr;
g=32.chr;
N=10.chr;
n=0;
e=->s{Q[Q[s,B],?"].gsub(N,B+?n)};
E=->s{'("'+e[s]+'")'};
d=->s,t=?"{s.gsub(t){t+t}};
def f(s,n)s.gsub(/.{1,#{n*255}}/m){yield$S=E[$s=$&]}end;
Q=->s,t=?${s.gsub(t){B+$&}};
R=";return 0;";
V=->s,a,z{s.gsub(/(#{B*4})+/){a+"#{$&.size/2}"+z}};
C=%w(System.Console Write);
$C=C*?.;
$D="program QR";
$G=" contents of"+$F=" the mixing bowl";
$L="public static";
$W="s.WriteByte";
rp=->s,r{
v="";
[r.inject(s){|s,j|
o={};
m=n=0;
s.size.times{|i|
o[f=s[i,2]]||=0;
c=o[f]+=1;
m<c&&(m=c;n=f)
};
v=n+v;
s.gsub(n,(j%256).chr)
},v]
};
END
# rp: Re-Pair (Naive byte pair encoding)
class Python_R_Ratfor_Rc_REXX < CodeGen
Name = ["Python", "R", "Ratfor", "rc", "REXX"]
File = ["QR.py", "QR.R", "QR.ratfor", "QR.rc", "QR.rexx"]
Cmd = [
"python3 QR.py > OUTFILE",
"R --slave -f QR.R > OUTFILE",
"ratfor -o QR.ratfor.f QR.ratfor && gfortran -o QR QR.ratfor.f && ./QR > OUTFILE",
"rc QR.rc > OUTFILE",
"rexx ./QR.rexx > OUTFILE"
]
Apt = ["python3", "r-base", "ratfor", "rc", "regina-rexx"]
def code
<<-'END'.lines.map {|l| l.strip }.join
%(
print('cat("')\n
for c in"".join(["echo 'say ''%s'''\\n"%l for l in#{E[d[d[PREV,?'],?']]}.split("\\n")]):
print('r=fput(char(%d))'%ord(c))\n
print('end\\n")')#
)
END
end
end
class Promela < CodeGen
Name = "Promela (Spin)"
File = "QR.pr"
Cmd = "spin -T QR.pr > OUTFILE"
Apt = "spin"
Code = %q("init{#{f(PREV,6){"printf#{d[$S,?%]};"}}}")
end
class Prolog < CodeGen
File = "QR.prolog"
Cmd = "swipl -q -t qr -f QR.prolog > OUTFILE"
Apt = "swi-prolog"
Code = %q("qr:-write('#{Q[e[PREV],?']}').")
end
class PostScript < CodeGen
Name = "PostScript"
File = "QR.ps"
Cmd = "gs -dNODISPLAY -q QR.ps > OUTFILE"
Apt = "ghostscript"
Code = %q("(#{Q[PREV,B]})print quit")
end
class Pike < CodeGen
File = "QR.pike"
Cmd = "pike QR.pike > OUTFILE"
Apt = "pike8.0"
Code = %q("int main(){write#{E[PREV]+R}}")
end
class PHP_Piet < CodeGen
File = ["QR.php", "QR.png"]
Cmd = ["php QR.php > OUTFILE", "npiet QR.png > OUTFILE"]
Apt = ["php-cli", nil]
def code
<<-'END'.lines.map {|l| l.strip }.join
%(
<?php $z=3+$w=strlen($s=#{Q[E[PREV]]})*3;
echo"\\x89PNG\\r\\n\\x1a\\n";
$m="";
$t="\\xc0\\0\\xff";
for($i=-1;++$i<128*$z;
$m.=$c--?
($w-$c||$i>$z)&&$i/$z<($c<$w?ord($s[(int)($c/3)]):$c--%3+2)?
$t[2].$t[$c%3%2].$t[$c%3]:"\\0\\0\\0":"\\0"
)
$c=$i%$z;
foreach(array(
"IHDR".pack("NNCV",$w+2,128,8,2),
"IDAT".gzcompress($m),
"IEND"
)as$d)
echo pack("NA*N",strlen($d)-4,$d,crc32($d));
)
END
end
end
class Perl6 < CodeGen
Name = "Perl 6"
File = "QR.pl6"
Cmd = "perl6 QR.pl6 > OUTFILE"
Apt = "rakudo"
Code = %q("$_='#{Q[PREV.gsub(B,"\x7f"),?']}';s:g/\\\\x7f/\\\\\\\\/;print $_")
end
class Perl5 < CodeGen
Name = "Perl 5"
File = "QR.pl"
Cmd = "perl QR.pl > OUTFILE"
Apt = "perl"
def code
<<-'END'.lines.map {|l| l.strip }.join
(
p="eval";
%(
$_="#{
s,v=rp[PREV,128..287];
s="
$_='#{Q[s,c=/['\\\\]/]}';
$n=32;
$s='#{Q[v,c]}';
$s=~s{..}{
$a=$&;
$b=chr(--$n&255);
~s/$b/$a/g;
}eg;
print
";
(s+N*(-s.size%6)).unpack("B*")[0].
gsub(/.{6}/){n=$&.to_i 2;((n+14)/26*6+n+47).chr}
}";
s|.|$n=ord$&;substr unpack(B8,chr$n-int($n/32)*6-41),2|eg;
eval pack'B*',$_
).scan(/[ ,-:A-z]+|(.)/){p="s++#{$1?"chr #{$1.ord}+e":$&+?+};"+p};
p
)
END
end
end
class Pascal < CodeGen
File = "QR.pas"
Cmd = "fpc QR.pas && ./QR > OUTFILE"
Apt = "fp-compiler"
Code = %q("#$D(output);begin write(#{f(PREV,1){"'#$s',"}}'')end.")
end
class Parser3 < CodeGen
Name = "Parser 3"
File = "QR.p"
Cmd = "parser3 QR.p > OUTFILE"
Apt = "parser3-cgi"
Code = %q("$console:line[#{PREV.gsub(/[:;()]/){?^+$&}}]")
end
class PARIGP < CodeGen
Name = "PARI/GP"
File = "QR.gp"
Cmd = "gp -f -q QR.gp > OUTFILE"
Apt = "pari-gp"
Code = %q("print#{E[PREV]};quit")
end
class Octave_Ook < CodeGen
Name = ["Octave", "Ook!"]
File = ["QR.octave", "QR.ook"]
Cmd = [
"mv QR.m QR.m.bak && octave -qf QR.octave > OUTFILE && mv QR.m.bak QR.m",
"ruby vendor/ook-to-bf.rb QR.ook QR.ook.bf && ruby vendor/bf.rb QR.ook.bf > OUTFILE"
]
Apt = ["octave", nil]
def code
<<-'END'.lines.map {|l| l.strip }.join
"
s=double#{E[PREV]};
t=num2cell(b=11-ceil(s/13));
for n=1:9
m={};
for i=1:141
f=@(x,y,n)repmat(['Ook' char(x) ' Ook' char(y) ' '],[1 abs(n)]);
m(i)=[f(z=46,63,n) f(q=z-(i<13)*13,q,i-13) f(33,z,1) f(63,z,n)];
end;
t(x=b==n)=m(diff([0 s(x)])+13);
end;
printf('%%s',t{:})
"
END
# NOTE: %% is a hack for Nickle printf escaping.
end
end
class OCaml < CodeGen
File = "QR.ml"
Cmd = "ocaml QR.ml > OUTFILE"
Apt = "ocaml"
Code = %q("print_string"+E[PREV])
end
class ObjC < CodeGen
Name = "Objective-C"
File = "QR.m"
Cmd = "gcc -o QR QR.m && ./QR > OUTFILE"
Apt = "gobjc"
Code = %q("#import<stdio.h>#{N}int main(){puts#{E[PREV]+R}}")
end
class Nim < CodeGen
File = "QR.nim"
Cmd = "nim compile QR.nim && ./QR > OUTFILE"
Apt = "nim"
Code = %q("echo#{E[PREV]}")
end
class Nickle < CodeGen
File = "QR.5c"
Cmd = "nickle QR.5c > OUTFILE"
Apt = "nickle"
Code = %q("printf#{E[PREV]}\\n")
end
class Neko < CodeGen
File = "QR.neko"
Cmd = "nekoc QR.neko && neko QR.n > OUTFILE"
Apt = "neko"
Code = %q("$print#{E[PREV]};")
end
class Mustache_NASM < CodeGen
File = ["QR.mustache", "QR.asm"]
Cmd = [
"mustache QR.mustache QR.mustache > OUTFILE",
"nasm -felf QR.asm && ld -m elf_i386 -o QR QR.o && ./QR > OUTFILE",
]
Apt = ["ruby-mustache", "nasm"]
def code
<<-'END'.lines.map {|l| l.strip.gsub("^^^", " ") }.join("\\n")
"m{{!: x
qr: |-
^^^:db\x60#{e[s=PREV]}\x60
^^^global _start
^^^_start:mov edx,#{s.size}
^^^mov ecx,m
^^^mov ebx,1
^^^mov eax,4
^^^int 128
^^^mov ebx,0
^^^mov eax,1
^^^int 128
x: |
^^^}}{{{qr}}}"
END
end
end
class MSIL < CodeGen
File = "QR.il"
Cmd = "ilasm QR.il && mono QR.exe > OUTFILE"
Apt = "mono-devel"
def code
<<-'END'.lines.map {|l| l.strip }.join
%(
.assembly t{}
.method #$L void Main()
{
.entrypoint ldstr"#{e[PREV]}"
call void [mscorlib]#{C*"::"}(string)
ret
}
)
END
end
end
class Modula2 < CodeGen
Name = "Modula-2"
File = "QR.mod"
Cmd = "gm2 -fiso QR.mod -o QR && ./QR > OUTFILE"
Apt = "gm2"
def code
<<-'END'.lines.map {|l| l.strip }.join
"
MODULE QR;
FROM StrIO IMPORT WriteString;
BEGIN #{
(PREV).gsub(/()[#{i=94.chr}"]+|[#{i}']+/){
["WriteString(",$&,");"]*($1??":?')
}
}END QR.
"
END
end
end
class MiniZinc < CodeGen
File = "QR.mzn"
Cmd = "minizinc --solver COIN-BC --soln-sep '' QR.mzn > OUTFILE"
Apt = "minizinc"
Code = %q("solve satisfy;output [#{E[PREV]}];")
end
class Makefile < CodeGen
File = "QR.mk"
Cmd = "make -f QR.mk > OUTFILE"
Apt = "make"
Code = %q("all:\n\t@echo '#{d[PREV,?$].gsub(?'){"'\\\\''"}}'")
end
class M4 < CodeGen
File = "QR.m4"
Cmd = "m4 QR.m4 > OUTFILE"
Apt = "m4"
Code = %q("changequote(<@,@>)\ndefine(p,<@#{PREV}@>)\np")
end
class Lua < CodeGen
File = "QR.lua"
Cmd = "lua5.3 QR.lua > OUTFILE"
Apt = "lua5.3"
Code = %q("x=string.gsub(#{V[E[PREV],?&,?&]},'&(%d+)&',function(s)return string.rep('\\\\\\\\',tonumber(s))end);print(x)")
end
class LOLCODE < CodeGen
File = "QR.lol"
Cmd = "lci QR.lol > OUTFILE"
Apt = [nil]
def code
<<-'END'.lines.map {|l| l.strip }.join
%(
HAI 1.2\n
VISIBLE "#{
PREV.gsub(/[:"]/,":\\0")
}"\n
KTHXBYE BYE
)
END
end
end
class LLVMAsm < CodeGen
Name = "LLVM asm"
File = "QR.ll"
Cmd = "llvm-as QR.ll && lli QR.bc > OUTFILE"
Apt = "llvm"
Backup = "QR.bc"
def code
<<-'END'.lines.map {|l| l.strip }.join
%(
@s=global[#{i=(s=PREV).size+1}x i8]
c"#{s.gsub(/[\\"\n\t]/){"\\%02X"%$&.ord}}\\00"
declare i32@puts(i8*)
define i32@main(){
%1=call i32@puts(i8*getelementptr([#{i}x i8],[#{i}x i8]*@s,i32 0,i32 0))
ret i32 0
}
)
END
end
end
class Ksh_LazyK_LiveScript < CodeGen
Name = ["ksh", "Lazy K", "LiveScript"]
File = ["QR.ksh", "QR.lazy", "QR.ls"]
Cmd = [
"ksh QR.ksh > OUTFILE",
"lazyk QR.lazy > OUTFILE",
"lsc QR.ls > OUTFILE",
]
Apt = ["ksh", nil, "livescript"]
Backup = [nil, nil, "QR.c"]
def code
lazyk = ::File.read(::File.join(__dir__, "lazyk-boot.dat"))
lazyk = lazyk.tr("ski`","0123").scan(/.{1,3}/).map do |n|
n = n.reverse.to_i(4)
[*93..124,*42..73][n]
end.pack("C*")
lazyk = lazyk.gsub(/[ZHJK\^`~X]/) {|c| "\\x%02x" % c.ord }
<<-'END'.lines.map {|l| l.strip }.join.sub("LAZYK"){lazyk}
%(
p(){ echo -n $1;};
f(){ for x in $(p "$1"|od -An -tu1 -v);do;
p $4;
for((j=$3;j--;));do;
h $2 $x $j;
done;
done;
};
p k\\`;
h(){ p \\`${1:$(($2>>$3&1)):2};};
f 'console.log#{Q[E[PREV],?#].gsub(?',%('"'"'))}' kki 7 '``s``s``s``s``s``s``s``si';
h(){ p ${1:$(((($2%83-10)>>((2-$3)*2))%4)):1};};
f 'LAZYK' ski\\` 3
)
END
end
end
class Kotlin < CodeGen
File = "QR.kt"
Cmd = "kotlinc QR.kt -include-runtime -d QR.jar && kotlin QR.jar > OUTFILE"
Apt = "kotlin"
Code = %q("fun main(a:Array<String>){print#{Q[E[PREV]]} }")
end
class JavaScript_Jq_JSFuck < CodeGen
File = ["QR.js", "QR.jq", "QR.jsfuck"]
Cmd = [
"$(JAVASCRIPT) QR.js > OUTFILE",
"jq -r -n -f QR.jq > OUTFILE",
"!$(JAVASCRIPT) --stack_size=100000 QR.jsfuck > OUTFILE",
]
Apt = ["nodejs", "jq", "nodejs"]
def code
<<-'END'.lines.map {|l| l.strip }.join
%(
P={0:'[+[]]',m:'((+[])'+(C="['constructor']")+"+[])['11']"};
for(R in B=
(
'![]@!![]@[][[]]@'+
(A="[]['fill']")+
"@([]+[])['fontcolor']([])@(+('11e20')+[])['split']([])@"+
A+C+"('return escape')()("+A+')'
).split('@')
)
for(E in D=eval(G='('+B[R]+'+[])'))
P[T=D[E]]=P[T]||G+"['"+E+"']";
for(G='[',B=0;++B<36;)
P[D=B.toString(36)]=
B<10?
(G+='+!+[]')+']'
:
P[D]||"(+('"+B+"'))['to'+([]+[])"+C+"['name']]('36')";
A+=C+"('console.log(unescape(\\"";
for(E in G=#{E[PREV]})
A+="'+![]+'"+G.charCodeAt(E).toString(16);
for(A+="\\".replace(/'+![]+'/g,\\"%\\")))')()",R=0;R<9;R++)
A=A.replace(/'.*?'/g,function(B){
T=[];
for(E=1;B[E+1];)
T.push(P[B[E++]]);
return T.join('+')
});
console.log('"'+A+'"')
)
END
end
end
class Java_ < CodeGen
Name = "Java"
File = "QR.java"
Cmd = "javac QR.java && java QR > OUTFILE"
Apt = "openjdk-11-jdk"
def code
# LZ78-like compression
<<-'END'.lines.map {|l| l.strip }.join
%(
class QR{
#$L void main(String[]v){
String c[]=new String[99999],y="",z=y,s="#{
z=t=(0..r=q=126).map{|n|[n,[]]};
a="";
b=->n{a<<(n%78+55)%84+42};
(PREV).bytes{|n|
r,z=z[n]||(
b[r/78];b[r];
q<6083&&z[n]=[q+=1,[]];
t[n])
};
b[r/78];b[r]
}";
int i=0,n=0,q=0;
for(;++n<126;)c[n]=""+(char)n;
for(;i<#{a.size};){
q=q*78+(s.charAt(i)-13)%84;
if(i++%2>0){
y=q<n?c[q]:y;
c[n++]=z+y.charAt(0);
System.out.print(z=c[q]);
q=0;
}
}
}
}
)
END
end
end
class Jasmin < CodeGen
File = "QR.j"
Cmd = "jasmin QR.j && java QR > OUTFILE"
Apt = "jasmin-sable"
def code
<<-'END'.lines.map {|l| l.strip }.join
%(
.class public QR\n
.super #{$T="java/io/PrintStream"}\n
.method #$L main([L#{S="java/lang/S"}tring;)V ;]\n
.limit stack 2\n
getstatic #{S}ystem/out L#$T;\n
ldc "#{e[PREV]}"\n
invokevirtual #$T/println(L#{S}tring;)V\n
return\n
.end method
)
END
end
end
class Icon_INTERCAL < CodeGen
File = ["QR.icn", "QR.i"]
Cmd = [
"icont -s QR.icn && ./QR > OUTFILE",
"ick -bfOc QR.i && gcc -std=c99 -static QR.c -I /usr/include/ick-* -o QR -lick && ./QR > OUTFILE"
]
Backup = [nil, "QR.c"]
Apt = [["icont", "iconx"], "intercal"]
def code
<<-'END'.lines.map {|l| l.strip }.join
%(
procedure main();
i:=c:=0;
s:=#{E[PREV+N]};
write("DO,1<-#"||*s);
s?while t:=ord(move(1))do{
i+:=1;
u:=-i;
every 0to 7do{u:=u*2+t%2;t/:=2};
write("PLEASE")\\(i%4/3);
write("DO,1SUB#"||i||"<-#"||((c-u)%256));
c:=u;
};
write("PLEASEREADOUT,1\\nPLEASEGIVEUP");
end
)
END
end
end
class Haxe < CodeGen
File = "QR.hx"
Cmd = "haxe -main QR -neko QR.n && neko QR.n > OUTFILE"
Apt = "haxe"
Code = %q("class QR{#$L function main(){neko.Lib.print#{E[PREV]};}}")
end
class Haskell < CodeGen
File = "QR.hs"
Cmd = "rm -f QR.o && ghc QR.hs && ./QR > OUTFILE"
Apt = "ghc"
Code = %q("main=putStr"+E[PREV])
end
class Groovy_Gzip < CodeGen
File = ["QR.groovy", "QR.gz"]
Cmd = ["groovy QR.groovy > OUTFILE", "gzip -cd QR.gz > OUTFILE"]
Apt = ["groovy", "gzip"]
def code
<<-'END'.lines.map {|l| l.strip }.join
%(
z=new java.util.zip.GZIPOutputStream(System.out);
z.write('#{PREV.tr(?"+B,"!~")}'.tr('~!','\\\\\u0022')as byte[]);
z.close()
)
END
end
end
class GolfScript_GPortugol_Grass < CodeGen
Name = ["GolfScript", "G-Portugol", "Grass"]
File = ["QR.gs", "QR.gpt", "QR.grass"]
Cmd = ["ruby vendor/golfscript.rb QR.gs > OUTFILE", "mv QR.c QR.c.bak && gpt -t QR.c QR.gpt && gcc -o QR QR.c && ./QR > OUTFILE && mv QR.c.bak QR.c", "ruby vendor/grass.rb QR.grass > OUTFILE"]
Apt = [nil, "gpt", nil]
def code
r = <<-'END'.lines.map {|l| l.strip }.join
%(
@@BASE@@:j;
{
119:i;
{
206i-:i;
.48<{71+}{[i]\\48-*}if
}%
}:t;
"algoritmo QR;in"[195][173]++'cio imprima("'
@@PROLOGUE@@
"#{e[PREV]}"
{
"W""w"@j 1+:j\\- @@MOD@@%1+*
}%
@@EPILOGUE@@
'");fim'
)
END
mod, prologue, epilogue = ::File.read(::File.join(__dir__, "grass-boot.dat")).lines
prologue += "t"
epilogue += "t"
prologue = prologue.gsub(/(\/12131)+/) { "\"t\"/12131\"t #{ $&.size / 6 }*\"" }
mod = mod.to_i
r.gsub(/@@\w+@@/, {
"@@PROLOGUE@@" => prologue.chomp,
"@@EPILOGUE@@" => epilogue.chomp,
"@@BASE@@" => 119 + mod - 1,
"@@MOD@@" => mod,
})
end
end
class Go < CodeGen
File = "QR.go"
Cmd = "go run QR.go > OUTFILE"
Apt = "golang"
def code
<<-'END'.lines.map {|l| l.strip }.join
%(
package main;
import"fmt";
func main(){
fmt.Print#{E[PREV]};
}
)
END
end
end
class Gnuplot < CodeGen
File = "QR.plt"
Cmd = "gnuplot QR.plt > OUTFILE"
Apt = "gnuplot"
Code = %q('set print"-";print'+E[PREV])
end
class GEL < CodeGen
Name = "GEL (Genius)"
File = "QR.gel"
Cmd = "genius QR.gel > OUTFILE"
Apt = "genius"
Code = %q(f(PREV,61){"printn#$S\n"})
end
class GDB < CodeGen
File = "QR.gdb"
Cmd = "gdb -q -x QR.gdb > OUTFILE"
Apt = "gdb"
Code = %q(%(printf"#{e[d[PREV,?%]]}"\nquit))
end
class GAP < CodeGen
File = "QR.g"
Cmd = "gap -q QR.g > OUTFILE"
Apt = "gap"
Code = %q("s:=OutputTextUser();WriteAll(s,#{E[PREV]});CloseStream(s);QUIT;")
end
class Gambas < CodeGen
Name = "Gambas script"
File = "QR.gbs"
Cmd = "$(GBS) QR.gbs > OUTFILE"
Apt = [["gambas3-scripter", "gambas3-gb-pcre"]]
Code = %q(%(print"#{e[PREV]}"))
end
class Forth_FORTRAN77_Fortran90 < CodeGen
File = ["QR.fs", "QR.f", "QR.f90"]
Cmd = [
"gforth QR.fs > OUTFILE",
"gfortran -o QR QR.f && ./QR > OUTFILE",
"gfortran -o QR QR.f90 && ./QR > OUTFILE"
]
Backup = [nil, "QR.c", nil]
Apt = ["gforth", "f2c", "gfortran"]
def code
# assuming that PREV has no '
<<-'END'.lines.map {|l| l.strip }.join(" ")
%(
: A ."#{g*9}" ;
: B A ." WRITE(*,*)'" A ;
: C B TYPE ." '" CR ;
: D
S" #$D" C
S\\" print \\"(&" C
S\\" #{e[PREV]}" DUP A ." DO 10 I=1," . CR
S" &A,&" C
." 10 CONTINUE" CR
S\\" &A)\\",&" C
0 DO B ." &char(" COUNT . ." ),&'" CR LOOP
S\\" &\\"\\"" C
S" end #$D" C
A ." STOP" CR
A ." END" CR
BYE ;
D
)
END
end
end
class Fish < CodeGen
File = "QR.fish"
Cmd = "fish QR.fish > OUTFILE"
Apt = "fish"
Code = %q("echo '#{Q[Q[PREV,B],?!].gsub(?',%('"'"'))}'")
end
class Flex < CodeGen
File = "QR.fl"
Cmd = "flex -o QR.fl.c QR.fl && gcc -o QR QR.fl.c && ./QR > OUTFILE"
Apt = "flex"
Code = %q("%option noyywrap\n%%\n%%\nint main(){puts#{E[PREV]};}")
end
class FALSELang < CodeGen
Name = "FALSE"
File = "QR.false"
Cmd = "ruby vendor/false.rb QR.false > OUTFILE"
Apt = [nil]
Code = %q(?"+PREV.gsub(?"){'"34,"'}.gsub(N){'"10,"'}+?")
end
class FSharp < CodeGen
Name = "F#"
File = "QR.fsx"
fsproj = <<-END
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<EnableDefaultCompileItems>false</EnableDefaultCompileItems>
</PropertyGroup>
<ItemGroup>
<Compile Include="QR.fsx" />
</ItemGroup>
</Project>
END
Cmd = %(echo '#{ fsproj.lines.map {|s| s.strip }.join }' > tmp.fsproj && DOTNET_NOLOGO=1 dotnet run --project tmp.fsproj > OUTFILE)
Apt = "dotnet8"
Code = %q('printfn("""'+d[PREV,?%]+' """)')
end
class Execline < CodeGen
File = "QR.e"
Cmd = "execlineb QR.e > OUTFILE"
Apt = "execline"
Code = %q(%(echo "#{e[PREV]}"))
end
class Erlang < CodeGen
File = "QR.erl"
Cmd = "escript QR.erl > OUTFILE"
Apt = "erlang"
Code = %q("\nmain(_)->\nio:fwrite#{d[E[PREV],?~]}.")
end
class EmacsLisp < CodeGen
Name = "Emacs Lisp"
File = "QR.el"
Cmd = "emacs -Q --script QR.el > OUTFILE"
Apt = "emacs-nox"
Code = %q(%((princ "#{e[PREV]}")))
end
class Elixir < CodeGen
File = "QR.exs"
Cmd = "elixir QR.exs > OUTFILE"
Apt = "elixir"
Code = %q("IO.puts"+E[PREV])
end
#class Dhall < CodeGen
# Name = "dhall"
# File = "QR.dhall"
# Cmd = "dhall text --file QR.dhall > OUTFILE"
# Apt = "dhall"
# Code = %q(E[PREV])
#end
#
#class Dc < CodeGen
# Name = "dc"
# File = "QR.dc"
# Cmd = "dc QR.dc > OUTFILE || true" # XXX
# Apt = "dc"
# Code = %q("[#{PREV}]pq")
#end
class Dc_Dhall < CodeGen
Name = ["dc", "Dhall"]
File = ["QR.dc", "QR.dhall"]
Cmd = [
"dc QR.dc > OUTFILE || true", # XXX
"dhall text --file QR.dhall > OUTFILE",
]
Apt = ["dc", "dhall"]
Code = %q("['']p[#{PREV}]p['']pq")
end
class D < CodeGen
File = "QR.d"
Cmd = "gdc -o QR QR.d && ./QR > OUTFILE"
Apt = "gdc"
Code = %q("import std.stdio;void main(){write(`#{PREV}`);}")
end
# pakcs package is broken in Ubuntu 20.10; I guess it will be fixed in Ubuntu 21.04
# it was fixed since 21.04, but it is broken again in Ubuntu 22.04
#class Curry < CodeGen
# Disabled = true
# File = "QR.curry"
# Cmd = "pakcs --nocypm :load QR.curry :save :quit && ./QR > OUTFILE"
# Apt = "pakcs"
# Code = %q("main=putStr"+E[PREV])
#end
class Crystal < CodeGen
Name = "Crystal"
File = "QR.cr"
Cmd = "crystal QR.cr > OUTFILE"
Apt = [["crystal", "libevent-dev"]]
Code = %q("puts#{E[PREV]}")
end
class CommonLisp < CodeGen
Name = "Common Lisp"
File = "QR.lisp"
Cmd = "clisp QR.lisp > OUTFILE"
Apt = "clisp"
Code = %q(%((write-line"#{e[PREV]}")))
end
class CoffeeScript < CodeGen
File = "QR.coffee"
Cmd = "coffee --nodejs --stack_size=100000 QR.coffee > OUTFILE"
Apt = "coffeescript"
def code
<<-'END'.lines.map {|l| l.strip }.join
"
(f=(n)->Array(n+1).join '\\\\');
console.log('%s',#{V[E[PREV].gsub(?`,"\\\\x60"),'#{f(',')}']})
"
END
end
end
class Clojure_CMake_Cobol < CodeGen
File = ["QR.clj", "QR.cmake", "QR.cob"]
Cmd = [
"clojure QR.clj > OUTFILE",
"cmake -P QR.cmake > OUTFILE",
"cobc -O2 -x QR.cob && ./QR > OUTFILE",
]
Apt = ["clojure", "cmake", "gnucobol4"]
def code
<<-'END'.lines.map {|l| l.strip }.join
%(
(doseq[s
(lazy-cat
["IDENTIFICATION DIVISION."
"PROGRAM-ID. QR."
"PROCEDURE DIVISION."
'DISPLAY]
(map #(str
" \\""
(.replace %1"\\"""\\"\\"")
"\\"")
(re-seq #".{1,45}"
"#{e[PREV]}"))
[" \\" \\"."
"STOP RUN."])]
(println(str
"message(STATUS \\" "
(.replace(.replace(str s)"\\\\""\\\\\\\\")"\\"""\\\\\\"")
"\\")")))
)
END
end
end
class CSharp_Chef < CodeGen
Name = ["C#", "Chef"]
File = ["QR.cs", "QR.chef"]
csproj = <<-END
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<EnableDefaultCompileItems>false</EnableDefaultCompileItems>
</PropertyGroup>
<ItemGroup>
<Compile Include="QR.cs" />
</ItemGroup>
</Project>
END
Cmd = [
%(echo '#{ csproj.lines.map {|s| s.strip }.join }' > tmp.csproj && DOTNET_NOLOGO=1 dotnet run --project tmp.csproj > OUTFILE),
"PERL5LIB=vendor/local/lib/perl5 compilechef QR.chef QR.chef.pl && perl QR.chef.pl > OUTFILE"
]
Apt = ["dotnet8", nil]
def code
<<-'END'.lines.map {|l| l.strip }.join
%(
class Program{
#$L void Main(){
#$C("Quine Relay Coffee.\\n\\nIngredients.\\n");
for(int i=9;i++<126;)#$C($"{i} g caffeine {i}\\n");
#$C("\\nMethod.\\n");
foreach(char c in#{E[PREV.reverse]})#$C($"Put caffeine {(int)c} into#$F.\\n");
#$C("Liquify#$G.\\nPour#$G into the baking dish.\\n\\nServes 1.\\n");
}
}
)
END
end
end
class Cplusplus < CodeGen
Name = "C++"
File = "QR.cpp"
Cmd = "$(CXX) -o QR QR.cpp && ./QR > OUTFILE"
Apt = "g++"
def code
<<-'END'.lines.map {|l| l.strip }.join
"
#include<iostream>\n
int main(){
std::cout<<#{E[PREV]};
}/****//****/
"
END
end
end
class C < CodeGen
File = "QR.c"
Cmd = "$(CC) -o QR QR.c && ./QR > OUTFILE"
Apt = "gcc"
def code
# LZ77-like compression
<<-'END'.lines.map {|l| l.strip.gsub(/^_+/) { " " * $&.size } }.join
(
s=PREV;
t={};b="";L="";n=i=0;D=->n{L<<(n+62)%92+35;D};
s.bytes{|c|
n>0?
n-=1:
(t[c]=(t[c]||[]).reject{|j|j<i-3560};
x=[];
t[c].map{|j|
k=(0..90).find{|k|not s[i+1+k]==s[j+k]}||91;
k>4&&x<<[k,j]
};
x=x.max)?
(
n,j=x;
x=b.size;(u=[x,3999].min;D[u%87][u/87];L<<b[0,u];b[0,u]="";x-=u)while x>0;
x=4001+i-j;D[x%87][x/87][n-5]
):b<<c;
t[c]+=[i+=1]
};
"
#include<stdio.h>\n
char*p=#{E[L]},s[999999],*q=s;
int main(){
int n,m;
for(;*p;){
n=(*p-5)%92+(p[1]-5)%92*87;
p+=2;
if(n>3999)
for(m=(*p++-5)%92+6;m--;q++)*q=q[4000-n];
else for(;n--;)*q++=*p++;
}
puts(s)#{R}
}
"
)
END
end
end
class BeanShell_Befunge_BLC8_Brainfuck < CodeGen
Name = ["BeanShell", "Befunge", "BLC8", "Brainfuck"]
File = ["QR.bsh", "QR.bef", "QR.Blc", "QR.bf"]
Cmd = [
"bsh QR.bsh > OUTFILE",
"cfunge QR.bef > OUTFILE",
"ruby vendor/blc.rb < QR.Blc > OUTFILE",
"ruby vendor/bf.rb QR.bf > OUTFILE",
]
Apt = ["bsh", nil, nil, nil]
def code
blc = ::File.read(::File.join(__dir__, "blc-boot.dat"))
<<-'END'.lines.map {|l| l.strip }.join.sub("BLC", [blc].pack("m0"))
%(
f(s){System.out.print(s);}
s="389**6+44*6+00p45*,";
for(c:#{E[PREV]}){
s+="00g,";
for(m=1;m<256;m*=2)
s+="00g,4,:"+(c/m%2>0?"4+":"")+",";
f(s);
s="4,:,";
}
f(s+s);
for(c:Base64.getDecoder().decode("BLC")){
c=c<0?256+c:c;
for(i=0;i++<3;c/=8)f(c%8);
f("8*+8*+,");
}
f("@");
)
END
end
end
class Bash_Bc < CodeGen
Name = ["bash", "bc"]
File = ["QR.bash", "QR.bc"]
Cmd = [
"bash QR.bash > OUTFILE",
"BC_LINE_LENGTH=4000000 bc -q QR.bc > OUTFILE",
]
Apt = ["bash", "bc"]
def code
<<-'END'.lines.map {|l| l.strip }.join
%(echo '#{PREV.gsub(?',%('"'"'))}'|sed -e's/\\\\/\\\\\\\\/g' -e's/"/\\\\q/g' -e's/.*/print "&"\\nquit/')
END
end
end
class Awk < CodeGen
Name = "Awk"
File = "QR.awk"
Cmd = "awk -f QR.awk > OUTFILE"
Apt = "gawk"
Code = %q("BEGIN{print#{E[PREV]}}")
end
class ATS < CodeGen
File = "QR.dats"
Cmd = "patscc -o QR QR.dats && ./QR > OUTFILE"
Apt = "ats2-lang"
Code = %q("implement main0()=print"+E[PREV])
end
class Asymptote < CodeGen
File = "QR.asy"
Cmd = "asy QR.asy > OUTFILE"
Apt = "asymptote"
Code = %q("write('#{Q[e[PREV],?']}');")
end
class AspectJ < CodeGen
File = "QR.aj"
Cmd = "ajc QR.aj && java QR > OUTFILE"
Apt = "aspectj"
def code
<<-'END'.lines.map {|l| l.strip }.join
%(
class QR{
#$L void main(String[]a){
a=#{E[PREV.gsub(/\\+/){"^#{$&.size}^"}]}.split("\\\\^");
for(int i=1;i<a.length;a[0]+=a[i+1],i+=2){
a[0]+="\\\\".repeat(Integer.parseInt(a[i]));
}
System.out.print(a[0]);
}
}
)
END
end
end
class ALGOL68_Ante < CodeGen
Name = ["ALGOL 68", "Ante"]
File = ["QR.a68", "QR.ante"]
Cmd = [
"a68g QR.a68 > OUTFILE",
"ruby vendor/ante.rb QR.ante > OUTFILE",
]
Apt = ["algol68g", nil]
def code
<<-'end'.lines.map {|l| l.strip }.join
%W[
STRINGz:= 226+ 153,a:=z+ 166,b:=a+"2"+z+ 160,c:=b+"8"+z+ 165,t:="#{d[PREV]}";
FORiTO\ UPBtDO\ INTn:=ABSt[i];
print( (50+n%64)+c+ (50+n%8MOD8)+c+ (50+nMOD8)+b+"J"+a)
OD
]*"REPR"
end
end
end
class AFNIX_Aheui < CodeGen
File = ["QR.als", "QR.aheui"]
Cmd = ["LANG=C LD_LIBRARY_PATH=/usr/lib/afnix axi QR.als > OUTFILE", "ruby vendor/aheui.rb QR.aheui > OUTFILE"]
Apt = ["afnix", nil]
def code
<<-'END'.lines.map {|l| l.strip }.join
%(
trans B(Buffer)\n
trans O(n){\n
B:add(Byte(+ 128 n))
}\n
trans f(v n){\n
O(+(/ n 64)107)\n
O(n:mod 64)\n
O v
}\n
trans D(n){
if(< n 4){
f(+(* 6 n)9)48
}{
if(n:odd-p){
D(- n 3)\n
f 27 48\n
f 36 11
}{
D(/ n 2)\n
f 21 48\n
f 48 20
}
}
}\n
trans S(Buffer"#{e[PREV]}")\n
while(!=(S:length)0){\n
trans c(S:read)\n
D(c:to-integer)\n
f 35 39
}\n
f 24 149\n
interp:library"afnix-sio"\n
trans o(afnix:sio:OutputTerm)\n
o:write B
)
END
end
end
class Ada < CodeGen
File = "qr.adb"
Cmd = "gnatmake qr.adb && ./qr > OUTFILE"
Apt = "gnat"
def code
<<-'END'.lines.map {|l| l.strip }.join.gsub("$$$", " ")
%(
with Ada.Text_Io;
procedure qr is$$$
begin$$$
Ada.Text_Io.Put("#{d[PREV].gsub(N,'"&Character'+?'+'Val(10)&"')}");
end;
)
END
#<<-'END'.lines.map {|l| l.strip }.join.gsub("$$$", " ")
# %(
# with Ada.Text_Io;
# procedure qr is$$$
# begin$$$
# #{f(PREV,120){
# %(Ada.Text_Io.Put("#{d[$s].gsub(N,'"&Character'+?'+'Val(10)&"')}");\n)
# }}
# Ada.Text_Io.Put_Line("");
# end;
# )
#END
end
end
class Aplus < CodeGen
Name = "A+"
File = "QR.+"
Cmd = "a+ QR.+ > OUTFILE"
Apt = "aplus-fsf"
Code = %q(E[PREV]+"\nsys.exit 0")
end
class Zsh < CodeGen
Name = "zsh"
File = "QR.zsh"
Cmd = "zsh QR.zsh > OUTFILE"
Apt = "zsh"
Code = %q("echo -E $'#{Q[Q[PREV,B],?']}'")
end
class Zoem < CodeGen
File = "QR.azm"
Cmd = "zoem -i QR.azm > OUTFILE"
Apt = "zoem"
Code = %q("\\\\write{-}{txt}{#{Q[PREV,/[\\\\{}]/]}}")
end
class Yorick < CodeGen
File = "QR.yorick"
Cmd = "yorick -batch QR.yorick > OUTFILE"
Apt = "yorick"
Code = %q(%(write,format="#{y="";f(PREV,35){y<<",\\n"+$S;"%s"}}")+y)
end
class Yabasic < CodeGen
File = "QR.yab"
Cmd = "yabasic QR.yab > OUTFILE"
Apt = "yabasic"
def code
<<-'END'.lines.map {|l| l.strip }.join
%(
sub f(s$,n)
print(s$);:
for i=1to n print("\\\\");:
next:
end sub:
f("#{V[e[PREV],'",','):f("']}",0)
)
END
end
end
class XSLT < CodeGen
File = "QR.xslt"
Cmd = "xsltproc QR.xslt > OUTFILE"
Apt = "xsltproc"
def code
<<-'END'.lines.map {|l| l.strip }.join.gsub("$$$", "\n")
"
<?xml#{O=" version='1.0'"}?>$$$
<?xml-#{I="stylesheet"} type='text/xsl'href='QR.xslt'?>$$$
<xsl:#{I+O} xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output method='text'/>
<#{U="xsl:template"} match='/'>
<![CDATA[#{PREV}]]>
</#{U}>
</xsl:#{I}>
"
END
end
end
class VisualBasic_WebAssemblyBinary_WebAssemblyText_Whitespace < CodeGen
Name = ["Visual Basic", "WebAssembly (Binary format)", "WebAssembly (Text format)", "Whitespace"]
File = ["QR.vb", "QR.wasm", "QR.wat", "QR.ws"]
vbproj = <<-END
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<EnableDefaultCompileItems>false</EnableDefaultCompileItems>
</PropertyGroup>
<ItemGroup>
<Compile Include="QR.vb" />
</ItemGroup>
</Project>
END
Cmd = [
%(echo '#{ vbproj.lines.map {|s| s.strip }.join }' > tmp.vbproj && DOTNET_NOLOGO=1 dotnet run --project tmp.vbproj > OUTFILE),
"$(WASI_RUNTIME) QR.wasm > OUTFILE",
"wat2wasm QR.wat -o QR.wat.wasm && $(WASI_RUNTIME) QR.wat.wasm > OUTFILE",
"ruby vendor/whitespace.rb QR.ws > OUTFILE"
]
Apt = ["dotnet8", "wabt", "wabt", nil]
def code
r = <<-'END'.lines.map {|l| l.strip }.join(?:)
%(Module QR\nSub Main()\nDim c,n:Dim s As Object=#{C[0]}.OpenStandardOutput():Dim t()As Short={@@TBL@@}
For Each d in"@@DATA1@@}@@DATA2@@~@@DATA3@@$@@DATA4@@"
c=Asc(d)
If c=36
For c=0To 11
#$W(If(c Mod 3,Asc(#{s=PREV;s.size*16+3}.ToString("x8")(1Xor 7-c*2\\3)),92))
Next
Else
n=(c>124)*(@@CONST1@@*c-#{s.size+@@CONST2@@})
Do While n>127
#$W(128+(127And n))
n\\=128
Loop
#$W(If(c<125,If((c-1)\\7-8,c+66*(c>65And c<91),t(c-57)),n))
End If
Next
For Each c in"#{d[s].gsub N,'"& VbLf &"'}"
#$W(Asc(c))
Next
End Sub
End Module)
END
tbl, data1, data2, data3, data4 = ::File.read(::File.join(__dir__, "wasm-tmpl.dat")).lines.map {|s| s.chomp }
raise unless data3[0] == '('
r.gsub(/@@\w+@@/, {
"@@TBL@@" => tbl,
"@@DATA1@@" => data1.gsub("\\"){"\\\\"},
"@@DATA2@@" => data2.gsub("\\"){"\\\\"},
"@@DATA3@@" => '#{40.chr}'+data3[1..].gsub("\\"){"\\\\"},
"@@DATA4@@" => data4.gsub("\\"){"\\\\"},
# precompute some expressions by assuming that 2**14 <= (292+s.size) < 2**21
# "@@CONST1@@" => '#{6+((292+s.size).bit_length-1)/7}',
"@@CONST1@@" => "8",
# "@@CONST2@@" => '292+125*6+126*(((292+s.size).bit_length-1)/7)',
"@@CONST2@@" => "1294"
})
end
end
class VimScript < CodeGen
Name = ["Vimscript"]
Apt = "vim"
File = "QR.vim"
Cmd = "vim -EsS QR.vim > OUTFILE"
def code
<<-'END'.lines.map {|l| l.strip }.join
(PREV).lines.map{|s|"let s=#{E[s]}\nput=s\nprint\n"}.join+"qa!"
END
end
end
class Verilog < CodeGen
File = "QR.v"
Cmd = "iverilog -o QR QR.v && ./QR -vcd-none > OUTFILE"
Apt = "iverilog"
Code = %q(%(module QR;initial begin #{f(PREV,3){%($write("%s",#$S);)+N}}end endmodule))
end
class Vala_Velato < CodeGen
File = ["QR.vala", "QR.mid"]
Cmd = [
"valac QR.vala && ./QR > OUTFILE",
"mono vendor/local/bin/Vlt.exe /s QR.mid && mono QR.exe > OUTFILE",
]
Apt = ["valac", nil]
def code
<<-'END'.lines.map {|l| l.strip }.join
%(
void p(int[]c){
foreach(int v in c)
stdout.printf("%c%c",v/256,v%256);
}
void main(){
int[]a;
p({19796,26724,0,6,0,1,480,19796,29291,#{s=PREV;W=s.size*72+4;"%d,%d"%[W/65536,W%65536]}});
foreach(int c in#{E[s]}.data)
foreach(int v in a={0,9,7,4,5,c/100*7/6+1,c%100/10*7/6+1,c%10*7/6+1,7})
p({144,v=15450+v*256,384,v});
p({255,12032});
}
)
END
end
end
class TypeScript_Unlambda < CodeGen
File = ["QR.ts", "QR.unl"]
Cmd = ["tsc --outFile QR.ts.js QR.ts && $(JAVASCRIPT) QR.ts.js > OUTFILE", "ruby vendor/unlambda.rb QR.unl > OUTFILE"]
Apt = ["node-typescript", nil]
def code
<<-'END'.lines.map {|l| l.strip }.join
"let s=#{E[PREV]},i=0,t='k';while(s[i])t='\\x60.'+s[i++]+t;console.log(t)"
END
end
end
class Tcsh_Thue < CodeGen
Name = ["tcsh", "Thue"]
File = ["QR.tcsh", "QR.t"]
Cmd = ["tcsh QR.tcsh > OUTFILE", "ruby vendor/thue.rb QR.t > OUTFILE"]
Apt = ["tcsh", nil]
Code = %q(%(echo 'a::=~#{Q[Q[PREV,B],?!].gsub(?',%('"'"'))}'"\\\\n::=\\\\na"))
end
class Tcl < CodeGen
File = "QR.tcl"
Cmd = "tclsh QR.tcl > OUTFILE"
Apt = "tcl"
Code = %q(%(puts "#{Q[e[PREV],/[\[\]$]/]}"))
end
class Swift < CodeGen
File = "QR.swift"
Cmd = "swiftc QR.swift && ./QR > OUTFILE"
Apt = "swiftlang"
Code = %q("print#{E[PREV]}")
end
class SurgeScript < CodeGen
File = "QR.ss"
Cmd = "surgescript QR.ss > OUTFILE"
Apt = "surgescript"
def code
<<-'END'
%(object"Application"{state"main"{foreach(s in[#{f(PREV,4){$S+?,}}])Console.write(s);Application.exit();}})
END
end
end
class StandardML_Subleq < CodeGen
Name = ["Standard ML", "Subleq"]
File = ["QR.sml", "QR.sq"]
Cmd = ["polyc -o QR QR.sml && ./QR > OUTFILE", "ruby vendor/subleq.rb QR.sq > OUTFILE"]
Apt = [["polyml", "libpolyml-dev"], nil]
def code
<<-'END'.lines.map {|l| l.strip }.join
%(
fun p n=print(Int.toString n^" ");
fun main()=(
p 0;p 0;p 130;
List.tabulate(127,p);
String.map(fn c=>(p(3+ord c);print"-1 0 ";c))#{E[PREV]};
print"0 0 -1"
);
)
END
end
end
class Squirrel < CodeGen
File = "QR.nut"
Cmd = "squirrel QR.nut > OUTFILE"
Apt = "squirrel3"
Code = %q("print"+E[PREV])
end
class Scilab_Sed_Shakespeare_SLang < CodeGen
Name = ["Scilab", "sed", "Shakespeare", "S-Lang"]
File = ["QR.sci", "QR.sed", "QR.spl", "QR.sl"]
Cmd = [
"scilab-cli -nb -f QR.sci > OUTFILE",
"sed -E -f QR.sed QR.sed > OUTFILE",
"spl2c < QR.spl > QR.spl.c && gcc -z muldefs -o QR -I ./vendor/local/include -L ./vendor/local/lib QR.spl.c -lspl -lm && ./QR > OUTFILE",
"slsh QR.sl > OUTFILE",
]
Apt = ["scilab-cli", "sed", nil, "slsh"]
def code
# NOTE: This code does not work for a short or simple text.
# This assumes the input is so complex enough that
# the compressed result won't be one character.
#
# * The Scheme program generates the encoded Shakespeare code.
# * sed program decodes and completes Shakespeare code.
# * The S-Lang program includes 8-bit characters and decompress the compression.
<<-'END'.lines.map {|l| l.strip }.join
%(
printf("
1d;
s/.//;
s/1/ the sum of a son and0/g;
s/0/ twice/g;
s/2/You are as bad as/g;
s/3/ a son!Speak your mind!/g\\n
#The Relay of Quine.\\n
#Ajax, a man.\\n
#Ford, a man.\\n
#Act i: Quine.\\n
#Scene i: Relay.\\n
#[Enter Ajax and Ford]\\n
#Ajax:\\n
#");
function[]=f(s);
for i=1:2:length(s),
printf("2%s3",part(dec2bin(hex2dec(part(s,i:i+1))),$:-1:2)),
end;
endfunction\n
#{
s,v=rp[PREV,127..255];
f(
%(
variable s=`#{s.gsub(/.{1,234}/){$&.gsub("`",%(`+"`"+`))+"`+\n`"}}`,i;
for(i=0;i<129;i++)
s=strreplace(
s,
pack("C",255-i),
substrbytes(`#{v[0,99]}`+\n`#{v[99..-1]}`,i*2+1,2));
printf("%s",s)
),7
){
"f('%s')\n"%$s.unpack("H*")
}
}
printf("\\n#[Exeunt]");
quit
)
END
end
end
class Scheme < CodeGen
File = "QR.scm"
Cmd = "$(SCHEME) QR.scm > OUTFILE"
Apt = "guile-3.0"
Code = %q(%((display "#{e[PREV]}")))
end
class Scala < CodeGen
File = "QR.scala"
Cmd = "scalac QR.scala && scala QR > OUTFILE"
Apt = "scala"
def code
<<-'END'.lines.map {|l| l.strip }.join
"
object QR extends App{
#{f(PREV,196){%(print#$S;)}}
}
"
END
end
end
class Rust < CodeGen
File = "QR.rs"
Cmd = "rustc QR.rs && ./QR > OUTFILE"
Apt = "rustc"
Code = %q(%(fn main(){print!("{}",#{E[PREV]});}))
end
class Ruby_ < CodeGen
Name = "Ruby"
File = "QR.rb"
Cmd = "ruby QR.rb > OUTFILE"
Apt = "ruby"
Code = nil
end
load "code-gen-pool.rb" if ENV["ALL"]
GenSteps = CodeGen::List.map {|s| s.gen_step }
RunSteps = CodeGen::List.reverse.flat_map {|s| s.run_steps }
================================================
FILE: src/dot.github.workflows.main.yml.gen.rb
================================================
require "yaml"
require_relative "code-gen"
apts = RunSteps.flat_map {|s| s.apt }
apts = apts.flatten.map {|apt| apt }.compact
apts.delete("ruby2.1")
srcs = RunSteps.flat_map {|s| s.src }
cp_cmds = srcs.map do |s|
" sudo docker cp qr:/usr/local/share/quine-relay/#{ s } spoiler/"
end.join("\n")
File.write(File.join(__dir__, "../.github/workflows/main.yml"), <<END)
name: CI
on:
- push
- pull_request
- workflow_dispatch
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: docker build
run: |
sudo docker build -t quine-relay .
- name: docker run
run: |
sudo docker run --privileged --name qr -e CI=true -t quine-relay
- name: push spoiler
run: |
git clone https://${GITHUB_ACTOR}:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git spoiler --branch spoiler
git -C spoiler rm --quiet -r '*'
#{ cp_cmds }
cd spoiler
git add .
GIT_AUTHOR_NAME="$(git show -s --format=%an "$GITHUB_SHA")" \\
GIT_AUTHOR_EMAIL="$(git show -s --format=%ae "$GITHUB_SHA")" \\
GIT_AUTHOR_DATE="$(git show -s --format=%ad "$GITHUB_SHA")" \\
GIT_COMMITTER_NAME='GitHub Actions' \\
GIT_COMMITTER_EMAIL='actions@github.com' \\
TZ=UTC \\
git commit --allow-empty -m "spoiler: $(git show -s --format=%s "$GITHUB_SHA")"
git push --quiet origin spoiler
echo The intermediate sources are available: https://github.com/${GITHUB_REPOSITORY}/tree/spoiler
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
END
================================================
FILE: src/grass-boot.dat.gen.rb
================================================
class Sym
def initialize(name = "<gen:%016x>" % self.object_id)
@name = name.to_s
end
def inspect
@name
end
def [](*others)
prev = self
others.each do |other|
sym = Sym.new
$prog << [:app, sym, prev, other]
prev = sym
end
prev
end
end
w = Sym.new(:W)
succ = Sym.new(:Succ)
out = Sym.new(:Out)
def fn(name, &blk)
params = blk.parameters.map {|_, param_name| Sym.new(param_name) }
sym = Sym.new(name)
$prog << [:abs, sym, params]
blk[*params]
$prog << [:ret]
sym
end
$result = []
[10, 32].each do |smallest_char|
$prog = []
succ2 = fn(:succ2) {|n| succ[succ[n]] }
succ4 = fn(:succ4) {|n| succ2[succ2[n]] }
succ8 = fn(:succ8) {|n| succ4[succ4[n]] }
succ16 = fn(:succ16) {|n| succ8[succ8[n]] }
succ32 = fn(:succ32) {|n| succ16[succ16[n]] }
succ64 = fn(:succ64) {|n| succ32[succ32[n]] }
succ128 = fn(:succ128) {|n| succ64[succ64[n]] }
add_num = ->(n, v) do
ary = [succ128, succ64, succ32, succ16, succ8, succ4, succ2, succ]
until v == 0
f = ary.pop
n = f[n] if v % 2 == 1
v /= 2
end
n
end
next_char = fn(:next_char) do |n|
sc = add_num[n, 129 + smallest_char]
# n == 127 ? c10 : succ[n]
add_num[w, 8][n, sc, add_num[n, 1]]
end
sub = fn(:sub) do |magic, n, _, m|
out[n]
magic[magic, next_char[m]]
end
# http://d.hatena.ne.jp/kikx/20080914
app23 = fn(:app23) {|x, y| y }
magic = fn(:magic) {|magic_, n, g| g[app23, sub[magic_], n] }
#main = fn(:main) do |n120,n121,n122,n123,n124,n125,n126,n127,n10,n11,n12,n13,n14,n15,n16,n17,n18,n19,n20,n21,n22,n23,n24,n25,n26,n27,n28,n29,n30,n31,n32,n33,n34,n35,n36,n37,n38,n39,n40,n41,n42,n43,n44,n45,n46,n47,n48,n49,n50,n51,n52,n53,n54,n55,n56,n57,n58,n59,n60,n61,n62,n63,n64,n65,n66,n67,n68,n69,n70,n71,n72,n73,n74,n75,n76,n77,n78,n79,n80,n81,n82,n83,n84,n85,n86,n87,n88,n89,n90,n91,n92,n93,n94,n95,n96,n97,n98,n99,n100,n101,n102,n103,n104,n105,n106,n107,n108,n109,n110,n111,n112,n113,n114,n115,n116,n117,n118,n119|
# $prog << [:raw, "!"]
# n120 = n119[n33]
# n121 = n120[n33]
# n122 = n121[n33]
# n123 = n122[n33]
# n124 = n123[n33]
# n125 = n124[n33]
# n126 = n125[n33]
#end
main = Sym.new(:main)
$prog << [:abs, main, (smallest_char..127).map { Sym.new }]
$prog << [:raw, "!"]
$prog << [:ret]
start = fn(:start) do |start_, main_, n|
m = main_[magic[magic, n]]
w[n, start_, start_[start_, m]][next_char[n]]
end
fn(:kick) {|_kick| start[start, main, next_char[w]] }
stacks = []
stack = [out, succ, w]
a = []
$prog[0..-2].each do |type, *args|
case type
when :abs
new_sym, params = args
a << "w" * params.size
stacks << ([new_sym] + stack)
stack = params.reverse + stack
when :app
new_sym, sym0, sym1 = args
a << " " + "W" * (stack.index(sym0) + 1) + "w" * (stack.index(sym1) + 1)
stack.unshift(new_sym)
when :ret
stack = stacks.pop
a << "v"
when :raw
a << args.first
end
end
prologue, epilogue = a.join.split.join.split("!")
def dump(s)
aa = [*"0".."Z"]
a = ""
s.scan(/(v|W*)(w{1,#{aa.size-1}})/) do |s1, s2|
a << (s1 == "v" ? "/" : aa[s1.size]) << aa[s2.size]
end
"#{ a.dump }"
end
epilogue = dump(epilogue)
prologue = dump(prologue)
$result << 128 - smallest_char
$result << prologue
$result << epilogue
end
open("grass-boot.dat", "w") do |f|
$result.each do |e|
f.puts e
end
end
================================================
FILE: src/langs.png.gen.rb
================================================
require_relative "code-gen"
require "cairo"
require "rsvg2"
# You need to install the two fonts: Raleway and UnifrakturCook.
# * https://www.google.com/fonts/specimen/Raleway
# * https://www.google.com/fonts/specimen/UnifrakturCook
%w(Raleway UnifrakturCook).each do |font|
if `fc-list #{ font }`.strip.empty? && !ENV["SKIP_FONT_CHECK"]
raise "Font `#{ font }' is not available; to skip this check, set SKIP_FONT_CHECK=1"
end
end
W = H = 750
surface = Cairo::ImageSurface.new(W, H)
ctx = Cairo::Context.new(surface)
ctx.line_width = 1
ctx.set_source_rgb(1, 1, 1)
ctx.rectangle(0, 0, W, H)
ctx.fill
ctx.set_source_rgb(0, 0, 0)
ctx.translate(W / 2, H / 2)
ctx.select_font_face("Raleway")
ctx.antialias = Cairo::Antialias::GRAY
BaseFontSize = 13
SubFontSize = 10
Radius = 210.0
RunSteps.each_with_index do |s, i|
ctx.save do
angle = i / (RunSteps.size / 4.0)
dir = 1 < angle && angle <= 3 ? 1 : -1
ctx.rotate(Math::PI / 2 * (dir < 0 ? -angle : 2 - angle + 0.02))
s.name =~ /^(.*?)(\(.*\))?$/
name, sub_name = $1, $2 || ""
ctx.font_size = BaseFontSize; e1 = ctx.text_extents(name)
ctx.font_size = SubFontSize ; e2 = ctx.text_extents(sub_name)
ctx.move_to(dir * (Radius + 10) - (dir < 0 ? e1.x_advance + e2.x_advance : 0), 0)
ctx.font_size = BaseFontSize; ctx.show_text(name)
ctx.font_size = SubFontSize ; ctx.show_text(sub_name)
end
end
ArrowCount = 7
ArrowCount.times do |i|
ctx.save do
ctx.rotate(Math::PI * (2 * i) / ArrowCount - Math::PI + 0.1)
ctx.line_width = 2
ctx.line_cap = Cairo::LineCap::SQUARE
ctx.new_path
ctx.arc(0, 0, Radius, 0.0, Math::PI * 2 / ArrowCount - 0.1)
ctx.stroke
ctx.line_width = 1
ctx.move_to(Radius , -8)
ctx.line_to(Radius - 6, 2)
ctx.line_to(Radius + 6, 2)
ctx.fill
end
end
Uroboros = 350.0
ctx.select_font_face("UnifrakturCook")
ctx.font_size = 25
Title = "#{ RunSteps.size }-Language Uroboros Quine"
e = ctx.text_extents(Title)
height = Uroboros / 2 + e.height + 20
ctx.move_to(-e.width / 2, height / 2)
ctx.show_text(Title)
ctx.save do
svg = RSVG::Handle.new_from_file("uroboros.svg")
ctx.translate(-Uroboros / 2, -height / 2)
ctx.scale(Uroboros / svg.width, Uroboros / svg.width)
ctx.render_rsvg_handle(svg)
end
surface.write_to_png("../langs.png")
unless ENV["NO_PNG_OPT"]
system 'optipng -fix -i0 -o7 -strip all ../langs.png'
system 'advdef -z4 ../langs.png'
system 'advpng -z4 ../langs.png'
end
# convert svg to template
#
#require "cairo"
#require "rsvg2"
#H = 52.0
#W = H * 4
#surface = Cairo::ImageSurface.new(W, H)
#ctx = Cairo::Context.new(surface)
#svg = RSVG::Handle.new_from_file("uroboros2.svg")
#ctx.translate(4, 2)
#ctx.rotate(-0.014)
#ctx.scale((W - 8) / svg.width, (H - 4) / svg.height)
#ctx.render_rsvg_handle(svg)
#data = surface.data.unpack("C*")
#M = (0...H).map do |y|
# (0...W).map do |x|
# idx = y * surface.stride + x * 4
# data[idx] < 40 && data[idx + 3] > 48 ? " " : "#"
# end.join
#end
#puts *M
================================================
FILE: src/lazyk-boot.dat.gen.rb
================================================
Var = Struct.new(:name)
Abs = Struct.new(:var, :exp)
App = Struct.new(:exp1, :exp2)
Comb = Struct.new(:type)
S, K, I = Comb[:S], Comb[:K], Comb[:I]
class Var
def fvs
{ name => 1 }
end
def remove_abs
self
end
def remove_var(n)
if n == name
I
else
App[K, self]
end
end
def inspect(need_paren = true)
name.to_s
end
end
class Abs
def fvs
@fvs ||= (
s = exp.fvs.dup
s.delete(var)
s
)
end
def remove_abs
exp.remove_abs.remove_var(var)
end
def remove_var(v)
if exp.fvs[v]
exp.remove_abs.remove_var(v)
else
App[K, self]
end
end
def inspect(need_paren = true)
vs, e = [var], exp
while e.is_a?(Abs)
vs << e.var
e = e.exp
end
"(\\#{ vs * " " }. #{ e.inspect(false) })"
end
end
class App
def fvs
@fvs ||= (
s = exp1.fvs.dup
exp2.fvs.each do |v, n|
s[v] ||= 0
s[v] += n
end
s
)
end
def remove_abs
App[exp1.remove_abs, exp2.remove_abs]
end
def remove_var(v)
if fvs[v]
if exp2.is_a?(Var) && exp2.name == v && !exp1.fvs[v]
exp1
else
App[App[S, exp1.remove_var(v)], exp2.remove_var(v)]
end
else
App[K, self]
end
end
def inspect(need_paren = true)
s = "%s %s" % [exp1.inspect(false), exp2.inspect(true)]
s = "(#{ s })" if need_paren
s
end
def to_unlambda
"`" + exp1.to_unlambda + exp2.to_unlambda
end
def simplify
if exp1 == I
exp2.simplify # I x -> x
elsif exp1.is_a?(App)
if exp1.exp1 == K
exp1.simplify # K x y -> x
elsif exp1.exp1.is_a?(App) && exp1.exp1.exp1 == S
if exp1.exp1.exp2.is_a?(App) && exp1.exp1.exp2.exp1 == K
App[exp1.exp1.exp2.exp2, App[exp1.exp2, exp2]].simplify # S (K x) y z -> x (y z)
elsif exp1.exp2.is_a?(App) && exp1.exp2.exp1 == K
App[App[exp1.exp1.exp2, exp2], exp1.exp2.exp2].simplify # S x (K y) z -> x z y
else
App[exp1.simplify, exp2.simplify]
end
else
App[exp1.simplify, exp2.simplify]
end
else
App[exp1.simplify, exp2.simplify]
end
end
end
class Comb
def fvs
{}
end
def remove_abs
self
end
def remove_var(v)
App[K, self]
end
def inspect(need_paren = true)
type.to_s
end
def to_unlambda
type.to_s.downcase
end
def simplify
self
end
end
def ary2app(exp)
if exp.is_a?(Array)
exp = exp.map {|e| ary2app(e) }
e1 = App[*exp.shift(2)]
exp.each {|e2| e1 = App[e1, e2] }
e1
elsif exp.is_a?(Abs)
Abs[exp.var, ary2app(exp.exp)]
else
exp
end
end
def to_unlambda(exp)
ary2app(exp).remove_abs.simplify.to_unlambda
end
def abs(&b)
vars = b.parameters.map {|type, name| name }
exp = yield(*vars.map {|name| Var[name] })
vars.reverse_each {|v| exp = Abs[v, exp] }
exp
end
Zero = abs {|s, z| z }
One = abs {|s, z| [s, z] }
Two = abs {|s, z| [s, [s, z]] }
Three = abs {|s, z| [s, [s, [s, z]]] }
Six = abs {|s| [Two, [Three, s]] }
N256 = [abs {|n| [n, n] }, [abs {|n| [n, n] }, abs {|s, z| [s, [s, z]] }]]
Inc = abs {|n, s, z| [s, [[n, s], z]] }
Dbl = abs {|n, s| [n, abs {|x| [s, [s, x]] }] }
Cons = abs {|hd, tl| abs {|f| [f, hd, tl] } }
Pow = abs {|n, m| [m, n] }
IfLE6 = -> m, t, e { [[m, Pow, [K, t]], [Six, Pow, [K, e]]] }
Main =
[
abs {|x| [x, x, Zero, Zero] },
abs {|main, count, num, code|
IfLE6[count,
[main, main, [Inc, count], [code, I, Inc, [Dbl, num]]],
[Cons, num, code]
]
}
]
if ARGV[0]
puts "k`"
"foobar\n".bytes do |c|
print "``s" * 8 + "i"
6.downto(0) {|j| print "`" + "kki"[c[j], 2] }
puts
end
puts "`k`k" + to_unlambda(N256) + to_unlambda(Main)
else
File.write("lazyk-boot.dat", "`k`k" + to_unlambda(N256) + to_unlambda(Main))
end
================================================
FILE: src/test.rb
================================================
# usage:
# ruby test.rb # test all Steps
# ruby test.rb Perl # test only Perl Step
require_relative "code-gen"
ENV["PATH"] = "vendor/local/bin:#{ ENV["PATH"] }"
dir = File.join(File.dirname(__dir__), "tmp")
Dir.mkdir(dir) unless File.directory?(dir)
Dir.chdir(dir)
File.symlink("../vendor", "vendor") unless File.symlink?("vendor")
gens = ARGV[0] ? [eval(ARGV[0]).gen_step] : GenSteps[0..-2]
text = ARGV[1] || "Hello"
all_check = true
gens.each do |gen_step|
puts "test: %s" % gen_step.name
code = Object.new.instance_eval(GenPrologue + gen_step.code.sub("PREV") { text.dump }) + "\n"
code.sub!("%%", "%") if gen_step.name == "Octave_Ook"
steps = [*gen_step.run_steps, RunStep[nil, "QR.txt"]]
File.write(steps.first.src, code)
steps.each_cons(2) do |src, dst|
cmd = src.cmd_raw.gsub("OUTFILE", dst.src)
puts "cmd: " + cmd
system(cmd) || raise("failed")
end
check = File.read("QR.txt").strip == text
all_check &&= check
puts "result: #{ check ? "OK" : "NG" }"
puts
end
puts all_check ? "all ok" : "something wrong"
================================================
FILE: src/thumbnail.png.gen.rb
================================================
require "chunky_png"
# zcat /usr/share/fonts/X11/misc/4x6.pcf.gz |
# pcf2bdf |
# ruby -e '$<.each("") {|s| (n = $1.to_i; puts " %3d => 0x%s," % [n, $2.split.map {|n| n[0] }.join] if 32 <= n && n <= 126) if s =~ /ENCODING (\d+).*BITMAP(.*)ENDCHAR/m }'
FONT = {
32 => 0x000000, 33 => 0x444040, 34 => 0xAA0000, 35 => 0xAFAFA0,
36 => 0x4EC2E4, 37 => 0x824820, 38 => 0x4A4A50, 39 => 0x440000,
40 => 0x244442, 41 => 0x844448, 42 => 0xA4E4A0, 43 => 0x44E440,
44 => 0x000048, 45 => 0x00E000, 46 => 0x000040, 47 => 0x224880,
48 => 0x4AEA40, 49 => 0x4C44E0, 50 => 0x4A24E0, 51 => 0xE242C0,
52 => 0xAAE220, 53 => 0xE8C2C0, 54 => 0x68CA40, 55 => 0xE24880,
56 => 0x6A4AC0, 57 => 0x4A62C0, 58 => 0x040040, 59 => 0x040048,
60 => 0x248420, 61 => 0x0E0E00, 62 => 0x842480, 63 => 0xC24040,
64 => 0x6AA860, 65 => 0x4AEAA0, 66 => 0xCACAC0, 67 => 0x4A8A40,
68 => 0xCAAAC0, 69 => 0xE8C8E0, 70 => 0xE8C880, 71 => 0x68AA60,
72 => 0xAAEAA0, 73 => 0xE444E0, 74 => 0x222A40, 75 => 0xAACAA0,
76 => 0x8888E0, 77 => 0xAEEAA0, 78 => 0x2AEA80, 79 => 0x4AAA40,
80 => 0xCAC880, 81 => 0x4AAA42, 82 => 0xCACAA0, 83 => 0x6842C0,
84 => 0xE44440, 85 => 0xAAAAE0, 86 => 0xAAAE40, 87 => 0xAAEEA0,
88 => 0xAA4AA0, 89 => 0xAA4440, 90 => 0xE248E0, 91 => 0x644460,
92 => 0x884220, 93 => 0xC444C0, 94 => 0x4A0000, 95 => 0x00000E,
96 => 0x420000, 97 => 0x06AA60, 98 => 0x8CAAC0, 99 => 0x068860,
100 => 0x26AA60, 101 => 0x04AC60, 102 => 0x24E440, 103 => 0x06A62C,
104 => 0x8CAAA0, 105 => 0x40C4E0, 106 => 0x20222C, 107 => 0x8ACAA0,
108 => 0xC444E0, 109 => 0x0AEAA0, 110 => 0x0CAAA0, 111 => 0x04AA40,
112 => 0x0CAC88, 113 => 0x06AA62, 114 => 0x0AC880, 115 => 0x06C2C0,
116 => 0x4E4420, 117 => 0x0AAA60, 118 => 0x0AAA40, 119 => 0x0AAEA0,
120 => 0x0A44A0, 121 => 0x0AA62C, 122 => 0x0E24E0, 123 => 0x24C442,
124 => 0x444440, 125 => 0x846448, 126 => 0x5A0000
}
src = File.foreach("../QR.rb").to_a
w = src.map {|line| line.chomp.size }.max
h = src.size
png = ChunkyPNG::Image.new(w * 4, h * 8, :black)
src.each_with_index do |line, j|
line.chomp.chars.each_with_index do |ch, i|
6.times do |y|
4.times do |x|
png[i * 4 + 3 - x, j * 8 + y + 1] =
[:black, :white][FONT[ch.ord][x + (5 - y) * 4]]
end
end
end
end
png.save('../thumbnail.png')
================================================
FILE: src/uroboros.txt
================================================
###################################################################################################################################################################################################################
###################################################################################################################################################################################################################
###################################################################################################################################################################################################################
###################################################################################################################################################################################################################
###################################################################################################################################################################################################################
###################################################################################################################################################################################################################
############################################ ######### ###########################################################################################################################################################
################################# ###### #### ######## ################################################################################################################################################
############################### ### # #################################################################################### #############################################
############################# ## ############################################################### #####################################
########################### ############################################################ ################################
########################## ################################################# ############################
######################### ########################################## #########################
####################### ######################################### ######################
##################### #### ################################## ############## ###################
#################### ##### ############################ ############################ ##################
################### #### ########################### ###################################### ################
################### ###################### ###################### ############################################ ##############
################### #### ################################## ################# ################################################## #############
##################### ################################################# ############# ###################################################### ###########
################## ################################################### ############ ########################################################## ##########
############### ######################################################## ######## ############################################################# #########
############## ############################################################ #### ################################################################# ########
############ ############################################################### ## ############################################################################### ########
########## ################################################################### ###### ############################################################### #######
######### ###################################################################### ################################################### ######
######## ######################################################################## ############################################## ######
####### ########################################################################### ######################################### ######
####### ############################################################################ ##################################### ######
###### ############################################################################### ################################## #####
###### ################################################################################ ############################### #####
##### ################################################################################## ########################### #####
##### ################################################################################### ######################## ######
##### ################################################################################## # ##################### ######
##### ################################################################################ ## ########## #### ################## ######
##### ############################################################################### # ############# ########### ############### #######
###### ############################################################################# # ############## ############## ##### ############ #######
###### ########################################################################## ## ############################### ############ ######### ########
####### ######################################################################## #### ################################ ################ ###### #########
######## ##################################################################### ######## ################################ ################### ### ##########
######## ################################################################## ########## #################################################### # ###########
######### ############################################################### ############## ################################################# ############
########## ############################################################ ################## ############################################# ##############
############ ####################################################### ##################### ####################################### ###############
############# ################################################### ######################## ############################### #################
############### ############################################# ############################ ################## ###################
################# ####################################### ################################## #####################
################### ############################## ###################################### #######################
##################### ############### ############################################ ##########################
######################## ################################################## #############################
########################### ######################################################### #################################
################################ ################################################################# #####################################
###################################### ############################################################################### ############################################
###################################################################################################################################################################################################################
###################################################################################################################################################################################################################
###################################################################################################################################################################################################################
###################################################################################################################################################################################################################
###################################################################################################################################################################################################################
###################################################################################################################################################################################################################
================================================
FILE: src/wasm-tmpl.dat.gen.rb
================================================
def f(s)
enc = -> n { [n].pack("V").unpack1("H*").gsub(/../){"\\"+$&} }
esc = -> s { s.gsub(?\\){'\\\\'}.gsub(?"){'\\"'} }
wasm_txt_pre = <<-'END'.lines.map {|s| s.strip }.join + enc[s.size * 16 + 3]
(module
(import "wasi_snapshot_preview1" "fd_write" (func(param i32 i32 i32 i32)(result i32)))
(memory(export "memory")(data "\08\00\00\00
END
raise unless wasm_txt_pre.size % 4 == 0
wasm_txt_post = <<-'END'.lines.map {|s| s.strip }.join
"))
(func(export "_start")i32.const 1 i32.const 0 i32.const 1 i32.const 0 call 0 drop)
)
END
txt = <<-END
(module
(import "wasi_snapshot_preview1" "fd_write"(func $fd_write(param i32 i32 i32 i32)(result i32)))
(memory 64)
(export "memory"(memory 0))
(data(i32.const 0)"#{
enc[8*5]+enc[1] # " "
}#{
enc[8*5+4]+enc[2] # "\t"
}#{
enc[8*5+8]+enc[2] # "\n"
}#{
enc[8*5+12]+enc[wasm_txt_pre.size]
}#{
enc[8*5+12+wasm_txt_pre.size]+enc[wasm_txt_post.size]
} ...\\\\t..\\\\n..#{ esc[wasm_txt_pre] }#{ esc[wasm_txt_post] }#{ s }")
(func $out(param i32)
i32.const 1
local.get 0
i32.const 8
i32.mul
i32.const 1
i32.const #{ 8 * 5 + 12 }
call $fd_write
drop
)
(func(export "_start")
(local $idx i32)
(local $shift i32)
i32.const 3
call $out
i32.const #{ 8*5+12+wasm_txt_pre.size+wasm_txt_post.size }
local.set $idx
(loop
i32.const 0 call $out (; out << 32 ;)
i32.const 0 call $out (; out << 32 ;)
i32.const 0 call $out (; out << 32 ;)
i32.const 8
local.set $shift
(loop
local.get $idx
i32.load8_u
local.get $shift
i32.const 1
i32.sub
local.tee $shift
i32.shr_u
i32.const 1
i32.and
call $out (; out << 32 - c[7-i] * 23 ;)
local.get $shift
br_if 0
)
i32.const 2 call $out (; out << 10 ;)
i32.const 1 call $out (; out << 9 ;)
i32.const 2 call $out (; out << 10 ;)
i32.const 0 call $out (; out << 32 ;)
i32.const 0 call $out (; out << 32 ;)
local.get $idx
i32.const 1
i32.add
local.tee $idx
i32.load8_u
br_if 0
)
i32.const 2 call $out (; out << 10 ;)
i32.const 2 call $out (; out << 10 ;)
i32.const 2 call $out (; out << 10 ;)
i32.const 4
call $out
)
)
END
end
File.write("ABCD.wat", f("abcd"))
File.write("ABCDE.wat", f("abcde"))
system("wat2wasm ABCD.wat", exception: true)
system("wat2wasm ABCDE.wat", exception: true)
abcd = File.binread("ABCD.wasm")
abcde = File.binread("ABCDE.wasm")
i = (0..).find {|i| abcd[i] != abcde[i] }
j = (abcd.size - 4).downto(0).find {|i| abcd[i] != abcde[i] }
data1 = abcd[0, i]
raise unless data1 == abcde[0, i]
data2 = abcd[i + 2, 5]
raise unless data2 == abcde[i + 2, 5]
data3 = abcd[i + 2 + 5 + 2...j-1]
raise unless data3 == abcde[i + 2 + 5 + 2...j-1]
data4 = abcd[j + 12-1...-4]
# wasm template:
# data1 + LSB128(length+const) + data2 + LSB128(length+const) + data3 + Hexdump(length) + data4
A = [26, 34, 86, 127, 148, 158, 200]
def e(data)
enc = "".b
data.bytes do |n|
case
when n < 0x1a
enc << [n + ?B.ord].pack("C*")
when ?9.ord <= n && n < ?9.ord + A.size
raise
when n < 32 || n == ?".ord || (?B.ord <= n && n <= ?Z.ord) || n >= 127
enc << [?9.ord + A.index(n)].pack("C*")
else
enc << n
end
end
enc
end
def d(data)
data.gsub(/./) { "9" <= $& && $& < "@" ? [A[$&.ord - ?9.ord]].pack("C*") : "A" < $& && $& < "Z" ? [$&.ord - ?B.ord].pack("C*") : $& }
end
[data1, data2, data3, data4].each do |data|
raise unless data == d(e(data))
end
File.open("wasm-tmpl.dat", "w") do |f|
f.puts A.join(",")
f.puts e(data1)
f.puts e(data2)
f.puts e(data3)
f.puts e(data4)
end
d=->s,t=?"{s.gsub(t){t+t}};
out = "ABCDE"
# test code
raise if data3.size + data4.size + 18 != 292
n = 292+out.size
m = (n.bit_length - 1) / 7
puts <<END.lines.map {|s| s.strip }.join(":")
Module QR
Sub Main()
Dim c,n,s As Object=System.Console.OpenStandardOutput(),t()As Short={#{A.join(",")}}
For Each c in"#{e(data1)}}#{e(data2)}~#{e(data3)}$#{e(data4)}"
c=Asc(c)
If c=36
For c=0To 11
s.WriteByte(If(c Mod 3,Asc(#{out.size*16+3}.ToString("x8")(1Xor 7-c*2\\3)),92))
Next
Else
n=(c>124)*(#{6+m}*c-#{m+n+125*(6+m)})
Do While n>127
s.WriteByte(128+(127And n))
n\\=128
Loop
s.WriteByte(If(c<125,If((c-1)\\7-8,c+66*(c>65And c<91),t(c-57)),n))
End If
Next
For Each c in"#{d[out]}"
s.WriteByte(Asc(c))
Next
End Sub
End Module
END
================================================
FILE: vendor/.gitignore
================================================
Spl/
goaheui/
lci-*/
npiet-*/
cfunge-*/
Acme-Chef-*/
local/
spl-*/
================================================
FILE: vendor/Makefile
================================================
LCI := lci-0.10.5
NPIET := npiet-1.3e
CFUNGE := cfunge-0.9.0
ACME_CHEF := Acme-Chef-1.03
SPL := spl-1.2.1
LOCAL := $(CURDIR)/local
.NOTPARALLEL:
all: $(LOCAL)/bin/lci $(LOCAL)/bin/npiet $(LOCAL)/bin/cfunge $(LOCAL)/bin/compilechef $(LOCAL)/bin/lazyk $(LOCAL)/bin/spl2c $(LOCAL)/bin/Vlt.exe
$(LOCAL)/bin/lci:
unzip -q $(LCI).zip
(cd $(LCI) && cmake -DCMAKE_INSTALL_PREFIX=$(LOCAL) . && make && make install)
$(LOCAL)/bin/npiet:
tar xzf $(NPIET).tar.gz
(cd $(NPIET) && ./configure CC="gcc -std=c99 -Wno-implicit-function-declaration -Wno-int-conversion" --prefix=$(LOCAL) && make && make install)
$(LOCAL)/bin/cfunge:
tar xjf $(CFUNGE).tar.bz2
(cd $(CFUNGE) && cmake -DCMAKE_INSTALL_PREFIX=$(LOCAL) . && make && make install)
$(LOCAL)/bin/compilechef:
tar xzf $(ACME_CHEF).tar.gz
(cd $(ACME_CHEF) && perl Makefile.PL INSTALL_BASE=$(LOCAL) && make && make install)
$(LOCAL)/bin/lazyk:
$(CC) lazyk.c -o $@
$(LOCAL)/bin/spl2c:
tar xzf $(SPL).tar.gz
(cd $(SPL) && ln -s ../local spl && make spl2c CCFLAGS="-O0 -g -Wall" && make install)
$(LOCAL)/bin/Vlt.exe:
unzip -d $(LOCAL)/bin -q Velato_0_1.zip
clean:
rm -rf $(LOCAL)/ $(LCI)/ $(NPIET)/ $(CFUNGE)/ $(ACME_CHEF)/ $(SPL)/
================================================
FILE: vendor/README
================================================
Unlambda: unlambda.rb
* self-made
* License: MIT
Whitespace: whitespace.rb
* self-made
* License: MIT
Subleq: subleq.rb
* self-made
* License: MIT
Thue: thue.rb
* self-made
* License: MIT
Ook!: ook-to-bf.rb
* self-made
* License: MIT
BLC8: blc.rb
* self-made
* License: MIT
FALSE: false.rb
* self-made
* License: MIT
Aheui: aheui.rb
* self-made
* License: MIT
ante: ante.rb
* https://github.com/michaeldv
* License: MIT
Befunge: cfunge-0.9.0.tar.bz2
* http://sourceforge.net/projects/cfunge/
* License: GPL3
Chef: Acme-Chef-1.03.tar.gz
* https://metacpan.org/pod/Acme::Chef
* License: the same terms as Perl (Artistic License)
Grass: grass.rb
* http://www.blue.sky.or.jp/grass/
* License: BSD 2-Clause
* slightly modified for Ruby 2+
GolfScript: golfscript.rb
* http://www.golfscript.com/golfscript/
* License: MIT
LOLCODE: lci-0.10.5.zip
* http://lolcode.org/
* License: GPL3+
Piet: npiet-1.3e.tar.gz
* http://www.bertnase.de/npiet/
* License: GPL2
Lazy K: lazyk.c
* https://github.com/irori/lazyk
* License: GPL2+
Shakespeare: spl-1.2.1.tar.gz
* http://shakespearelang.sourceforge.net/
* License: GPL
Velato: Velato_0_1.zip
* http://velato.net/
* License: freeware
================================================
FILE: vendor/aheui.rb
================================================
# https://aheui.readthedocs.io/en/latest/specs.en.html
code = $<.each_line.map do |s|
s.chomp.unpack("U*").map do |c|
if 0xac00 <= c && c <= 0xd7a3
c -= 0xac00
# Hangul initial consonant, vowel, final consonant
[c / 21 / 28, c / 28 % 21, c % 28]
end
end
end
def read_int
s = ""
while true
ch = $stdin.getc
case ch
when /\d+/ then s << ch
when /\s+/ then break
else raise "Integer expected"
end
end
s.to_i
end
STROKE_TABLE = [0,2,4,4,2,5,5,3,5,7,9,9,7,9,9,8,4,4,6,2,4,nil,3,4,3,4,4,nil]
x, y, dx, dy, s = 0, 0, 0, 1, 0
ss = (0..27).map { [] }
def (ss[21]).pop; shift; end # queue
ss[27] = nil # extension protocol
check_size = -> n do
if ss[s].size >= n
true
else
dx, dy = -dx, -dy
false
end
end
while true
ic, vo, fc = code[y][x]
case ic
when 11 # null
when 18 then exit # terminate
when 3 then check_size[2] && (a, b = ss[s].pop, ss[s].pop; ss[s] << b + a)
when 4 then check_size[2] && (a, b = ss[s].pop, ss[s].pop; ss[s] << b * a)
when 2 then check_size[2] && (a, b = ss[s].pop, ss[s].pop; ss[s] << b / a)
when 16 then check_size[2] && (a, b = ss[s].pop, ss[s].pop; ss[s] << b - a)
when 5 then check_size[2] && (a, b = ss[s].pop, ss[s].pop; ss[s] << b % a)
when 6 # pop
if check_size[1]
v = ss[s].pop
case fc
when 21 then puts v
when 27 then print v.chr("UTF-8")
end
end
when 7 # push
case fc
when 21 then ss[s] << read_int
when 27 then ss[s] << $stdin.getc.ord
else ss[s] << STROKE_TABLE[fc]
end
when 8 then check_size[1] && ss[s] << ss[s][s != 21 ? -1 : 0] # duplicate
when 17 # swap
if check_size[2]
r = s != 21 ? (-2..-1) : (0..1)
ss[s][r] = ss[s][r].reverse
end
when 9 then s = fc # select
when 10 then check_size[1] && ss[fc] << ss[s].pop # transfer
when 12 # compare
check_size[2] && ss[fc] << (ss[s].pop <= ss[s].pop ? 1 : 0)
when 14 # fork
dx, dy = -dx, -dy if check_size[1] && ss[fc].pop != 0
end
case vo
when 0 then dx, dy = 1, 0
when 2 then dx, dy = 2, 0
when 4 then dx, dy = -1, 0
when 6 then dx, dy = -2, 0
when 8 then dx, dy = 0, -1
when 12 then dx, dy = 0, -2
when 13 then dx, dy = 0, 1
when 17 then dx, dy = 0, 2
when 18 then dy = -dy
when 19 then dx, dy = -dx, -dy
when 20 then dx = -dx
end
x, y = x + dx, y + dy
end
================================================
FILE: vendor/ante.rb
================================================
#!/usr/bin/env ruby
# encoding: utf-8
#
# Copyright (c) 2013 Michael Dvorkin
#
# Ante is an esoteric programming language where all you've got is
# a deck of cards.
#
# 95% of this code was developed on the way back from RubyConf 2013
# during 5-hour flight from Miami to San Francisco.
#
### require "awesome_print"
class Array
def rank; self[0] end
def suit; self[1] end
def rank=(value); self[0] = value end
def suit=(value); self[1] = value end
end
class Ante
def initialize()
@♦, @♥, @♠, @♣ = 0, 0, 0, 0
@line, @pc = 0, 0
@code, @labels = [], {}
end
def run(source)
parse(source)
### ap @code; ap @labels
while card = @code[@pc]
@pc += 1
case card.rank
when nil then newline(card)
when "K" then jump(card)
when "Q" then next
when "J" then dump(card, :char)
when 10 then dump(card)
else assign(card)
end
end
end
def parse(source)
lines = source.split("\n").map { |line| line.sub(/#.*$/, "").strip }
### ap lines
# Turn source file into array of cards. Each card is 2-item
# array of rank and suit.
lines.each_with_index do |line, i|
@code += [[ nil, i + 1 ]] # <-- Line number cards have nil rank.
@code += line.scan(/(10|[2-9JQKA])([♦♥♠♣])/)
end
# A pass to convert ranks to Fixnum and extract labels.
pc = 0
while card = @code[pc]
pc += 1
if card.rank =~ /\d/
card.rank = card.rank.to_i
elsif card.rank == "Q"
queen = card.suit
while @code[pc] && @code[pc].rank == "Q" && @code[pc].suit == card.suit
queen += card.suit
pc += 1
end
@labels[queen] = pc
end
end
end
def newline(card)
# puts "newline #{card}"
@line = card.suit
end
def assign(card)
# puts "assign #{card.inspect}"
operands = remaining(card)
expression(operands)
end
def jump(card)
# puts "jump #{card.inspect}, pc: #{@pc.inspect}, #{@labels.inspect}"
suit = card.suit
while @code[@pc] && @code[@pc].rank == "K" && @code[@pc].suit == card.suit
suit += card.suit
@pc += 1
end
if instance_variable_get("@#{suit[0]}") != 0
# puts "jumping to " << "Q#{suit[0]}" * suit.size
if @labels[suit]
@pc = @labels[suit]
else
exception("can't find " << "Q#{suit[0]}" * suit.size << " to go to")
end
end
end
def dump(card, char = nil)
# puts "dump #{card.inspect} => "
value = instance_variable_get("@#{card.suit}")
if char
if valu
gitextract_2_dvvpj1/
├── .gitattributes
├── .github/
│ ├── FUNDING.yml
│ └── workflows/
│ └── main.yml
├── .gitignore
├── Dockerfile
├── Makefile
├── QR.rb
├── README.md
├── SHA256SUMS
├── src/
│ ├── Dockerfile.gen.rb
│ ├── Makefile.gen.rb
│ ├── QR.rb.gen.rb
│ ├── README.md.gen.rb
│ ├── Rakefile
│ ├── SHA256SUMS.gen.rb
│ ├── blc-boot.dat.gen.rb
│ ├── code-gen-pool.rb
│ ├── code-gen.rb
│ ├── dot.github.workflows.main.yml.gen.rb
│ ├── grass-boot.dat.gen.rb
│ ├── langs.png.gen.rb
│ ├── lazyk-boot.dat.gen.rb
│ ├── test.rb
│ ├── thumbnail.png.gen.rb
│ ├── uroboros.txt
│ └── wasm-tmpl.dat.gen.rb
└── vendor/
├── .gitignore
├── Makefile
├── README
├── aheui.rb
├── ante.rb
├── bf.rb
├── blc.rb
├── cfunge-0.9.0.tar.bz2
├── dummy-wasi-runtime.c
├── false.rb
├── golfscript.rb
├── grass.rb
├── lazyk.c
├── ook-to-bf.rb
├── subleq.rb
├── thue.rb
├── unlambda.rb
├── wasi-runtime.js
└── whitespace.rb
SYMBOL INDEX (250 symbols across 13 files)
FILE: src/Makefile.gen.rb
function banner (line 5) | def banner(s1, s2=nil, i=nil)
FILE: src/blc-boot.dat.gen.rb
function dump (line 1) | def dump(e, env)
FILE: src/code-gen-pool.rb
class Zig (line 40) | class Zig < CodeGen
FILE: src/code-gen.rb
class CodeGen (line 7) | class CodeGen
method inherited (line 13) | def self.inherited(c)
method gen_step (line 17) | def self.gen_step
method code (line 21) | def code
method run_steps (line 25) | def self.run_steps
class Python_R_Ratfor_Rc_REXX (line 80) | class Python_R_Ratfor_Rc_REXX < CodeGen
method code (line 91) | def code
class Promela (line 103) | class Promela < CodeGen
class Prolog (line 111) | class Prolog < CodeGen
class PostScript (line 118) | class PostScript < CodeGen
class Pike (line 126) | class Pike < CodeGen
class PHP_Piet (line 133) | class PHP_Piet < CodeGen
method code (line 137) | def code
class Perl6 (line 161) | class Perl6 < CodeGen
class Perl5 (line 169) | class Perl5 < CodeGen
method code (line 174) | def code
class Pascal (line 204) | class Pascal < CodeGen
class Parser3 (line 211) | class Parser3 < CodeGen
class PARIGP (line 219) | class PARIGP < CodeGen
class Octave_Ook (line 227) | class Octave_Ook < CodeGen
method code (line 235) | def code
class OCaml (line 255) | class OCaml < CodeGen
class ObjC (line 262) | class ObjC < CodeGen
class Nim (line 270) | class Nim < CodeGen
class Nickle (line 277) | class Nickle < CodeGen
class Neko (line 284) | class Neko < CodeGen
class Mustache_NASM (line 291) | class Mustache_NASM < CodeGen
method code (line 298) | def code
class MSIL (line 318) | class MSIL < CodeGen
method code (line 322) | def code
class Modula2 (line 337) | class Modula2 < CodeGen
method code (line 342) | def code
class MiniZinc (line 357) | class MiniZinc < CodeGen
class Makefile (line 364) | class Makefile < CodeGen
class M4 (line 371) | class M4 < CodeGen
class Lua (line 378) | class Lua < CodeGen
class LOLCODE (line 385) | class LOLCODE < CodeGen
method code (line 389) | def code
class LLVMAsm (line 402) | class LLVMAsm < CodeGen
method code (line 408) | def code
class Ksh_LazyK_LiveScript (line 423) | class Ksh_LazyK_LiveScript < CodeGen
method code (line 433) | def code
class Kotlin (line 460) | class Kotlin < CodeGen
class JavaScript_Jq_JSFuck (line 467) | class JavaScript_Jq_JSFuck < CodeGen
method code (line 475) | def code
class Java_ (line 511) | class Java_ < CodeGen
method code (line 516) | def code
class Jasmin (line 552) | class Jasmin < CodeGen
method code (line 556) | def code
class Icon_INTERCAL (line 573) | class Icon_INTERCAL < CodeGen
method code (line 581) | def code
class Haxe (line 603) | class Haxe < CodeGen
class Haskell (line 610) | class Haskell < CodeGen
class Groovy_Gzip (line 617) | class Groovy_Gzip < CodeGen
method code (line 621) | def code
class GolfScript_GPortugol_Grass (line 632) | class GolfScript_GPortugol_Grass < CodeGen
method code (line 637) | def code
class Go (line 672) | class Go < CodeGen
method code (line 676) | def code
class Gnuplot (line 689) | class Gnuplot < CodeGen
class GEL (line 696) | class GEL < CodeGen
class GDB (line 704) | class GDB < CodeGen
class GAP (line 711) | class GAP < CodeGen
class Gambas (line 718) | class Gambas < CodeGen
class Forth_FORTRAN77_Fortran90 (line 726) | class Forth_FORTRAN77_Fortran90 < CodeGen
method code (line 735) | def code
class Fish (line 761) | class Fish < CodeGen
class Flex (line 768) | class Flex < CodeGen
class FALSELang (line 775) | class FALSELang < CodeGen
class FSharp (line 783) | class FSharp < CodeGen
class Execline (line 803) | class Execline < CodeGen
class Erlang (line 810) | class Erlang < CodeGen
class EmacsLisp (line 817) | class EmacsLisp < CodeGen
class Elixir (line 825) | class Elixir < CodeGen
class Dc_Dhall (line 848) | class Dc_Dhall < CodeGen
class D (line 859) | class D < CodeGen
class Crystal (line 876) | class Crystal < CodeGen
class CommonLisp (line 884) | class CommonLisp < CodeGen
class CoffeeScript (line 892) | class CoffeeScript < CodeGen
method code (line 896) | def code
class Clojure_CMake_Cobol (line 906) | class Clojure_CMake_Cobol < CodeGen
method code (line 914) | def code
class CSharp_Chef (line 940) | class CSharp_Chef < CodeGen
method code (line 960) | def code
class Cplusplus (line 977) | class Cplusplus < CodeGen
method code (line 982) | def code
class C (line 994) | class C < CodeGen
method code (line 998) | def code
class BeanShell_Befunge_BLC8_Brainfuck (line 1041) | class BeanShell_Befunge_BLC8_Brainfuck < CodeGen
method code (line 1051) | def code
class Bash_Bc (line 1076) | class Bash_Bc < CodeGen
method code (line 1084) | def code
class Awk (line 1091) | class Awk < CodeGen
class ATS (line 1099) | class ATS < CodeGen
class Asymptote (line 1106) | class Asymptote < CodeGen
class AspectJ (line 1113) | class AspectJ < CodeGen
method code (line 1117) | def code
class ALGOL68_Ante (line 1134) | class ALGOL68_Ante < CodeGen
method code (line 1142) | def code
class AFNIX_Aheui (line 1154) | class AFNIX_Aheui < CodeGen
method code (line 1158) | def code
class Ada (line 1200) | class Ada < CodeGen
method code (line 1204) | def code
class Aplus (line 1229) | class Aplus < CodeGen
class Zsh (line 1237) | class Zsh < CodeGen
class Zoem (line 1245) | class Zoem < CodeGen
class Yorick (line 1252) | class Yorick < CodeGen
class Yabasic (line 1259) | class Yabasic < CodeGen
method code (line 1263) | def code
class XSLT (line 1277) | class XSLT < CodeGen
method code (line 1281) | def code
class VisualBasic_WebAssemblyBinary_WebAssemblyText_Whitespace (line 1297) | class VisualBasic_WebAssemblyBinary_WebAssemblyText_Whitespace < CodeGen
method code (line 1319) | def code
class VimScript (line 1361) | class VimScript < CodeGen
method code (line 1366) | def code
class Verilog (line 1373) | class Verilog < CodeGen
class Vala_Velato (line 1380) | class Vala_Velato < CodeGen
method code (line 1387) | def code
class TypeScript_Unlambda (line 1407) | class TypeScript_Unlambda < CodeGen
method code (line 1411) | def code
class Tcsh_Thue (line 1418) | class Tcsh_Thue < CodeGen
class Tcl (line 1426) | class Tcl < CodeGen
class Swift (line 1433) | class Swift < CodeGen
class SurgeScript (line 1440) | class SurgeScript < CodeGen
method code (line 1444) | def code
class StandardML_Subleq (line 1451) | class StandardML_Subleq < CodeGen
method code (line 1456) | def code
class Squirrel (line 1471) | class Squirrel < CodeGen
class Scilab_Sed_Shakespeare_SLang (line 1478) | class Scilab_Sed_Shakespeare_SLang < CodeGen
method code (line 1488) | def code
class Scheme (line 1541) | class Scheme < CodeGen
class Scala (line 1548) | class Scala < CodeGen
method code (line 1552) | def code
class Rust (line 1563) | class Rust < CodeGen
class Ruby_ (line 1570) | class Ruby_ < CodeGen
FILE: src/grass-boot.dat.gen.rb
class Sym (line 1) | class Sym
method initialize (line 2) | def initialize(name = "<gen:%016x>" % self.object_id)
method inspect (line 6) | def inspect
method [] (line 10) | def [](*others)
function fn (line 25) | def fn(name, &blk)
function dump (line 116) | def dump(s)
FILE: src/lazyk-boot.dat.gen.rb
class Var (line 7) | class Var
method fvs (line 8) | def fvs
method remove_abs (line 11) | def remove_abs
method remove_var (line 14) | def remove_var(n)
method inspect (line 21) | def inspect(need_paren = true)
class Abs (line 26) | class Abs
method fvs (line 27) | def fvs
method remove_abs (line 34) | def remove_abs
method remove_var (line 37) | def remove_var(v)
method inspect (line 44) | def inspect(need_paren = true)
class App (line 53) | class App
method fvs (line 54) | def fvs
method remove_abs (line 64) | def remove_abs
method remove_var (line 67) | def remove_var(v)
method inspect (line 78) | def inspect(need_paren = true)
method to_unlambda (line 83) | def to_unlambda
method simplify (line 86) | def simplify
class Comb (line 109) | class Comb
method fvs (line 110) | def fvs
method remove_abs (line 113) | def remove_abs
method remove_var (line 116) | def remove_var(v)
method inspect (line 119) | def inspect(need_paren = true)
method to_unlambda (line 122) | def to_unlambda
method simplify (line 125) | def simplify
function ary2app (line 130) | def ary2app(exp)
function to_unlambda (line 143) | def to_unlambda(exp)
function abs (line 147) | def abs(&b)
FILE: src/wasm-tmpl.dat.gen.rb
function f (line 1) | def f(s)
function e (line 122) | def e(data)
function d (line 139) | def d(data)
FILE: vendor/aheui.rb
function read_int (line 13) | def read_int
function pop (line 30) | def (ss[21]).pop; shift; end
FILE: vendor/ante.rb
class Array (line 14) | class Array
method rank (line 15) | def rank; self[0] end
method suit (line 16) | def suit; self[1] end
method rank= (line 17) | def rank=(value); self[0] = value end
method suit= (line 18) | def suit=(value); self[1] = value end
class Ante (line 21) | class Ante
method initialize (line 22) | def initialize()
method run (line 28) | def run(source)
method parse (line 45) | def parse(source)
method newline (line 73) | def newline(card)
method assign (line 78) | def assign(card)
method jump (line 84) | def jump(card)
method dump (line 102) | def dump(card, char = nil)
method remaining (line 117) | def remaining(card)
method expression (line 128) | def expression(operands)
method exception (line 150) | def exception(message)
method dump_registers (line 154) | def dump_registers
FILE: vendor/dummy-wasi-runtime.c
function u32 (line 26) | u32 fd_write(u32 fd, u32 iovs, u32 iovsLen, u32 size) {
function main (line 44) | int main() {
FILE: vendor/grass.rb
class Grass (line 40) | class Grass
class Error (line 44) | class Error < StandardError ; end
class RuntimeError (line 45) | class RuntimeError < Error ; end
class IllegalState (line 46) | class IllegalState < Error ; end
class Value (line 50) | class Value
method char_code (line 51) | def char_code
method app (line 55) | def app(m, arg)
class Insn (line 60) | class Insn
class App (line 63) | class App < Insn
method initialize (line 64) | def initialize(m, n)
method eval (line 68) | def eval(m)
method pretty_print (line 74) | def pretty_print(q)
class Abs (line 81) | class Abs < Insn
method initialize (line 82) | def initialize(body)
method eval (line 86) | def eval(m)
method pretty_print (line 90) | def pretty_print(q)
class Fn (line 97) | class Fn < Value
method initialize (line 98) | def initialize(code, env)
method app (line 102) | def app(m, arg)
class CharFn (line 112) | class CharFn < Value
method initialize (line 113) | def initialize(char_code)
method app (line 118) | def app(m, arg)
class Succ (line 124) | class Succ < Value
method app (line 125) | def app(m, arg)
class Out (line 130) | class Out < Value
method app (line 131) | def app(m, arg)
class In (line 138) | class In < Value
method app (line 139) | def app(m, arg)
method eval (line 148) | def eval(m)
method start (line 168) | def start(code)
method parse (line 172) | def parse(src)
method run (line 190) | def run(src)
FILE: vendor/lazyk.c
type tagPair (line 41) | struct tagPair
type tagPair (line 42) | struct tagPair
type Pair (line 47) | typedef struct tagPair {
function errexit (line 96) | void errexit(char *fmt, ...)
function storage_init (line 106) | void storage_init(int size)
function Cell (line 119) | Cell pair(Cell fst, Cell snd)
function Cell (line 132) | Cell alloc(int n)
function gc_run (line 145) | void gc_run(Cell *save1, Cell *save2)
function Cell (line 191) | Cell copy_cell(Cell c)
type RdStack (line 219) | typedef struct {
function rs_init (line 226) | void rs_init(void)
function rs_copy (line 235) | void rs_copy(void)
function rs_max_depth (line 242) | int rs_max_depth(void)
function rs_push (line 252) | void rs_push(Cell c)
function Cell (line 275) | Cell load_program(const char *fname)
function next_char (line 296) | int next_char(FILE *fp)
function Cell (line 309) | Cell read_many(FILE *fp, int closing_char)
function Cell (line 329) | Cell read_one(FILE *fp, int i_is_iota)
function eval (line 376) | void eval(Cell root)
function eval_print (line 487) | void eval_print(Cell root)
function help (line 498) | void help(const char *progname) {
function main (line 506) | int main(int argc, char *argv[])
FILE: vendor/whitespace.rb
function read_int (line 41) | def read_int
Condensed preview — 45 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (253K chars).
[
{
"path": ".gitattributes",
"chars": 261,
"preview": "/Dockerfile linguist-generated\n/Makefile linguist-generated\n/QR.rb linguist-generated linguist-language=prose\n/README.md"
},
{
"path": ".github/FUNDING.yml",
"chars": 13,
"preview": "github: mame\n"
},
{
"path": ".github/workflows/main.yml",
"chars": 10651,
"preview": "name: CI\non:\n - push\n - pull_request\n - workflow_dispatch\njobs:\n build:\n runs-on: ubuntu-latest\n steps:\n "
},
{
"path": ".gitignore",
"chars": 121,
"preview": "/QR*\n/qr*\n/tmp\n/nimcache\n/.curry\n!QR.rb\ngst.im\n/src/lazyk-boot.dat\n/src/blc-boot.dat\n/src/grass-boot.dat\n*.sw*\ntmp.*proj"
},
{
"path": "Dockerfile",
"chars": 2878,
"preview": "FROM ubuntu:25.10\nENV DEBIAN_FRONTEND noninteractive\nRUN apt-get update && apt-get upgrade -y\nRUN apt-get -qq install -y"
},
{
"path": "Makefile",
"chars": 25223,
"preview": "MAKEFLAGS += --no-print-directory\n\nPATH := $(CURDIR)/vendor/local/bin:/usr/games:$(PATH)\nCLASSPATH := .\n\nfind_any0 = $(f"
},
{
"path": "QR.rb",
"chars": 16120,
"preview": "eval$s=%q(eval(%w(B=92.chr;g=32.chr;puts(eval(%q(N=10.chr;n=0;e=->s{Q[Q[s,B],?\"].K(N,B+?n)};E=->s{'(\"'+e[s]+'\")'};d=->s,"
},
{
"path": "README.md",
"chars": 27813,
"preview": "# Quine Relay\n\n[](https://github.com/mame/quine-relay/a"
},
{
"path": "SHA256SUMS",
"chars": 9335,
"preview": "12623f713c91a8a66799c2c48fc6d69b5c8e667534e6ba0f6456eb874076c081 *QR.rb\n9df1959f513e14e295e338bd60324068555aa69f9a39d70f"
},
{
"path": "src/Dockerfile.gen.rb",
"chars": 899,
"preview": "require_relative \"code-gen\"\n\napts = RunSteps.flat_map {|s| s.apt }\nother_packages = %w(libpng-dev libgd-dev groff flex b"
},
{
"path": "src/Makefile.gen.rb",
"chars": 2075,
"preview": "require_relative \"code-gen\"\n\nOUT = []\n\ndef banner(s1, s2=nil, i=nil)\n s = \"## #{ \"#{ i + 1 }: \" if i }#{ s1 }#{ ' -> '"
},
{
"path": "src/QR.rb.gen.rb",
"chars": 2539,
"preview": "require_relative \"code-gen\"\n\ngen_prologue_1 = GenPrologue.split(?;)[0, 2].join(?;)\ngen_prologue_2 = GenPrologue.split(?;"
},
{
"path": "src/README.md.gen.rb",
"chars": 11980,
"preview": "require_relative \"code-gen\"\nrequire \"erb\"\nrequire \"cairo\"\n\nother_packages = %w(cmake libpng-dev libgd-dev groff bison cu"
},
{
"path": "src/Rakefile",
"chars": 1745,
"preview": "require \"rake/clean\"\n\nCLEAN.include(\"../QR.*\")\nCLEAN.include(\"../qr.*\")\nCLEAN.include(\"../QR$*\")\nCLEAN.include(\"../QR\")\n"
},
{
"path": "src/SHA256SUMS.gen.rb",
"chars": 127,
"preview": "require_relative \"code-gen\"\n\nDir.chdir(\"..\") do\n system(\"sha256sum\", \"-b\", *RunSteps.map {|s| s.src }, out: \"SHA256SUMS"
},
{
"path": "src/blc-boot.dat.gen.rb",
"chars": 2333,
"preview": "def dump(e, env)\n if e.is_a?(Symbol)\n ?1 * (env.index(e) + 1) + ?0\n elsif e[0] == :abs!\n vs = [*e[1]].reverse\n "
},
{
"path": "src/code-gen-pool.rb",
"chars": 1261,
"preview": "original_list_size = CodeGen::List.size\n\n#class NesC < CodeGen\n# Name = \"nesC\"\n# File = \"QR.nc\"\n# Cmd = \"nescc -o QR "
},
{
"path": "src/code-gen.rb",
"chars": 40375,
"preview": "# A source for generating Quine Relay\n\nGenStep = Struct.new(:name, :code, :run_steps)\nRunStep = Struct.new(:name, :src, "
},
{
"path": "src/dot.github.workflows.main.yml.gen.rb",
"chars": 1719,
"preview": "require \"yaml\"\nrequire_relative \"code-gen\"\n\napts = RunSteps.flat_map {|s| s.apt }\napts = apts.flatten.map {|apt| apt }.c"
},
{
"path": "src/grass-boot.dat.gen.rb",
"chars": 3482,
"preview": "class Sym\n def initialize(name = \"<gen:%016x>\" % self.object_id)\n @name = name.to_s\n end\n\n def inspect\n @name\n "
},
{
"path": "src/langs.png.gen.rb",
"chars": 2993,
"preview": "require_relative \"code-gen\"\nrequire \"cairo\"\nrequire \"rsvg2\"\n\n# You need to install the two fonts: Raleway and Unifraktur"
},
{
"path": "src/lazyk-boot.dat.gen.rb",
"chars": 3833,
"preview": "Var = Struct.new(:name)\nAbs = Struct.new(:var, :exp)\nApp = Struct.new(:exp1, :exp2)\nComb = Struct.new(:type)\nS, K, I = C"
},
{
"path": "src/test.rb",
"chars": 1069,
"preview": "# usage:\n# ruby test.rb # test all Steps\n# ruby test.rb Perl # test only Perl Step\n\nrequire_relative \"code-gen\""
},
{
"path": "src/thumbnail.png.gen.rb",
"chars": 2348,
"preview": "require \"chunky_png\"\n\n# zcat /usr/share/fonts/X11/misc/4x6.pcf.gz |\n# pcf2bdf |\n# ruby -e '$<.each(\"\") {|s| (n = $1.to_i"
},
{
"path": "src/uroboros.txt",
"chars": 12508,
"preview": "########################################################################################################################"
},
{
"path": "src/wasm-tmpl.dat.gen.rb",
"chars": 4943,
"preview": "def f(s)\n enc = -> n { [n].pack(\"V\").unpack1(\"H*\").gsub(/../){\"\\\\\"+$&} }\n esc = -> s { s.gsub(?\\\\){'\\\\\\\\'}.gsub(?\"){'\\"
},
{
"path": "vendor/.gitignore",
"chars": 67,
"preview": "Spl/\ngoaheui/\nlci-*/\nnpiet-*/\ncfunge-*/\nAcme-Chef-*/\nlocal/\nspl-*/\n"
},
{
"path": "vendor/Makefile",
"chars": 1209,
"preview": "LCI := lci-0.10.5\nNPIET := npiet-1.3e\nCFUNGE := cfunge-0.9.0\nACME_CHEF := Acme-Chef-1.03\nSPL\t := spl-1.2.1"
},
{
"path": "vendor/README",
"chars": 1258,
"preview": "Unlambda: unlambda.rb\n * self-made\n * License: MIT\n\nWhitespace: whitespace.rb\n * self-made\n * License: MIT\n\nSubleq: "
},
{
"path": "vendor/aheui.rb",
"chars": 2397,
"preview": "# https://aheui.readthedocs.io/en/latest/specs.en.html\n\ncode = $<.each_line.map do |s|\n s.chomp.unpack(\"U*\").map do |c|"
},
{
"path": "vendor/ante.rb",
"chars": 4039,
"preview": "#!/usr/bin/env ruby\n# encoding: utf-8\n#\n# Copyright (c) 2013 Michael Dvorkin\n#\n# Ante is an esoteric programming languag"
},
{
"path": "vendor/bf.rb",
"chars": 745,
"preview": "code = File.read($*[0]).unpack(\"C*\")\ndata = [0]\ni = j = 0\nwhile code[i]\n case code[i]\n when 60 # <\n j -= 1\n when 6"
},
{
"path": "vendor/blc.rb",
"chars": 2390,
"preview": "# Binary lambda calculus interpreter\n#\n# (C) Copyright 2014, 2015, Yusuke Endoh\n# License: MIT\n#\n# See in detail: http:/"
},
{
"path": "vendor/dummy-wasi-runtime.c",
"chars": 1368,
"preview": "#include <stdio.h>\n#include <stdlib.h>\n#define/*\n\nf = ARGV[0]\nsystem(\"wasm2c\", f, \"-o\", f + \".c\", exception: true)\nsyste"
},
{
"path": "vendor/false.rb",
"chars": 2192,
"preview": "code = File.read($*[0])\nstack = []\n\npos = 0\n\nparse = ->(re) do\n m = code.match(re, pos)\n pos = m.end(0) - 1\n m[1]\nend"
},
{
"path": "vendor/golfscript.rb",
"chars": 8834,
"preview": "#!/usr/bin/ruby\n#(c) Copyright 2008 Darren Smith. All Rights Reserved.\n$lb = []\nclass Gtype\n\tdef go\n\t\t$stack<<self\n\tend\n"
},
{
"path": "vendor/grass.rb",
"chars": 4833,
"preview": "#!/usr/bin/ruby -Ku\n#\n# grass.rb - Grass interpreter\n# http://www.blue.sky.or.jp/grass/\n#\n# Copyright (C) 2006, 2007 UEN"
},
{
"path": "vendor/lazyk.c",
"chars": 13716,
"preview": "/*\n * Lazy K interpreter\n *\n * Copyright 2008 irori <irorin@gmail.com>\n * This code is licensed under the MIT License"
},
{
"path": "vendor/ook-to-bf.rb",
"chars": 425,
"preview": "RE = /\\G(?:\\s*Ook(?<c1>.)\\s*Ook(?<c2>.)|(?<eof>)\\s*\\z|(?<error>))/\n\nT = {\n \".?\" => \">\",\n \"?.\" => \"<\",\n \"..\" => \"+\",\n "
},
{
"path": "vendor/subleq.rb",
"chars": 514,
"preview": "IN_ADDR = -1\nOUT_ADDR = -1\n\nmem = File.read(ARGV[0]).split.map do |v|\n if v.start_with?(?#)\n case v\n when \"#IN\" "
},
{
"path": "vendor/thue.rb",
"chars": 547,
"preview": "RE = /^\\s*::=.*\\n(?<body>(?m:.*))|^(?<lhs>.+?)::=(?<rhs>.*)$/\n\nrules, body = {}, \"\"\nFile.binread($*[0]).scan(RE) do\n $~"
},
{
"path": "vendor/unlambda.rb",
"chars": 1354,
"preview": "tokens = [] \nFile.read($*[0]).scan(/\\.(?<out>.)|(?<insn>[r`ikscd])|#.*/) do\n if $~[:out]\n tokens << [:o, $~[:out]]\n "
},
{
"path": "vendor/wasi-runtime.js",
"chars": 381,
"preview": "'use strict';\n\nconst fs = require('fs');\nconst { WASI } = require('wasi');\nconst wasi = new WASI({ version: \"preview1\" }"
},
{
"path": "vendor/whitespace.rb",
"chars": 2394,
"preview": "RE = /\\G(?<num>[01]+){0}(?<label>[01]*){0}\n ( 00 (?<push> )\\g<num>2\n | 010 (?<copy> )\\g<num>2\n | 012 (?<slide>)\\g<nu"
}
]
// ... and 1 more files (download for full content)
About this extraction
This page contains the full source code of the mame/quine-relay GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 45 files (231.7 KB), approximately 81.5k tokens, and a symbol index with 250 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.