0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

nervの模様のコードを作ったよ!

Last updated at Posted at 2022-07-04

TL;DR

quine作った!
ちなみにこのコードは動きます、試してみてね!

                           eval(
                      (%w(1.upto
                    (18)do|i|s=i
           ;if      (i==1);s="A  DAM"elsi
             f(     i==2);s="LILITH"elsif(i
               ==3);s="SACHIEL"elsif(i==4);s=
                 "SHAMSHEL"elsif(i==5);s="RAMIE
                  L"elsif(i==6);s="GAGHIEL"els
      if(i    == 7);s="ISRAFIL"elsif(i==8);
       s="SA  N  DAL  PHON"elsif(i==9);
       s ="MATA  RAEL"elsif(i==10);s="SA
       H   AQUI  EL"   e  lsif(i==11);s="
       I     RE  UL"e   ls  if(i==12);s="L
  EL             IEL"elsif(i==13);s="BARDI
  EL"            els   if(i==14 );s="ZERUEL
                 "els if(   i==15 );s="ARAE
    L"           elsif(i=     =16); s="ALMIS
     AE          L"e   lsif     (i=   =17);
       s         ="TA   BLIS           "els
       e;s                               ="
          LI                         LIN
              "                  e nd
                 ; pu t   s (s)en
                    d)*"" ))

なぜ作ったか

https://amzn.to/3adgnaF の本を読んで、自分でも作れるかなと思い、ちょうどハマっていたエヴァのnervマークがピッタリだとビビっときたので本書の演習を真似て作ってみた。

仕組み

quineという実行すると自身のソースコードを出力するプログラムを書いたものです。

art = <<END
                           #####
                      ##########
                    ############
           ###      ###########  ########
             ##     #######################
               ##############################
                 ##############################
                  ############################
      ####    ## ##########################
       #####  #  ###  #################
       # ######  #######################
       #   ####  ###   #  ###############
       #     ##  ####   ##  ##############
  ##             #########################
  ###            ###   ######## ###########
                 #### ###   ##### #########
    ##           ########     ##### ########
     ##          ###   ####     ###   #####
       #         ####   ####           ####
       ###                               ##
          ##                         ###
              #                  # ##
                 # ## #   # #####
                    ##### ##
END

main = <<END
eval((%w(
  1.upto(18) do |i|
    s = i;
    if (i == 1);
      s = "ADAM"
    elsif (i == 2);
      s = "LILITH"
    elsif (i == 3);
      s = "SACHIEL"
    elsif (i == 4);
      s = "SHAMSHEL"
    elsif (i == 5);
      s = "RAMIEL"
    elsif (i == 6);
      s = "GAGHIEL"
    elsif (i == 7);
      s = "ISRAFIL"
    elsif (i == 8);
      s = "SANDALPHON"
    elsif (i == 9);
      s = "MATARAEL"
    elsif (i == 10);
      s = "SAHAQUIEL"
    elsif (i == 11);
      s = "IREUL"
    elsif (i == 12);
      s = "LELIEL"
    elsif (i == 13);
      s = "BARDIEL"
    elsif (i == 14);
      s = "ZERUEL"
    elsif (i == 15);
      s = "ARAEL"
    elsif (i == 16);
      s = "ALMISAEL"
    elsif (i == 17);
      s = "TABLIS"
    else;
      s = "LILIN"
    end;
    puts(s)
  end
  )*""))
END

main = main.split.join

main = art.gsub("#") { main.slice!(0, 1) }

puts main

画像をビットマップに変換するライブラリ(名前をど忘れした)を使って変換した後に、文字列を#に置換して、その部分に動作するコード(文字数を合わせる必要があったような...1年位前に作ったので覚えていませんが)を置換していきます。

このquineを生成するコードを実行すると冒頭のアレができるというわけです。もっとくわしく知りたかったら著者の遠藤さんの解説ページがあるので見てみてください。

すごいquineたち

n=0;eval$S=%w!d="2-,<'%*+D-)+4?>F*(>,%'&<9M&(%-9)%},;'+'E}
,'-BB+(1+9,JJS.;z,33&/&)HH,,&dys%3}5,),(+@@&*&5&}2%&6(*81(
(&,&m-4477%+=*0)0,'*$,0}++$)&-/.+*$}&.&E%$($$$*$'}#}|%$%|,
$-$+0<}|+?)'lQ(Rr%XWD&l>`4.&;k5;d6qU-L;J8-*qjU1x11.&^1.B7/
?L.7/6/%98}1r//?L[4[;S8C?,/~d.dz~A(AAmzAm.+-,ED}ND5;+DI}%Q
%>RR**c)S+HL5(<</4(&G<<d}5+I@=AV%Py/+%~-/T-/*wi,v/R(1I==j+
V~c'18(&A%8P/s=@[)N}1s1~x/*J  *@)Lh18&;vL,'r.^W/h'>k'X<)'g
_l.^ER3W<)8h<)3F,l_b.b8+U*XU  )l;/=2'^K~(:2(:2,*}+2()F,*}+
Kw+Kw+Kw+2                                      ,*F%#DN-})
Z*/,(R^*^Q5<5%,1;)/7(&yN+#&G  *O@*#OOO#h3W.j);~#U6U6j);]3?
?YYHL?3r[Chz&2+/2+j%z22.K.%,  p2WK9kKx2:(2T(2}L(.B#&Q^rG^*
i'/-#1.-'#/61x/x                          ~11%;ZCC5&9]9S*~
#h*aJZLNC4[CZM3G  (_GyGGG+3)  `4F&9E4ZMO  @oOo3?)&1C(b*I1^
%/71<S*'49&?Wupn  u&;W4>;W'?  )'l.v}8g(Y  YY>)1b%,9R(1YYY;
?i/R+/+qTIT&A&'3                          Z~MOoWu`4ErP1'I1
x14[/61I'i'/%3<M  W#6/+',9+1  ':H87.EC?,  1_q@*1G.:8+%W2Wm
#ND&l>`CC]&1#3-3  -[gN//71.1  8'F>#[4]3#  n5)ET8P..7/YHE~y
/f.f}N,8b8@''IrU                          J9L#6/6/+<L#6/+2
/+-)L+-.b._//5Z%[(nQ&>3,.C      &'7/6*%G(6:V2*~1D'>)1)M2'~
/-1r5?R(#1I1Ic9?+4(&b%&Q  *8  //  8h*&PN+&f1/-'8h'8#h*JZ;[
C8Hi1*P6-2G{*PDs5)i'c,  ?:~'  c,&>  *WP.d.69Q?Q.^E4r&1(WP#
.:+)k%::2:(KQ5Lma)Z+  49_;6*  @9;*@9  ;*3_&T.P2::%:dAA4&?p
aJ;Za;ZaJo3l&T~&y5  ;#TIT5;T  &',&>]>?  YL?39`C3Zp*#aJW<p*
#aJW#<n4[43pFe    7tete7t3^M  )Q>)/5+}H.    -',):<)R*Q&T;`
u)'GX../HF    'gLlsR1P8+%;?1  ~%/h*#/6RA#I:I    :gcQ.+Xsv}
sX+'v}+1%:N#:8d..F,&1E'R'(Q/  T&A-QQ%Q+Q*%:-*2'(wQ%(-%XP{i
A1i1)Fz&1~%&A,M+4X&b%&IE1..1E*&PN+&f&1-[C?`CC4F,8*.U*ATwG%
wGn5?*%.,_>K.K);#K6j);#K6K);K15;'43(?,19Q,*R_+X&{Ng>`4ZMOo
@o8[A8:.x/i)F1Fv&f%N(E-*.qc~1s#/6.-95f&1-[41H8/?<*3^b/11%=
2'DD%1DDUDw%,(}82}>+~2*A2*A2  j+,5*AcA'};6*%);*%.*%/,>/Mk2
#.K1-K^22GKX*KD*2A-)L+-/i'c}  W}#+N9?8:}/}+#6P673<&>%&y&^%
n-k51{6+m+#GU#6U6,&>/~#+N+;S  ],`C4F&9ECZMO@oO@o]?F7tR%.}Q
p_1E*9SE[Z                                      ~F7t8*9S=J
3FFeB7teB7t]3FFe7R,FX%&IE1..1E*n6%fs='8//8'3?,KT*2AN)p4;Zu
L./?L./?L(._/>3,::1-*-'K-+A-K:-K_?)*;)/5+}.B5>'B/1-5>+%P2+
PkF+qPq5>*gA%V+Ac%                      ,/>])`#CCF>#CCM,[C
&G<?~#I:#I:(<?#I:I  +)Z:8:L?]z/->)T.-A  .m+.m+~.d59+T'd-cR
//)M%.1H+'8,F(/B1H  /E'>k'b+'v}+X#k~AA  (AA}5AA(Agd9k+V%)L
2+#I:P-X+T(-+};+z'  (&PN+L).'bm**:G(RA  (.d./<L#6/q/%9L~q/
%9L%JE'H)&;3n?,19Q  ,*R_+X&{Ng>`4Lp4>9  (/G5SG(/G8*9S=J'&2
(.61(O%PyP#fT-fT-f                      *Dc))f+R*2*x%jA#UG
U.>5'_.^]?&9~#V'#V'V'5&9~#V'  #V'5&9]eB5?K-:{%:+g:+RP65?I~
:+':%;?j*.B7M)/1b+==(/PL,AN4  MFet]9`Cu,1;X,*^'G.:&KnD&lF~
MOoWu`u2}+,12}v%<X:D  {)%5A-  %X<)    %D,QR)*j+-+<5U::,Rm;
5)Q1%6(A";88.times{|  i|d=i=  =31?d.gs  ub(?~){$'[0,3]}.gs
ub(?#){$'[0,2]}:d.  gsub(""<  <123-i,d[0  ,z=i/82+2])[z..-
1]};i=j=-k=b=1;d  .bytes{|c|  d=b+=b+k^=c&  1};c=33.chr;n=
($*[0]?n-1:n    +1)%30;n==25  &&ENV["NO_TGW"  ]&&n=($*[0]?
n-1:n+1)%30;0.upto(n%30)      {k=(c*58<<10)*m=b%4*23+30;b/
=4;9.step(m,23){|m|i+=v=b%2;760.times{|p|k[p%38+(p/38+m)*5
9-226]=""<<d[249+(v<1?b/2%64:i)*380+p/2]+32};b>>=7-v*6}};p
uts((c*58<<10<<k<<c*54).gsub(c){"n=#{n};eval$S=%w#{c+$S[0,
2680]*9}"[j+=1]}+c+"*''")#d="2-,<'%*+D-)+4?>F*(>,%'&<9M&(%
-9)%},;'+'E},'-BB+(1+9,JJS.;z,33&/&)HH,,&dys%3}5,),(+@@&*&
5&}2%&6(*81((&,&m-4477%+=*0)0,'*$,0}++$)&-/.+*$}&.&E%$!*''

最後に

最後まで読んでくれてありがとうございます!
quineに少しでも興味を持っていただけたら嬉しいです。

参考にした文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?