つくつくわいん / Quineアートを作成してみた
Quineアートが欲しいだけの方向け
下記ソースコードの実行結果は等幅フォントで閲覧してください。
行間の幅はできるだけ小さい方が結果を綺麗に閲覧することができます。
eval$s=%w' b="BAhsKwIUBQAAA AAAgP8BwP8/ AAAAAP g/APgB+P//A+AAAAAAAAD+B /D/
AQAAwP//Pw D4/////wHAAAA AAAAA/h/8HwAA8P///38A+AP A//8BwAAAAAAAAPD//wEA+P//////AP4HHAD/B /A
AAAAAAADA/z8 AwP///////8 Mf+AcA////AAAAAAAAgP8/APz/////////D /gBAP// /wAAAAAAAAD//4P//// //
////wfgAID///8AAAAAAA AAf/7///////////8DwADg////AAAAAAAAwB/A/////// /////D8CB/ f// AAAAAAAAAOA H/P/
//////////z/A//8 BAAAAAAAAAADwgf////////////8/8P8HAAAAAAAAAAAA+OD//// /////// ///4D/Hw AAAAAAAAAAAD74//////////
+///8D/F8AAAAAA AAAAAAf/v////////////7/B/D/AAAAAAAAAACAD//////////////8/x/g/wIAAAA AAAAAw If/////////////8f8/wP8FA
AAAAAAAAOCD/////// /////38P/f4D/DwAAAAAAAADgwf///////////z+P//8B/x8AAAAAAAAA8PH//////// /// x/Yv//A/4/AAAAAAAAAPjw///
/////z3 f4//n+/wf8fwAAAAAAAAB8+P//////rw/m+f/h//8P+H8AAAAAAAAAfPj///8/9y4jBv3/w///P/D/AgA AA AAAAD78////XxeDY8T+/4f//z/g
/wUAAAA AAAA+/P///w+VlXTg+/+f////wP8LAAAAAAAAP/z///+PE7D2wf//P////4D/HwAAAAAAAD/+////x zCw +s P//3////+B/38AAAAAAAA/
/t//v8 s45v/v/////v//Af+/AAAAAACAP/7f//fDfcz//////////wP/fwEAAAAAgD/+z/737/7d//////////8H/v 8DAAAAAIA//s/+//d9/
///// //////D/7/DwAAAACAP//n/v///////////////w/8/x8AAAAAgD//5/z/3/////////////8f/P9/AAAAAIA// nP8////////////
////P /z/fwAAAACAP/5z/f///////////////z/4//8AAAAAgD/+f/z////////////+//8/+P//AAAAAIA//n/9//////// /////f//f/j/7w
AAAAC Af/x//f//////v/////H//3/4/z8AAAAAgH/4//n//////3/8///j//9/4P9/AAAAAIB/eAD+/v //////8P//5////+D// wAAAACAf3gA /
P7/// ///9H//8f////g//8AAAAAAH90APv8//////9H///P////gf//AAAAAAD/+P//8f//////D/z/j//// 4H//wAAAAAA//z///H //////x8IooP
///+D //8AAAAAAP78///N//////9/AAAA////g///GwAAAAD+4f//T/////7/TwD4wf///4f//y8AAAAA/sGD /wf2///n0QAABv7///+ H//9fAAAAAP z
RAeAD uv//DwAAgPn/////3///vQAAAAD80QD8A3j+/wgAAED+/////////7oDAAAA/PP//wcG/xgAAACA/wf4// /////0AwAAAPj3//8H +P8PAAAAwB8 A
+P/// ///6AcAAAD47///F/7/HwAAAAABAPD///////APAAAA+P///4P//ycAAAAAAADw///////gHwAAAPD //// H//8HAAAAAAAA4P// ////wG8AAADw/
///9 ///PwAAAAAAAOD//////4B/AAAA8P/////7/38AAAAAAADg//////8AnwEAAPD/////8P9/AAAAAAAAw P/// ///AP7/BwDw/////+D /IgAAAAAAAMD/
///// wD8/x8A8P/////gDxwAAAAAAADA//////8A/v8/APD///9/wAEHAAAAAAAAgP//////g P///wDw////Hw N zA AAAAAAAAID//////8D ///8A+P///z8I
AAAAA BwAAACA///////g////Afj///8/AAAAAAAEAAAAAP//////4P///wN8/ ///fw AAA AAAEAAAAAD//// //+D/ //8Hvv7///8BAAAAAA AAAAAA/v/////
A//// Hz/+////AQAAAAAAAAAAAP7/////gP////8v/P///wMAAAAAA P A/AAD +/ //// wD/////I/z//58 DAAAAAMD/fwAA/v////8A/v //A6D8//8fAA
AAAAD //38AAPz/////APz//89A/f//HyAAAADg// 8/A AD// /// / wD 4 // 9 /gPz//x+AAAAA8P/ /HwCA//////8A0P///4H+/// /4wIAAPD//wc A
gP/// ///AID8/z8D/f////8HAAPg//8AAPD///// / wAA / l8 BOP // / // /D8ABAP4PAAD4///// /8AAPQBAAD//////3/gAQAA AAAA5P////// A
AB4AA DA/v//////4QEAAAAAAOH//////wAAOIA7 7 / / // / / / / /8B AAAAA MDg//////8AAAzAAAD 8////////AwAAAAAY4P////// AAADMAAA+P// /
////wM AAAAABOD//////wCAAQjg+fj///////9/A AAA g AP g // ////8 AwAAD8B/5/////////z8AAPA A4P//////AMCAAAQA9v///// ////DfwAOAPD//
////wD AYAADAPD////////jA4D/AQDg//////8Aw CB AA HD x / /////// /QMAAAAA8P//////AIAAMIAF2 P////////0BAAAAAOD//////w AAAwxAAOD///////
//AAAA AADgf/D///8A AAMCGID///////// PQA A AA AAQ P8 A+P//AAAHAAL4// ///////w8AAAAAAAD/AwDg/wAAD oAB//////////8PAAAAAAAA8 x/6A8AAADhAwP/ /
7////// /BwAAAAAAAII f/v//AABgAMD/ fwD/// /// wcAAA AA AAAE+vj//wAAwATg//8A+P////8DAAAAAAAACPA7APgAAAAZwP//AfD/////AwAAAAAA AAjAPwD8AAAAIsD /
/wPg/// //wEAAAAAAA AI gB8A/gAAAM WA//8HIP /// /8AAAAAA AAA CAAcAP8AAICBgf//HxD+///3AAAAAAAAAAgAeMD/AACAAAf///8R/P//+wAAAAAAAAAIA OD//wAAYAAO/v//Dv
j/v3kAA AAAAAAACADA // 8AAGAAcPj//3DgPwF4 AAAAA AAAAA gAwM//AABgAIDx/4/B4R8AOAAAAAAAAAAIAMAfAAAAMAAA3v+DAAI/ADwAAAAAAAAACADwfwAAAD AAAPh/wAF4/gA8AAAAA
AAAAAgA +P8AAAA4AAD AAe AAAPgBHAAAAAAAAAAIAP7/AQAAGAAAAHgwAADRA5wAAAAAAAAACMD//wMAAAAAAADACAAAgAKcAAAAAAAAAAj8//8D";n=Marshal.load( b.unpack("m")[0]);e
="eval$ s=%w"<<39<< ($s *10);o="";j=-1;0.up to(104*200-1){|i|o<<((n[i]==1)?e[j+=1]:32);o<<((i%200==199)?10:"")};o.rstrip!;o[-6,6]=" "<<39<<".join";puts(o
)#b="BA hsKwIUBQA AAA AAgP8BwP8/AAAAAPg/APgB+P//A+AAAAAAAAD+B/D/AQAAwP//PwD4/////wHAAAAAAAAA/h/8HwAA8P///38A+APA//8BwAAAAAAAAPD//w EA+P//////AP4HHAD/B/A
AAAAAAA DA/z8AwP/ /// / //8Mf+AcA////AAAAAAAAgP8/APz/////////D/gBAP///wAAAAAAAAD//4P//////////wfgAID///8AAAAAAAAAf/7///////////8DwAD g////AAAAAAAAwB/A////
/////// /D8CB/f//AAAAA AAAAOAH/P///////////z/A//8BAAAAAAAAAADwgf////////////8/8P8HAAAAAAAAAAAA+OD//// //////////4D/HwAAAAAAAAAAAD74 //////////+///8D/F8AA
AAAAAAA AAAf/v//////// / ///7/B/D/AAAAAAAAAACAD//////////////8/x/g/wIAAAAAAAAAwIf/////////////8f8/wP8FAA AAAAAAAOCD////////////38P/f4D /DwAAAAAAAADgwf// ///
//////z+ P//8B/x8AAAAA A AAA8PH///////////x/Yv//A/4/AAAAAAAAAPjw////////z3f4/ /n+/wf8fwAAAAAAAAB8+P///// /rw/m+f/h//8P+H8AAAAAAAAAfP j///8/9y4jBv3/w///P
/D/AgAAA AAAAD78////Xxe DY8T+/4f//z/g/wUAAAAAAAA+/P///w+VlXTg+/+f////wP8LAAA AAAAAP/z///+PE7D2wf//P// //4D/HwAAAAAAAD/+////xzCw+ sP//3////+B/38AAAA
AAAA//t/ /v8s 45v/v// ///v//Af+/AAAAAACAP/7f//fDfcz//////////wP/fwEAA AAAgD/+z/737/7d//////// //8H/v8DAAAAAIA//s/+//d9/// /////////D/7/DwAAAA
CAP//n/v //// ////// /////w/8/x8AAAAAgD//5/z/3/////////////8f/P9/AAAA A IA//nP8////////////// //P/z/fwAAAACAP/5z/f////// /////////z/4//8AAAA
AgD/+f/ z /// // ///// //+//8/+P//AAAAAIA//n/9/////////////f//f/j/7wAAAA C Af/x//f//////v/////H //3/4/z8AAAAAgH/4//n//////3 /8///j//9/4P9/AAA
AAIB/eAD +/v//////8P//5////+D// wAAAACAf3gA/P7//////9H//8f////g//8AAAAAAH90APv8/ /////9H///P////gf/ /AAAAAAD/+P//8f//////D/z/j ////4H//wAAAAAA//
z///H/// ///x8IooP///+D//8AAAAAA P78///N//////9/AAAA////g///GwAAAAD+4f//T/////7/Tw D 4 w f// /4f//y8AAAAA/sGD/wf2///n0QA ABv7///+H//9fAAAA
APzRAeA Duv//DwAAgPn/////3///vQ AA AAD80QD8A3j+/wgAAED+/////////7oDAAAA/PP//wcG/xgAA ACA/wf4///////0AwAAAPj3//8 H+P8PAAAAwB8A+P//
// // 6AcAAAD4 7///F/7/HwAAAAABAPD//// / //APAAAA+P///4P//ycAAAAA AADw///////gHwAAAPD / ///H// 8HAAAAAAAA4P//////wG8AAADw/// /9///PwAAAAAAAOD/
//// / 4B/AAAA8 P/// //7/38AAAAAA AD g//////8AnwEAAPD/////8P 9/AA A AA AA AwP//////AP7/BwDw/////+D/IgAAAAAAA MD//////wD8/x8A8P
///// g DxwAAAA A AAD A//// / /8A /v8/APD///9/wAEHAAAAA AA AgP//////gP///wDw////HwNzAAAAAAAAAID////// 8D///8A+P///z8IAAA
A ABwA A ACA//// / // g////Afj ///8 /AAAAAAAEAAAAAP / / ////4P///wN8////fwAAAAAAEAAAAAD//////+D///8Hvv7///8BAAAAAAAAAAA
A /v/ /// /A////Hz /+////AQAAAAAAAAAAAP7// // /gP////8 v/ P///wMAAAAAA PA/AAD+/////wD/////I/z//58DAAAAAMD/fwAA/v////
8 A/v//A 6D8//8fA AAAAAD//38AAPz/////APz/ /89A/f//HyAAAADg/ /8/AAD/ /////wD4//9/gPz//x+AAAAA8P//HwCA//////8A0P///
4 H+//// 4wIAAPD// wcAgP//////AID8/z8D/f/ / //8HAAPg//8AAPD///// / wAA/l8BOP//////D8ABAP4PAAD4//////8AAPQBAAD//
////3/gA QAAAAAA5P//////AAB4AADA/v////// 4QEAAAAAAOH//////wAA O IA77/////////8BAAAAAMDg//////8AAAzAAAD8/////
///AwAAA AAY4P//////AAADMAAA+P///////wMA AAAABOD//////wCAAQjg+ fj///////9/AAAAgAPg//////8AwAAD8B/5////////
/z8AAP AA 4P//////AMCAAAQA9v/////////DfwA OAPD//////wDAYAADAPD////// //jA4D/AQDg//////8AwCBAAHDx/////////QMAAAAA
8P////// AIAAMIAF2P////////0BAAAAAOD//////wAAAw xAAOD/////////AAAAAA Dgf/D///8AAAMCGID/////////PQAAAAAAQP8A+P//A
AAHAA L4 /////////w8AAAAAAAD/AwDg/wAADoAB//// //////8PAAAAAAAA8x/ 6A8AAADhAwP//7///////BwAAAAAAAIIf/v//AABgA
MD/fwD//////wcAAAA AAAAE+vj//wAAwATg//8A+P////8DAAAAAAA ACPA7APgAAA A Z wP//AfD/////AwAAAAAAAAjAPwD8AAAAIsD//wPg//
///wEAAAAAAAAIgB8A/ gAAAMWA//8HIP////8AAAAAAAAACAAcAP8AA ICBgf// HxD +///3AAAAAAAAAAgAeMD/AACAAAf///8R/P//+wAAA
AAAAAAIAOD//wAAYAAO/v //Dvj/v3kAAAAAAAAACADA//8AAGAAcPj// 3Dg PwF 4AAAAAAAAAAgAwM//AABgAIDx/4/B4R8AOAAAAAAA
AAAIAMAfAAAAMAAA3v+DAAI/A DwAAAAAAAAACADwfwAAADAAAPh/wAF4/g A8 AA AAA AAAAAgA+P8AAAA4AADAAeAAAPgBHAAAAAAAAAAIAP
7/AQAAGAAAAHgwAADRA5wAAAAA AAAACMD//wMAAAAAAADACAAAgAKcAAAAAAA A AAj 8//8D";n=Marshal.load(b.unpack("m")[0]);e
="eval$s=%w"<<39<<($s*10);o= "";j=-1;0.upto(104*200-1){|i|o<<((n [ i]==1)?e[j+=1]:32);o<<((i%200==199)?10:"
")};o.rstrip!;o[-6,6]=""<<39< <".jo in";puts(o)#b="BAhsKwIUBQAAAAAA g P8BwP8/AAAAAPg/APgB+P//A+AAAAAAAAD+B/D/A
QAAwP//PwD4/////wHAAAAAAAAA/h/ 8HwAA 8 P///38A+APA//8BwAAAAAAAAPD//wEA+ P//////AP4HHAD/B/AAAAAAAADA/z8AwP//////
/8Mf+AcA////AAAAAAAAgP8/APz//// /////D /gBAP///wAAAAAAAAD//4P////////// wfgAID///8AAAAAAAAAf/7///////////8DwADg
////AAAAAAAAwB/A////////////D8CB/f//A A AAAAAAAOAH/P///////////z/A//8BAA AAAAAAAADw gf////////////8/8P8HAAAAAAAAAAAA+OD////
//////////4D/HwAAAAAAAAAAAD74///// / ////+///8D/F8AAAAAAAAAAAAf/ v// //////////7/B/D/A AAAAAAAAACAD//////////////8/x/g/wIAAAAA
AAAAwIf/////////////8f8/w P 8 FAAAAAAAAAOCD////////////38 P/f4D/DwAAAAAAAADgwf/// ////////z+P//8B/x8AAAAAAAAA8PH////////
///x/Yv//A/4/AAAAAAAAAPjw/ // / / ///z3f4//n+/wf8fwAAAAAAAAB8 + P//////rw/m+f/h//8P+H8AAA AAAAAAfPj///8/9y4jBv3/w///P/D/AgAAAAAAAD
78////XxeDY8T+/4f//z/g/wUAAA A AAAA+/P///w+VlXTg+/+f////wP 8 LAAAAAAAAP/z///+PE7D2wf// P////4D/HwAAAAAAAD/+////xzCw+sP//3////+B/
3 8AAAAAAAA//t//v8s45v/v///// v //Af+/AAAAAACAP/7f//fDfcz//////// //w P /fwEAAAAAgD/+z/737/7d// ////////8H/v8DAAAAAIA//s/+//d9///////////
/ D/7/DwAAAACAP//n/v// // / //////////w/8/x8AAAAAgD//5/z/3/////////// // 8f/P9/AAAAAIA//nP8/ ///////////////P/z/fwAAAACAP/5z/f///////////
////z/4//8AA A A AgD /+f/z////////////+//8/+P//AAAAAIA//n/9////// /// ////f//f/j/ 7wAAAACAf/x//f//////v/////H//3/4/z8AAAAAgH/4/
/ n//// //3/8///j//9/4P9/AAAAAIB/eAD+/v//////8P//5////+ D//w A AAACAf3gA/P7//////9H//8f////g//8AAAAAAH90AP
v8// // //9H///P////gf//AAAAAAD/+P//8f//////D/z/j////4H/ /wAA A AAA//z///H//////x8IooP///+D//8AAAAAAP78///N
/// /// 9/A AAA/ ///g///GwAAAAD+4f//T/////7/TwD4wf///4f//y8AAAAA/sGD/wf2///n0 QA ABv7///+H//9fAAAAAPzRAeADuv//DwAAgPn/////3/
// vQ AAAAD80QD8A3j+/wgAAED+/////////7oDAAAA/PP//wcG/xgAAACA/w f4 ///////0AwAAAPj3//8H+P8PAAAAwB8A+P//////6Ac
AA AD 47///F/7/HwAAAAABAPD///////APAAAA+P///4P//ycAAAAAAADw// / ////gHwAAAPD////H//8HAAAAAAAA4P//////wG8AAA
Dw / ///9 ///Pw AAAAAAAOD//////4B/AAAA8P/////7/38AAAAAAADg//////8AnwEAAPD/// //8 P9/AAAAAAAAwP//////AP7/BwDw/////+D/IgAAAAAA
AM D/ /////wD8/ x 8A8P/////gDxwAAAAAAADA//////8A/v8/APD///9/wAEHAAAAAAAAgP//////gP/// wDw/ ///HwNzAAAAAAAAAID//////8D///8A+P///z8IAAAA
AB w A AA CA///////g////Afj///8/AAAAAAAEAAAAAP//////4P///wN8////fwAAAAAA EAAAAAD// /// /+D///8Hvv7///8BAAAAAAAAAAAA/v/////A////Hz/+
// // AQ AAAAAAAAAAAP7/////gP////8v/P///wMAAAAAAPA/AAD+/////wD/ ////I /z//58DAAA AAMD/fwAA/v////8A/v//A6D8//8fAAAAAAD//38AAP
z/ / / //A P z//89A/f//HyAAAADg//8/AAD//////wD4//9/gPz//x+AAAAA8P/ /HwCA/// ///8A0P///4H+////4wIAAPD//wcAgP//////AID8/z8
D /f // / /8 HAAPg//8AAPD//////wAA/l8BOP//////D8ABAP4PAAD4////// 8AAPQBA AD//////3/gAQAAAAAA5P//////AAB4AADA/v//////
4Q EA A AAAAOH//////wAAOIA77/////////8BAAAAAMDg//////8AAAzAAAD8//// ////AwAAAA AY4P//////AAADMAAA+P///////w
MA A AA ABOD//////wCAAQjg+fj///////9/AAAAgAPg//////8AwAAD8B/5///// //// z 8AAPAA4P //////AMCAAAQA9v/////
/// / DfwAOAPD//////wDAYAADAPD////////jA4D/AQDg//////8AwCBAAHDx//////// /QMAAAAA8P //////AIAAM
IAF 2P ////////0BAAAAAOD//////wAAAwxAAOD/////////AAAAAADgf/D///8AAAMCGID/// // ////PQAAA A AAQP8A+ P/
/AA A HAAL4/////////w8AAAAAA AD/AwDg/wAADoAB//////////8PAAAAAAAA8x/6A8AAADh A wP//7/ //////BwAAAAAAAIIf/v//A
AB gAMD/fwD//////wcA AAAAAAAE+vj//wAAwATg//8A+P////8DAAAAAAAACPA 7 A PgAAA AZwP//AfD/////AwAAAAA
AA A jAPwD8AAAAIsD//wPg/ ////wEAAAAAAAAIgB8A/gAAAMWA//8HIP////8A A AAAAAA ACA AcAP8
A AI CBgf//HxD+///3AAAAA AAAAAgAeMD/AACAAAf///8R/P//+wAAAAAAAAA I AOD//wAA YAAO/v
/ / Dvj/v3kAAAAAAAAACADA //8AAGAAcPj//3DgPwF4AAAAAAAAAAgAwM// A ABgAID x/4/B4R
8 A OA AAAAAAAAAIAMAfAAAAMA A A3v+DAAI/ADwAAAAAAAAACADwfwAAADA A APh /wAF4/gA
8A AA AAAAAAAgA+P8AAAA4AADAA e AAAPgBHAAAAAAAAAAIAP7/AQAA GAAA A HgwA ADRA5wAAAA
A AAA ACMD//wMAAAAAAADACAAAgAKc A AAAAAAAAAj8//8D";n=Marsh al.lo a d(b.unpack("m")[0])
;e ="e val$s=%w"<<39<<($s*10); o=" ";j=-1;0.upto(104*2 00 -1){ | i|o<<((n[i]==1)?e[
j+ =1] :32);o<<((i%200==199) ?10 :"")};o.r s trip ! ;o[-6, 6]=""<<39<
<" .j oin";puts(o)#b=" BA hsK wIUBQAAA AAA g P8BwP8/
AA AAAP g/APgB+P//A+ A A AAAAAA D+B/ D /AQAAwP//Pw
D4 /////wHAAAAA AAA A/h/ 8HwAA8P ///3 8 A+APA//8BwAAA
AAA AAP D// wEA+P/ /// / /AP4HHAD/B/AAAAA
AA ADA/ z8 A w P/// /// / 8 Mf+AcA////AAAAAAAAgP
8/ A P z /// / / ////D/gBAP///wAAAA'.join
Zennのフォントですと行間の幅の関係で縦長に見えますね。
はじめに
「図月つくる[1]」というYouTuberをご存じでしょうか。私は存じ上げています。
その図月つくるさんが、ファンの方々が作成されたDIY作品を募集するイベント[2]を開催されました。
私はそれに無謀にもプログラミングをテーマに参加しました[3]。DIYとは。
本記事では、そのイベントへの提出物について解説をします。
概要
今回作成したのはQuineアート(Quine[4] + アスキーアート[5])です。
実装はこちらの記事を参考にしました。
下記にQuineアートの作成手順を示します。
- 元となるアスキーアートを作成する
- アスキーアートを圧縮テキストデータに変換する
- Quineアートジェネレータを実装する
- Quineアート生成
Quineアートの作成手順
本記事で取り扱うコードは全てRuby[6]で記述しています。
元となるアスキーアートを作成する
アスキーアートの元画像として、図月つくるさんのYouTubeアカウントのアイコンを参照しました。
なお、後の作業のためアスキーアートは#
と
の二値で作成します。
今回作成したアスキーアートは下記です。
########## ################ ########### ###### ####################### ###
########## ############# ######################## ###################################### ##
############ ########### ################################### ####### ################### ##
##################### ############################################# ########## ### ########### ####
################ #################################################### ####### ######## ########################
############### ################################################################## ###### ########################
################## #################################################################### ### #########################
####### ################################################################################# ## ###########################
####### ############################################################################## ### ## ######################
###### #################################################################################### ###################
##### ####################################################################################### ###############
##### ########################################################################################### ##############
##### ########################################################################### ################### ########### #
##### ############################################################################### ################## ############
##### ################################################################################ ################### ########### #
##### ################################################################################## ################## ########### #
##### ############################################################################## #### ################# #############
#### ################################################################################ #### ################## #############
##### #################################################################### ############# # ## ################## #############
##### ######################################################## ##### ### ############## ##### ################## #############
##### ################################################# # ##### ## #### ############## ####################### ############
##### ################################### ### #### ### # ## # ## # ################ ######################## ############ #
##### ################################### # ### # ## ### ## # ## ################## ####################### ############ #
##### ################################## # # # ## # # # # ### ##### ################## ######################### ############ #
###### ################################## ### # ## # ## ##### ######################## ######################## ##############
###### ################################## ## ## ## # # ####### ######################### ######################### ################
###### ############ ################ ### # ## ### ## ############### ########################### ######################## ############## #
####### ############ ############# ###### ### ##### ## #################################################################### ############### #
####### ########### ## ########## ######## ### ######## ### ##################################################################### #################
####### ########### ## ################## ##### ##### ############################################################################ ###################
####### ########### ### ########################################################################################################### ###################
####### ########### ### ################### ####################################################################################### #####################
####### ######### ### ############################################################################################################ #####################
####### ######### ### # ############################################################################################################ #####################
####### ############## ############################################################################## ############################# #####################
####### ############## # ############################################################################### ############################# ################# ###
######## ############# # #################################################### ########################## ########################### ###################
######## ############## #################################################### ######################## ########################## ##################
######## #### ####### ############################################### ####################### ########################### ###################
######## #### ###### ################################################ # ##################### ########################## ###################
####### # ### ## ##### ################################################# # #################### ########################### #################
######## ###################### ################################################ ################## ########################## #################
######## ####################### ################################################# # # # ### ########################### #################
####### ####################### ## ################################################# ########################## #################
## ## ######## ####################### # ######################## ################### # ###### ############################# #################
#### # ######## #### ############ ## ####################### #### # ## ## ################################## #################
##### # ####### # ### ##### # ### ##################### ## ########################################## ##################
# #### # ####### # ## ######## #### ############### # # ###############################################################
# ### ### ######## ####################### ## ######## ## ############ #############################################
# ###### ######## ####################### ################# ####### #############################################
# ###### ######### ###################### # #################### # ############################################
######## ############################### #################### # ############################################
######## ############################### ##################### ###########################################
###### ## ############################### ########################## ###########################################
######## ###################################### #################### ###########################################
##### ## #################################### ################### ##########################################
################## #################################### ########### # # ##########################################
################### #################################### ####### ### ##########################################
##################### ################################### ### ### #########################################
######################### ################################# ## ## ### #########################################
########################## ################################### # ### #########################################
############################ ################################### # ########################################
############################# ##### ############################### # ########################################
############################## ##### # ################################ #######################################
############################### ###### ################################ #######################################
##################################### # ################################ ########## #######################################
################################## # ########################### ### ################# #######################################
######################### # # ########################### ####################### ######################################
########################## ## # # ########################### # ######################### ########################################
############################ # ########################### # ######################### #########################################
# ########################### # ################################# ### # ####################### #########################################
# #################### ## # ######################################### ## ################### ############################################
############ # # ### ############################################ ### ########### #############################################
# ##### ############################################### #### # ###########################################
#### ## ################################################ #### # ###########################################
### ### ### #### ############################################################ ## ###########################################
## ## ######################################################## ## ###########################################
## ## ####################################################### # ###########################################
## # #### ##### ############################################################ ### ###########################################
## ## ######### # ################################################################### #### ###########################################
## # # ## ############################################################## ######### ### ############################################
## ## ## ###################################################### ##### ########## ###########################################
## # # ### # ##################################################### ######## ############################################
# ## ## # ## ################################################### ####### ###########################################
## ## # ########################################################### ########## ############################
## # ## ########################################################## #### # ######## #####################
### # ################################################################# ########## ###########
### ## #################################################################### ## ######### # ####### ##
### # ###################### ############################################## # ###### #######################
## ################# ########################################### # # ##### #####################
## # ################### ####################################### # ###### ### #####
# ## ################### ###################################### # ######## ######
# # #################### #################################### # ###### #######
# # ## #################### # ################################ # ### ########
## ## ###################### # ########################## #### # #### ##########
# ### ######################### # ######################## ##### # ###################
## ### ####################### ### ################### ## #### # ##################
## ### ##################### ### ######### # #### # ###### ##########
## ## ################ ## ### ######## ### # #######
## #### ############ # # ###### #### # ###########
## ############ ### #### ####### #### # #############
### ### ### ###### ### # ################
## #### ## # # #### ### # # ####################
## # # # ### # # ########################
後述の処理を実行することで#
の位置にソースコードが挿入されます。
作成するアスキーアートの制約として、各行の文字数を同じにし長方形にする必要があります。
そのため、各行の末尾に適宜
を挿入し文字数が等しくなるように調整してください。
アスキーアートを圧縮テキストデータに変換する
今回作成するQuineのコードは、アスキーアートのデータをソースコードに埋め込むことになりますので、最終的なコードの文字数よりもアスキーアートのデータサイズを小さくする必要があります。
そのため、下記のスクリプトで圧縮テキストデータに変換します。
str = STDIN.read
bits = str.split(/\n/).join().tr(" #", "01").reverse.to_i(2)
puts [Marshal.dump(bits)].pack("m").gsub("\n", "")
前述のアスキーアートを変換した結果は下記の通りです。
BAhsKwIUBQAAAAAAgP8BwP8/AAAAAPg/APgB+P//A+AAAAAAAAD+B/D/AQAAwP//PwD4/////wHAAAAAAAAA/h/8HwAA8P///38A+APA//8BwAAAAAAAAPD//wEA+P//////AP4HHAD/B/AAAAAAAADA/z8AwP///////8Mf+AcA////AAAAAAAAgP8/APz/////////D/gBAP///wAAAAAAAAD//4P//////////wfgAID///8AAAAAAAAAf/7///////////8DwADg////AAAAAAAAwB/A////////////D8CB/f//AAAAAAAAAOAH/P///////////z/A//8BAAAAAAAAAADwgf////////////8/8P8HAAAAAAAAAAAA+OD//////////////4D/HwAAAAAAAAAAAD74//////////+///8D/F8AAAAAAAAAAAAf/v////////////7/B/D/AAAAAAAAAACAD//////////////8/x/g/wIAAAAAAAAAwIf/////////////8f8/wP8FAAAAAAAAAOCD////////////38P/f4D/DwAAAAAAAADgwf///////////z+P//8B/x8AAAAAAAAA8PH///////////x/Yv//A/4/AAAAAAAAAPjw////////z3f4//n+/wf8fwAAAAAAAAB8+P//////rw/m+f/h//8P+H8AAAAAAAAAfPj///8/9y4jBv3/w///P/D/AgAAAAAAAD78////XxeDY8T+/4f//z/g/wUAAAAAAAA+/P///w+VlXTg+/+f////wP8LAAAAAAAAP/z///+PE7D2wf//P////4D/HwAAAAAAAD/+////xzCw+sP//3////+B/38AAAAAAAA//t//v8s45v/v/////v//Af+/AAAAAACAP/7f//fDfcz//////////wP/fwEAAAAAgD/+z/737/7d//////////8H/v8DAAAAAIA//s/+//d9////////////D/7/DwAAAACAP//n/v///////////////w/8/x8AAAAAgD//5/z/3/////////////8f/P9/AAAAAIA//nP8////////////////P/z/fwAAAACAP/5z/f///////////////z/4//8AAAAAgD/+f/z////////////+//8/+P//AAAAAIA//n/9/////////////f//f/j/7wAAAACAf/x//f//////v/////H//3/4/z8AAAAAgH/4//n//////3/8///j//9/4P9/AAAAAIB/eAD+/v//////8P//5////+D//wAAAACAf3gA/P7//////9H//8f////g//8AAAAAAH90APv8//////9H///P////gf//AAAAAAD/+P//8f//////D/z/j////4H//wAAAAAA//z///H//////x8IooP///+D//8AAAAAAP78///N//////9/AAAA////g///GwAAAAD+4f//T/////7/TwD4wf///4f//y8AAAAA/sGD/wf2///n0QAABv7///+H//9fAAAAAPzRAeADuv//DwAAgPn/////3///vQAAAAD80QD8A3j+/wgAAED+/////////7oDAAAA/PP//wcG/xgAAACA/wf4///////0AwAAAPj3//8H+P8PAAAAwB8A+P//////6AcAAAD47///F/7/HwAAAAABAPD///////APAAAA+P///4P//ycAAAAAAADw///////gHwAAAPD////H//8HAAAAAAAA4P//////wG8AAADw////9///PwAAAAAAAOD//////4B/AAAA8P/////7/38AAAAAAADg//////8AnwEAAPD/////8P9/AAAAAAAAwP//////AP7/BwDw/////+D/IgAAAAAAAMD//////wD8/x8A8P/////gDxwAAAAAAADA//////8A/v8/APD///9/wAEHAAAAAAAAgP//////gP///wDw////HwNzAAAAAAAAAID//////8D///8A+P///z8IAAAAABwAAACA///////g////Afj///8/AAAAAAAEAAAAAP//////4P///wN8////fwAAAAAAEAAAAAD//////+D///8Hvv7///8BAAAAAAAAAAAA/v/////A////Hz/+////AQAAAAAAAAAAAP7/////gP////8v/P///wMAAAAAAPA/AAD+/////wD/////I/z//58DAAAAAMD/fwAA/v////8A/v//A6D8//8fAAAAAAD//38AAPz/////APz//89A/f//HyAAAADg//8/AAD//////wD4//9/gPz//x+AAAAA8P//HwCA//////8A0P///4H+////4wIAAPD//wcAgP//////AID8/z8D/f////8HAAPg//8AAPD//////wAA/l8BOP//////D8ABAP4PAAD4//////8AAPQBAAD//////3/gAQAAAAAA5P//////AAB4AADA/v//////4QEAAAAAAOH//////wAAOIA77/////////8BAAAAAMDg//////8AAAzAAAD8////////AwAAAAAY4P//////AAADMAAA+P///////wMAAAAABOD//////wCAAQjg+fj///////9/AAAAgAPg//////8AwAAD8B/5/////////z8AAPAA4P//////AMCAAAQA9v/////////DfwAOAPD//////wDAYAADAPD////////jA4D/AQDg//////8AwCBAAHDx/////////QMAAAAA8P//////AIAAMIAF2P////////0BAAAAAOD//////wAAAwxAAOD/////////AAAAAADgf/D///8AAAMCGID/////////PQAAAAAAQP8A+P//AAAHAAL4/////////w8AAAAAAAD/AwDg/wAADoAB//////////8PAAAAAAAA8x/6A8AAADhAwP//7///////BwAAAAAAAIIf/v//AABgAMD/fwD//////wcAAAAAAAAE+vj//wAAwATg//8A+P////8DAAAAAAAACPA7APgAAAAZwP//AfD/////AwAAAAAAAAjAPwD8AAAAIsD//wPg/////wEAAAAAAAAIgB8A/gAAAMWA//8HIP////8AAAAAAAAACAAcAP8AAICBgf//HxD+///3AAAAAAAAAAgAeMD/AACAAAf///8R/P//+wAAAAAAAAAIAOD//wAAYAAO/v//Dvj/v3kAAAAAAAAACADA//8AAGAAcPj//3DgPwF4AAAAAAAAAAgAwM//AABgAIDx/4/B4R8AOAAAAAAAAAAIAMAfAAAAMAAA3v+DAAI/ADwAAAAAAAAACADwfwAAADAAAPh/wAF4/gA8AAAAAAAAAAgA+P8AAAA4AADAAeAAAPgBHAAAAAAAAAAIAP7/AQAAGAAAAHgwAADRA5wAAAAAAAAACMD//wMAAAAAAADACAAAgAKcAAAAAAAAAAj8//8D
Quineアートジェネレータを実装する
前述の変換後アスキーアートデータを用いて、Quineアートを生成するジェネレータを実装します。
eval$s=%w'b="BAhsKwIUBQAAAAAAgP8BwP8/AAAAAPg/APgB+P//A+AAAAAAAAD+B/D/AQAAwP//PwD4/////wHAAAAAAAAA/h/8HwAA8P///38A+APA//8BwAAAAAAAAPD//wEA+P//////AP4HHAD/B/AAAAAAAADA/z8AwP///////8Mf+AcA////AAAAAAAAgP8/APz/////////D/gBAP///wAAAAAAAAD//4P//////////wfgAID///8AAAAAAAAAf/7///////////8DwADg////AAAAAAAAwB/A////////////D8CB/f//AAAAAAAAAOAH/P///////////z/A//8BAAAAAAAAAADwgf////////////8/8P8HAAAAAAAAAAAA+OD//////////////4D/HwAAAAAAAAAAAD74//////////+///8D/F8AAAAAAAAAAAAf/v////////////7/B/D/AAAAAAAAAACAD//////////////8/x/g/wIAAAAAAAAAwIf/////////////8f8/wP8FAAAAAAAAAOCD////////////38P/f4D/DwAAAAAAAADgwf///////////z+P//8B/x8AAAAAAAAA8PH///////////x/Yv//A/4/AAAAAAAAAPjw////////z3f4//n+/wf8fwAAAAAAAAB8+P//////rw/m+f/h//8P+H8AAAAAAAAAfPj///8/9y4jBv3/w///P/D/AgAAAAAAAD78////XxeDY8T+/4f//z/g/wUAAAAAAAA+/P///w+VlXTg+/+f////wP8LAAAAAAAAP/z///+PE7D2wf//P////4D/HwAAAAAAAD/+////xzCw+sP//3////+B/38AAAAAAAA//t//v8s45v/v/////v//Af+/AAAAAACAP/7f//fDfcz//////////wP/fwEAAAAAgD/+z/737/7d//////////8H/v8DAAAAAIA//s/+//d9////////////D/7/DwAAAACAP//n/v///////////////w/8/x8AAAAAgD//5/z/3/////////////8f/P9/AAAAAIA//nP8////////////////P/z/fwAAAACAP/5z/f///////////////z/4//8AAAAAgD/+f/z////////////+//8/+P//AAAAAIA//n/9/////////////f//f/j/7wAAAACAf/x//f//////v/////H//3/4/z8AAAAAgH/4//n//////3/8///j//9/4P9/AAAAAIB/eAD+/v//////8P//5////+D//wAAAACAf3gA/P7//////9H//8f////g//8AAAAAAH90APv8//////9H///P////gf//AAAAAAD/+P//8f//////D/z/j////4H//wAAAAAA//z///H//////x8IooP///+D//8AAAAAAP78///N//////9/AAAA////g///GwAAAAD+4f//T/////7/TwD4wf///4f//y8AAAAA/sGD/wf2///n0QAABv7///+H//9fAAAAAPzRAeADuv//DwAAgPn/////3///vQAAAAD80QD8A3j+/wgAAED+/////////7oDAAAA/PP//wcG/xgAAACA/wf4///////0AwAAAPj3//8H+P8PAAAAwB8A+P//////6AcAAAD47///F/7/HwAAAAABAPD///////APAAAA+P///4P//ycAAAAAAADw///////gHwAAAPD////H//8HAAAAAAAA4P//////wG8AAADw////9///PwAAAAAAAOD//////4B/AAAA8P/////7/38AAAAAAADg//////8AnwEAAPD/////8P9/AAAAAAAAwP//////AP7/BwDw/////+D/IgAAAAAAAMD//////wD8/x8A8P/////gDxwAAAAAAADA//////8A/v8/APD///9/wAEHAAAAAAAAgP//////gP///wDw////HwNzAAAAAAAAAID//////8D///8A+P///z8IAAAAABwAAACA///////g////Afj///8/AAAAAAAEAAAAAP//////4P///wN8////fwAAAAAAEAAAAAD//////+D///8Hvv7///8BAAAAAAAAAAAA/v/////A////Hz/+////AQAAAAAAAAAAAP7/////gP////8v/P///wMAAAAAAPA/AAD+/////wD/////I/z//58DAAAAAMD/fwAA/v////8A/v//A6D8//8fAAAAAAD//38AAPz/////APz//89A/f//HyAAAADg//8/AAD//////wD4//9/gPz//x+AAAAA8P//HwCA//////8A0P///4H+////4wIAAPD//wcAgP//////AID8/z8D/f////8HAAPg//8AAPD//////wAA/l8BOP//////D8ABAP4PAAD4//////8AAPQBAAD//////3/gAQAAAAAA5P//////AAB4AADA/v//////4QEAAAAAAOH//////wAAOIA77/////////8BAAAAAMDg//////8AAAzAAAD8////////AwAAAAAY4P//////AAADMAAA+P///////wMAAAAABOD//////wCAAQjg+fj///////9/AAAAgAPg//////8AwAAD8B/5/////////z8AAPAA4P//////AMCAAAQA9v/////////DfwAOAPD//////wDAYAADAPD////////jA4D/AQDg//////8AwCBAAHDx/////////QMAAAAA8P//////AIAAMIAF2P////////0BAAAAAOD//////wAAAwxAAOD/////////AAAAAADgf/D///8AAAMCGID/////////PQAAAAAAQP8A+P//AAAHAAL4/////////w8AAAAAAAD/AwDg/wAADoAB//////////8PAAAAAAAA8x/6A8AAADhAwP//7///////BwAAAAAAAIIf/v//AABgAMD/fwD//////wcAAAAAAAAE+vj//wAAwATg//8A+P////8DAAAAAAAACPA7APgAAAAZwP//AfD/////AwAAAAAAAAjAPwD8AAAAIsD//wPg/////wEAAAAAAAAIgB8A/gAAAMWA//8HIP////8AAAAAAAAACAAcAP8AAICBgf//HxD+///3AAAAAAAAAAgAeMD/AACAAAf///8R/P//+wAAAAAAAAAIAOD//wAAYAAO/v//Dvj/v3kAAAAAAAAACADA//8AAGAAcPj//3DgPwF4AAAAAAAAAAgAwM//AABgAIDx/4/B4R8AOAAAAAAAAAAIAMAfAAAAMAAA3v+DAAI/ADwAAAAAAAAACADwfwAAADAAAPh/wAF4/gA8AAAAAAAAAAgA+P8AAAA4AADAAeAAAPgBHAAAAAAAAAAIAP7/AQAAGAAAAHgwAADRA5wAAAAAAAAACMD//wMAAAAAAADACAAAgAKcAAAAAAAAAAj8//8D";n=Marshal.load(b.unpack("m")[0]);e="eval$s=%w"<<39<<($s*10);o="";j=-1;0.upto(104*200-1){|i|o<<((n[i]==1)?e[j+=1]:32);o<<((i%200==199)?10:"")};o.rstrip!;o[-6,6]=""<<39<<".join";puts(o)#'.join
このコードは実行コードをテキストデータとして持ち、eval
関数でそれを実行しています。
実行コード部分を抜き出し、簡易的なコードフォーマットとコメントの付与をしたもの(後から付与したコメントはあえてRubyの構文とは異なる//
で始めるようにしています)が下記のコードとなります。
$s = <<'EOS'
// アスキーアートの変換後文字列
b = "BAhsKwIUBQAAAAAAgP8BwP8/AAAAAPg/APgB+P//A+AAAAAAAAD+B/D/AQAAwP//PwD4/////wHAAAAAAAAA/h/8HwAA8P///38A+APA//8BwAAAAAAAAPD//wEA+P//////AP4HHAD/B/AAAAAAAADA/z8AwP///////8Mf+AcA////AAAAAAAAgP8/APz/////////D/gBAP///wAAAAAAAAD//4P//////////wfgAID///8AAAAAAAAAf/7///////////8DwADg////AAAAAAAAwB/A////////////D8CB/f//AAAAAAAAAOAH/P///////////z/A//8BAAAAAAAAAADwgf////////////8/8P8HAAAAAAAAAAAA+OD//////////////4D/HwAAAAAAAAAAAD74//////////+///8D/F8AAAAAAAAAAAAf/v////////////7/B/D/AAAAAAAAAACAD//////////////8/x/g/wIAAAAAAAAAwIf/////////////8f8/wP8FAAAAAAAAAOCD////////////38P/f4D/DwAAAAAAAADgwf///////////z+P//8B/x8AAAAAAAAA8PH///////////x/Yv//A/4/AAAAAAAAAPjw////////z3f4//n+/wf8fwAAAAAAAAB8+P//////rw/m+f/h//8P+H8AAAAAAAAAfPj///8/9y4jBv3/w///P/D/AgAAAAAAAD78////XxeDY8T+/4f//z/g/wUAAAAAAAA+/P///w+VlXTg+/+f////wP8LAAAAAAAAP/z///+PE7D2wf//P////4D/HwAAAAAAAD/+////xzCw+sP//3////+B/38AAAAAAAA//t//v8s45v/v/////v//Af+/AAAAAACAP/7f//fDfcz//////////wP/fwEAAAAAgD/+z/737/7d//////////8H/v8DAAAAAIA//s/+//d9////////////D/7/DwAAAACAP//n/v///////////////w/8/x8AAAAAgD//5/z/3/////////////8f/P9/AAAAAIA//nP8////////////////P/z/fwAAAACAP/5z/f///////////////z/4//8AAAAAgD/+f/z////////////+//8/+P//AAAAAIA//n/9/////////////f//f/j/7wAAAACAf/x//f//////v/////H//3/4/z8AAAAAgH/4//n//////3/8///j//9/4P9/AAAAAIB/eAD+/v//////8P//5////+D//wAAAACAf3gA/P7//////9H//8f////g//8AAAAAAH90APv8//////9H///P////gf//AAAAAAD/+P//8f//////D/z/j////4H//wAAAAAA//z///H//////x8IooP///+D//8AAAAAAP78///N//////9/AAAA////g///GwAAAAD+4f//T/////7/TwD4wf///4f//y8AAAAA/sGD/wf2///n0QAABv7///+H//9fAAAAAPzRAeADuv//DwAAgPn/////3///vQAAAAD80QD8A3j+/wgAAED+/////////7oDAAAA/PP//wcG/xgAAACA/wf4///////0AwAAAPj3//8H+P8PAAAAwB8A+P//////6AcAAAD47///F/7/HwAAAAABAPD///////APAAAA+P///4P//ycAAAAAAADw///////gHwAAAPD////H//8HAAAAAAAA4P//////wG8AAADw////9///PwAAAAAAAOD//////4B/AAAA8P/////7/38AAAAAAADg//////8AnwEAAPD/////8P9/AAAAAAAAwP//////AP7/BwDw/////+D/IgAAAAAAAMD//////wD8/x8A8P/////gDxwAAAAAAADA//////8A/v8/APD///9/wAEHAAAAAAAAgP//////gP///wDw////HwNzAAAAAAAAAID//////8D///8A+P///z8IAAAAABwAAACA///////g////Afj///8/AAAAAAAEAAAAAP//////4P///wN8////fwAAAAAAEAAAAAD//////+D///8Hvv7///8BAAAAAAAAAAAA/v/////A////Hz/+////AQAAAAAAAAAAAP7/////gP////8v/P///wMAAAAAAPA/AAD+/////wD/////I/z//58DAAAAAMD/fwAA/v////8A/v//A6D8//8fAAAAAAD//38AAPz/////APz//89A/f//HyAAAADg//8/AAD//////wD4//9/gPz//x+AAAAA8P//HwCA//////8A0P///4H+////4wIAAPD//wcAgP//////AID8/z8D/f////8HAAPg//8AAPD//////wAA/l8BOP//////D8ABAP4PAAD4//////8AAPQBAAD//////3/gAQAAAAAA5P//////AAB4AADA/v//////4QEAAAAAAOH//////wAAOIA77/////////8BAAAAAMDg//////8AAAzAAAD8////////AwAAAAAY4P//////AAADMAAA+P///////wMAAAAABOD//////wCAAQjg+fj///////9/AAAAgAPg//////8AwAAD8B/5/////////z8AAPAA4P//////AMCAAAQA9v/////////DfwAOAPD//////wDAYAADAPD////////jA4D/AQDg//////8AwCBAAHDx/////////QMAAAAA8P//////AIAAMIAF2P////////0BAAAAAOD//////wAAAwxAAOD/////////AAAAAADgf/D///8AAAMCGID/////////PQAAAAAAQP8A+P//AAAHAAL4/////////w8AAAAAAAD/AwDg/wAADoAB//////////8PAAAAAAAA8x/6A8AAADhAwP//7///////BwAAAAAAAIIf/v//AABgAMD/fwD//////wcAAAAAAAAE+vj//wAAwATg//8A+P////8DAAAAAAAACPA7APgAAAAZwP//AfD/////AwAAAAAAAAjAPwD8AAAAIsD//wPg/////wEAAAAAAAAIgB8A/gAAAMWA//8HIP////8AAAAAAAAACAAcAP8AAICBgf//HxD+///3AAAAAAAAAAgAeMD/AACAAAf///8R/P//+wAAAAAAAAAIAOD//wAAYAAO/v//Dvj/v3kAAAAAAAAACADA//8AAGAAcPj//3DgPwF4AAAAAAAAAAgAwM//AABgAIDx/4/B4R8AOAAAAAAAAAAIAMAfAAAAMAAA3v+DAAI/ADwAAAAAAAAACADwfwAAADAAAPh/wAF4/gA8AAAAAAAAAAgA+P8AAAA4AADAAeAAAPgBHAAAAAAAAAAIAP7/AQAAGAAAAHgwAADRA5wAAAAAAAAACMD//wMAAAAAAADACAAAgAKcAAAAAAAAAAj8//8D"
// アスキーアート文字列を元の01列に戻す
n = Marshal.load(b.unpack("m")[0])
// 先頭のお作法とソースコード文字列を複数回繰り返したものを連結した文字列を用意
e = "eval$s=%w" << 39 << ($s * 10)
// 出力文字列とカウンタを初期化
o = ""
j = -1
// アスキーアートのサイズ分繰り返す(今回使用したアスキーアートは縦104文字、横200文字)
0.upto(104 * 200 - 1) { |i|
// アスキーアートの`#`(1)に相当する位置にソースコード文字列を、` `(0)に相当する位置に` `を挿入
o << ((n[i] == 1) ? e[j += 1] : 32)
// 改行が必要な位置なら挿入する
o << ((i % 200 == 199) ? 10 : "")
}
// 末尾の空白を取り除き、末尾のお作法を挿入する
o.rstrip!
o[-6,6] = "" << 39 << ".join"
// 生成した出力文字列を標準出力へ出力する
puts(o)
// 2週目以降のコードを無効化するためのコメント開始文字
#
EOS
ソースコード文字列を複数回繰り返すのはアスキーアード描画に必要な文字数を確保するためです。
また、ソースコードの最後の文字をコメント開始文字の#
にすることで2週目以降は全てコメントアウトされるようにし、動作に影響を与えないようにします。
本手法ではソースコードのトークンが
で分断される可能性があります。
この対策として、%w
を用いることで空白文字を区切り文字とした文字列の配列の定義として扱い、これをjoin
で結合することで
なしの文字列に変換します。
Quineアート生成
前述のジェネレータを実行することで、目的のQuineアートを生成することができます(記事冒頭のソースコードと同じです)
eval$s=%w' b="BAhsKwIUBQAAA AAAgP8BwP8/ AAAAAP g/APgB+P//A+AAAAAAAAD+B /D/
AQAAwP//Pw D4/////wHAAAA AAAAA/h/8HwAA8P///38A+AP A//8BwAAAAAAAAPD//wEA+P//////AP4HHAD/B /A
AAAAAAADA/z8 AwP///////8 Mf+AcA////AAAAAAAAgP8/APz/////////D /gBAP// /wAAAAAAAAD//4P//// //
////wfgAID///8AAAAAAA AAf/7///////////8DwADg////AAAAAAAAwB/A/////// /////D8CB/ f// AAAAAAAAAOA H/P/
//////////z/A//8 BAAAAAAAAAADwgf////////////8/8P8HAAAAAAAAAAAA+OD//// /////// ///4D/Hw AAAAAAAAAAAD74//////////
+///8D/F8AAAAAA AAAAAAf/v////////////7/B/D/AAAAAAAAAACAD//////////////8/x/g/wIAAAA AAAAAw If/////////////8f8/wP8FA
AAAAAAAAOCD/////// /////38P/f4D/DwAAAAAAAADgwf///////////z+P//8B/x8AAAAAAAAA8PH//////// /// x/Yv//A/4/AAAAAAAAAPjw///
/////z3 f4//n+/wf8fwAAAAAAAAB8+P//////rw/m+f/h//8P+H8AAAAAAAAAfPj///8/9y4jBv3/w///P/D/AgA AA AAAAD78////XxeDY8T+/4f//z/g
/wUAAAA AAAA+/P///w+VlXTg+/+f////wP8LAAAAAAAAP/z///+PE7D2wf//P////4D/HwAAAAAAAD/+////x zCw +s P//3////+B/38AAAAAAAA/
/t//v8 s45v/v/////v//Af+/AAAAAACAP/7f//fDfcz//////////wP/fwEAAAAAgD/+z/737/7d//////////8H/v 8DAAAAAIA//s/+//d9/
///// //////D/7/DwAAAACAP//n/v///////////////w/8/x8AAAAAgD//5/z/3/////////////8f/P9/AAAAAIA// nP8////////////
////P /z/fwAAAACAP/5z/f///////////////z/4//8AAAAAgD/+f/z////////////+//8/+P//AAAAAIA//n/9//////// /////f//f/j/7w
AAAAC Af/x//f//////v/////H//3/4/z8AAAAAgH/4//n//////3/8///j//9/4P9/AAAAAIB/eAD+/v //////8P//5////+D// wAAAACAf3gA /
P7/// ///9H//8f////g//8AAAAAAH90APv8//////9H///P////gf//AAAAAAD/+P//8f//////D/z/j//// 4H//wAAAAAA//z///H //////x8IooP
///+D //8AAAAAAP78///N//////9/AAAA////g///GwAAAAD+4f//T/////7/TwD4wf///4f//y8AAAAA/sGD /wf2///n0QAABv7///+ H//9fAAAAAP z
RAeAD uv//DwAAgPn/////3///vQAAAAD80QD8A3j+/wgAAED+/////////7oDAAAA/PP//wcG/xgAAACA/wf4// /////0AwAAAPj3//8H +P8PAAAAwB8 A
+P/// ///6AcAAAD47///F/7/HwAAAAABAPD///////APAAAA+P///4P//ycAAAAAAADw///////gHwAAAPD //// H//8HAAAAAAAA4P// ////wG8AAADw/
///9 ///PwAAAAAAAOD//////4B/AAAA8P/////7/38AAAAAAADg//////8AnwEAAPD/////8P9/AAAAAAAAw P/// ///AP7/BwDw/////+D /IgAAAAAAAMD/
///// wD8/x8A8P/////gDxwAAAAAAADA//////8A/v8/APD///9/wAEHAAAAAAAAgP//////g P///wDw////Hw N zA AAAAAAAAID//////8D ///8A+P///z8I
AAAAA BwAAACA///////g////Afj///8/AAAAAAAEAAAAAP//////4P///wN8/ ///fw AAA AAAEAAAAAD//// //+D/ //8Hvv7///8BAAAAAA AAAAAA/v/////
A//// Hz/+////AQAAAAAAAAAAAP7/////gP////8v/P///wMAAAAAA P A/AAD +/ //// wD/////I/z//58 DAAAAAMD/fwAA/v////8A/v //A6D8//8fAA
AAAAD //38AAPz/////APz//89A/f//HyAAAADg// 8/A AD// /// / wD 4 // 9 /gPz//x+AAAAA8P/ /HwCA//////8A0P///4H+/// /4wIAAPD//wc A
gP/// ///AID8/z8D/f////8HAAPg//8AAPD///// / wAA / l8 BOP // / // /D8ABAP4PAAD4///// /8AAPQBAAD//////3/gAQAA AAAA5P////// A
AB4AA DA/v//////4QEAAAAAAOH//////wAAOIA7 7 / / // / / / / /8B AAAAA MDg//////8AAAzAAAD 8////////AwAAAAAY4P////// AAADMAAA+P// /
////wM AAAAABOD//////wCAAQjg+fj///////9/A AAA g AP g // ////8 AwAAD8B/5/////////z8AAPA A4P//////AMCAAAQA9v///// ////DfwAOAPD//
////wD AYAADAPD////////jA4D/AQDg//////8Aw CB AA HD x / /////// /QMAAAAA8P//////AIAAMIAF2 P////////0BAAAAAOD//////w AAAwxAAOD///////
//AAAA AADgf/D///8A AAMCGID///////// PQA A AA AAQ P8 A+P//AAAHAAL4// ///////w8AAAAAAAD/AwDg/wAAD oAB//////////8PAAAAAAAA8 x/6A8AAADhAwP/ /
7////// /BwAAAAAAAII f/v//AABgAMD/ fwD/// /// wcAAA AA AAAE+vj//wAAwATg//8A+P////8DAAAAAAAACPA7APgAAAAZwP//AfD/////AwAAAAAA AAjAPwD8AAAAIsD /
/wPg/// //wEAAAAAAA AI gB8A/gAAAM WA//8HIP /// /8AAAAAA AAA CAAcAP8AAICBgf//HxD+///3AAAAAAAAAAgAeMD/AACAAAf///8R/P//+wAAAAAAAAAIA OD//wAAYAAO/v//Dv
j/v3kAA AAAAAAACADA // 8AAGAAcPj//3DgPwF4 AAAAA AAAAA gAwM//AABgAIDx/4/B4R8AOAAAAAAAAAAIAMAfAAAAMAAA3v+DAAI/ADwAAAAAAAAACADwfwAAAD AAAPh/wAF4/gA8AAAAA
AAAAAgA +P8AAAA4AAD AAe AAAPgBHAAAAAAAAAAIAP7/AQAAGAAAAHgwAADRA5wAAAAAAAAACMD//wMAAAAAAADACAAAgAKcAAAAAAAAAAj8//8D";n=Marshal.load( b.unpack("m")[0]);e
="eval$ s=%w"<<39<< ($s *10);o="";j=-1;0.up to(104*200-1){|i|o<<((n[i]==1)?e[j+=1]:32);o<<((i%200==199)?10:"")};o.rstrip!;o[-6,6]=" "<<39<<".join";puts(o
)#b="BA hsKwIUBQA AAA AAgP8BwP8/AAAAAPg/APgB+P//A+AAAAAAAAD+B/D/AQAAwP//PwD4/////wHAAAAAAAAA/h/8HwAA8P///38A+APA//8BwAAAAAAAAPD//w EA+P//////AP4HHAD/B/A
AAAAAAA DA/z8AwP/ /// / //8Mf+AcA////AAAAAAAAgP8/APz/////////D/gBAP///wAAAAAAAAD//4P//////////wfgAID///8AAAAAAAAAf/7///////////8DwAD g////AAAAAAAAwB/A////
/////// /D8CB/f//AAAAA AAAAOAH/P///////////z/A//8BAAAAAAAAAADwgf////////////8/8P8HAAAAAAAAAAAA+OD//// //////////4D/HwAAAAAAAAAAAD74 //////////+///8D/F8AA
AAAAAAA AAAf/v//////// / ///7/B/D/AAAAAAAAAACAD//////////////8/x/g/wIAAAAAAAAAwIf/////////////8f8/wP8FAA AAAAAAAOCD////////////38P/f4D /DwAAAAAAAADgwf// ///
//////z+ P//8B/x8AAAAA A AAA8PH///////////x/Yv//A/4/AAAAAAAAAPjw////////z3f4/ /n+/wf8fwAAAAAAAAB8+P///// /rw/m+f/h//8P+H8AAAAAAAAAfP j///8/9y4jBv3/w///P
/D/AgAAA AAAAD78////Xxe DY8T+/4f//z/g/wUAAAAAAAA+/P///w+VlXTg+/+f////wP8LAAA AAAAAP/z///+PE7D2wf//P// //4D/HwAAAAAAAD/+////xzCw+ sP//3////+B/38AAAA
AAAA//t/ /v8s 45v/v// ///v//Af+/AAAAAACAP/7f//fDfcz//////////wP/fwEAA AAAgD/+z/737/7d//////// //8H/v8DAAAAAIA//s/+//d9/// /////////D/7/DwAAAA
CAP//n/v //// ////// /////w/8/x8AAAAAgD//5/z/3/////////////8f/P9/AAAA A IA//nP8////////////// //P/z/fwAAAACAP/5z/f////// /////////z/4//8AAAA
AgD/+f/ z /// // ///// //+//8/+P//AAAAAIA//n/9/////////////f//f/j/7wAAAA C Af/x//f//////v/////H //3/4/z8AAAAAgH/4//n//////3 /8///j//9/4P9/AAA
AAIB/eAD +/v//////8P//5////+D// wAAAACAf3gA/P7//////9H//8f////g//8AAAAAAH90APv8/ /////9H///P////gf/ /AAAAAAD/+P//8f//////D/z/j ////4H//wAAAAAA//
z///H/// ///x8IooP///+D//8AAAAAA P78///N//////9/AAAA////g///GwAAAAD+4f//T/////7/Tw D 4 w f// /4f//y8AAAAA/sGD/wf2///n0QA ABv7///+H//9fAAAA
APzRAeA Duv//DwAAgPn/////3///vQ AA AAD80QD8A3j+/wgAAED+/////////7oDAAAA/PP//wcG/xgAA ACA/wf4///////0AwAAAPj3//8 H+P8PAAAAwB8A+P//
// // 6AcAAAD4 7///F/7/HwAAAAABAPD//// / //APAAAA+P///4P//ycAAAAA AADw///////gHwAAAPD / ///H// 8HAAAAAAAA4P//////wG8AAADw/// /9///PwAAAAAAAOD/
//// / 4B/AAAA8 P/// //7/38AAAAAA AD g//////8AnwEAAPD/////8P 9/AA A AA AA AwP//////AP7/BwDw/////+D/IgAAAAAAA MD//////wD8/x8A8P
///// g DxwAAAA A AAD A//// / /8A /v8/APD///9/wAEHAAAAA AA AgP//////gP///wDw////HwNzAAAAAAAAAID////// 8D///8A+P///z8IAAA
A ABwA A ACA//// / // g////Afj ///8 /AAAAAAAEAAAAAP / / ////4P///wN8////fwAAAAAAEAAAAAD//////+D///8Hvv7///8BAAAAAAAAAAA
A /v/ /// /A////Hz /+////AQAAAAAAAAAAAP7// // /gP////8 v/ P///wMAAAAAA PA/AAD+/////wD/////I/z//58DAAAAAMD/fwAA/v////
8 A/v//A 6D8//8fA AAAAAD//38AAPz/////APz/ /89A/f//HyAAAADg/ /8/AAD/ /////wD4//9/gPz//x+AAAAA8P//HwCA//////8A0P///
4 H+//// 4wIAAPD// wcAgP//////AID8/z8D/f/ / //8HAAPg//8AAPD///// / wAA/l8BOP//////D8ABAP4PAAD4//////8AAPQBAAD//
////3/gA QAAAAAA5P//////AAB4AADA/v////// 4QEAAAAAAOH//////wAA O IA77/////////8BAAAAAMDg//////8AAAzAAAD8/////
///AwAAA AAY4P//////AAADMAAA+P///////wMA AAAABOD//////wCAAQjg+ fj///////9/AAAAgAPg//////8AwAAD8B/5////////
/z8AAP AA 4P//////AMCAAAQA9v/////////DfwA OAPD//////wDAYAADAPD////// //jA4D/AQDg//////8AwCBAAHDx/////////QMAAAAA
8P////// AIAAMIAF2P////////0BAAAAAOD//////wAAAw xAAOD/////////AAAAAA Dgf/D///8AAAMCGID/////////PQAAAAAAQP8A+P//A
AAHAA L4 /////////w8AAAAAAAD/AwDg/wAADoAB//// //////8PAAAAAAAA8x/ 6A8AAADhAwP//7///////BwAAAAAAAIIf/v//AABgA
MD/fwD//////wcAAAA AAAAE+vj//wAAwATg//8A+P////8DAAAAAAA ACPA7APgAAA A Z wP//AfD/////AwAAAAAAAAjAPwD8AAAAIsD//wPg//
///wEAAAAAAAAIgB8A/ gAAAMWA//8HIP////8AAAAAAAAACAAcAP8AA ICBgf// HxD +///3AAAAAAAAAAgAeMD/AACAAAf///8R/P//+wAAA
AAAAAAIAOD//wAAYAAO/v //Dvj/v3kAAAAAAAAACADA//8AAGAAcPj// 3Dg PwF 4AAAAAAAAAAgAwM//AABgAIDx/4/B4R8AOAAAAAAA
AAAIAMAfAAAAMAAA3v+DAAI/A DwAAAAAAAAACADwfwAAADAAAPh/wAF4/g A8 AA AAA AAAAAgA+P8AAAA4AADAAeAAAPgBHAAAAAAAAAAIAP
7/AQAAGAAAAHgwAADRA5wAAAAA AAAACMD//wMAAAAAAADACAAAgAKcAAAAAAA A AAj 8//8D";n=Marshal.load(b.unpack("m")[0]);e
="eval$s=%w"<<39<<($s*10);o= "";j=-1;0.upto(104*200-1){|i|o<<((n [ i]==1)?e[j+=1]:32);o<<((i%200==199)?10:"
")};o.rstrip!;o[-6,6]=""<<39< <".jo in";puts(o)#b="BAhsKwIUBQAAAAAA g P8BwP8/AAAAAPg/APgB+P//A+AAAAAAAAD+B/D/A
QAAwP//PwD4/////wHAAAAAAAAA/h/ 8HwAA 8 P///38A+APA//8BwAAAAAAAAPD//wEA+ P//////AP4HHAD/B/AAAAAAAADA/z8AwP//////
/8Mf+AcA////AAAAAAAAgP8/APz//// /////D /gBAP///wAAAAAAAAD//4P////////// wfgAID///8AAAAAAAAAf/7///////////8DwADg
////AAAAAAAAwB/A////////////D8CB/f//A A AAAAAAAOAH/P///////////z/A//8BAA AAAAAAAADw gf////////////8/8P8HAAAAAAAAAAAA+OD////
//////////4D/HwAAAAAAAAAAAD74///// / ////+///8D/F8AAAAAAAAAAAAf/ v// //////////7/B/D/A AAAAAAAAACAD//////////////8/x/g/wIAAAAA
AAAAwIf/////////////8f8/w P 8 FAAAAAAAAAOCD////////////38 P/f4D/DwAAAAAAAADgwf/// ////////z+P//8B/x8AAAAAAAAA8PH////////
///x/Yv//A/4/AAAAAAAAAPjw/ // / / ///z3f4//n+/wf8fwAAAAAAAAB8 + P//////rw/m+f/h//8P+H8AAA AAAAAAfPj///8/9y4jBv3/w///P/D/AgAAAAAAAD
78////XxeDY8T+/4f//z/g/wUAAA A AAAA+/P///w+VlXTg+/+f////wP 8 LAAAAAAAAP/z///+PE7D2wf// P////4D/HwAAAAAAAD/+////xzCw+sP//3////+B/
3 8AAAAAAAA//t//v8s45v/v///// v //Af+/AAAAAACAP/7f//fDfcz//////// //w P /fwEAAAAAgD/+z/737/7d// ////////8H/v8DAAAAAIA//s/+//d9///////////
/ D/7/DwAAAACAP//n/v// // / //////////w/8/x8AAAAAgD//5/z/3/////////// // 8f/P9/AAAAAIA//nP8/ ///////////////P/z/fwAAAACAP/5z/f///////////
////z/4//8AA A A AgD /+f/z////////////+//8/+P//AAAAAIA//n/9////// /// ////f//f/j/ 7wAAAACAf/x//f//////v/////H//3/4/z8AAAAAgH/4/
/ n//// //3/8///j//9/4P9/AAAAAIB/eAD+/v//////8P//5////+ D//w A AAACAf3gA/P7//////9H//8f////g//8AAAAAAH90AP
v8// // //9H///P////gf//AAAAAAD/+P//8f//////D/z/j////4H/ /wAA A AAA//z///H//////x8IooP///+D//8AAAAAAP78///N
/// /// 9/A AAA/ ///g///GwAAAAD+4f//T/////7/TwD4wf///4f//y8AAAAA/sGD/wf2///n0 QA ABv7///+H//9fAAAAAPzRAeADuv//DwAAgPn/////3/
// vQ AAAAD80QD8A3j+/wgAAED+/////////7oDAAAA/PP//wcG/xgAAACA/w f4 ///////0AwAAAPj3//8H+P8PAAAAwB8A+P//////6Ac
AA AD 47///F/7/HwAAAAABAPD///////APAAAA+P///4P//ycAAAAAAADw// / ////gHwAAAPD////H//8HAAAAAAAA4P//////wG8AAA
Dw / ///9 ///Pw AAAAAAAOD//////4B/AAAA8P/////7/38AAAAAAADg//////8AnwEAAPD/// //8 P9/AAAAAAAAwP//////AP7/BwDw/////+D/IgAAAAAA
AM D/ /////wD8/ x 8A8P/////gDxwAAAAAAADA//////8A/v8/APD///9/wAEHAAAAAAAAgP//////gP/// wDw/ ///HwNzAAAAAAAAAID//////8D///8A+P///z8IAAAA
AB w A AA CA///////g////Afj///8/AAAAAAAEAAAAAP//////4P///wN8////fwAAAAAA EAAAAAD// /// /+D///8Hvv7///8BAAAAAAAAAAAA/v/////A////Hz/+
// // AQ AAAAAAAAAAAP7/////gP////8v/P///wMAAAAAAPA/AAD+/////wD/ ////I /z//58DAAA AAMD/fwAA/v////8A/v//A6D8//8fAAAAAAD//38AAP
z/ / / //A P z//89A/f//HyAAAADg//8/AAD//////wD4//9/gPz//x+AAAAA8P/ /HwCA/// ///8A0P///4H+////4wIAAPD//wcAgP//////AID8/z8
D /f // / /8 HAAPg//8AAPD//////wAA/l8BOP//////D8ABAP4PAAD4////// 8AAPQBA AD//////3/gAQAAAAAA5P//////AAB4AADA/v//////
4Q EA A AAAAOH//////wAAOIA77/////////8BAAAAAMDg//////8AAAzAAAD8//// ////AwAAAA AY4P//////AAADMAAA+P///////w
MA A AA ABOD//////wCAAQjg+fj///////9/AAAAgAPg//////8AwAAD8B/5///// //// z 8AAPAA4P //////AMCAAAQA9v/////
/// / DfwAOAPD//////wDAYAADAPD////////jA4D/AQDg//////8AwCBAAHDx//////// /QMAAAAA8P //////AIAAM
IAF 2P ////////0BAAAAAOD//////wAAAwxAAOD/////////AAAAAADgf/D///8AAAMCGID/// // ////PQAAA A AAQP8A+ P/
/AA A HAAL4/////////w8AAAAAA AD/AwDg/wAADoAB//////////8PAAAAAAAA8x/6A8AAADh A wP//7/ //////BwAAAAAAAIIf/v//A
AB gAMD/fwD//////wcA AAAAAAAE+vj//wAAwATg//8A+P////8DAAAAAAAACPA 7 A PgAAA AZwP//AfD/////AwAAAAA
AA A jAPwD8AAAAIsD//wPg/ ////wEAAAAAAAAIgB8A/gAAAMWA//8HIP////8A A AAAAAA ACA AcAP8
A AI CBgf//HxD+///3AAAAA AAAAAgAeMD/AACAAAf///8R/P//+wAAAAAAAAA I AOD//wAA YAAO/v
/ / Dvj/v3kAAAAAAAAACADA //8AAGAAcPj//3DgPwF4AAAAAAAAAAgAwM// A ABgAID x/4/B4R
8 A OA AAAAAAAAAIAMAfAAAAMA A A3v+DAAI/ADwAAAAAAAAACADwfwAAADA A APh /wAF4/gA
8A AA AAAAAAAgA+P8AAAA4AADAA e AAAPgBHAAAAAAAAAAIAP7/AQAA GAAA A HgwA ADRA5wAAAA
A AAA ACMD//wMAAAAAAADACAAAgAKc A AAAAAAAAAj8//8D";n=Marsh al.lo a d(b.unpack("m")[0])
;e ="e val$s=%w"<<39<<($s*10); o=" ";j=-1;0.upto(104*2 00 -1){ | i|o<<((n[i]==1)?e[
j+ =1] :32);o<<((i%200==199) ?10 :"")};o.r s trip ! ;o[-6, 6]=""<<39<
<" .j oin";puts(o)#b=" BA hsK wIUBQAAA AAA g P8BwP8/
AA AAAP g/APgB+P//A+ A A AAAAAA D+B/ D /AQAAwP//Pw
D4 /////wHAAAAA AAA A/h/ 8HwAA8P ///3 8 A+APA//8BwAAA
AAA AAP D// wEA+P/ /// / /AP4HHAD/B/AAAAA
AA ADA/ z8 A w P/// /// / 8 Mf+AcA////AAAAAAAAgP
8/ A P z /// / / ////D/gBAP///wAAAA'.join
結論
本記事ではQuineアートの生成方法について解説を行いました。
本記事の手法を応用することで、任意のアスキーアートを用いたQuineアートを作成することができます。
Quineアートに興味のある方はぜひ挑戦してみてください。
謝辞
本記事を作成するに当たり、下記の方々が作成された情報を参照いたしました(敬称略)
謹んで御礼を申し上げます。
- 図月つくる, ライヴラリ所属, 株式会社ゆにクリエイト
本記事を作成するに当たり、下記の言語について取り扱いました。
謹んで御礼を申し上げます。
- Ruby, Rubyコミュニティ
Discussion