2023年 年賀状

更新: 2023-01-01 カウンタ: アクセスカウンター



動作させた様子

使い方



仕組み 仕組み
コードは大きく3つのパートに分かれています。
赤い部分はお正月の歌を再生するコードです。内部で8bit/サンプリングレート8000の波形を生成しています。
青い部分はAAのデータファイルと再生コードです。gzip圧縮後Base64エンコードしてあります。
緑の部分はQuineとしてプログラム自身を出力するコードです。



    $s="if(STDOUT.isatty);m=Thread.new{d=%[6868ada8868a66331116688a0aa8
    666688aad06868adaa88a8682222222211242211111111211221111211111182222
    4221124].split(//).map{|a|a.to_i(14)};t=d.map{|t|t==0?1:(185*2**(t/
    12.0))};f=652;w=[];>                           <51.times{|i|w+=(0..
    .f*4*d[-i-1]-f).map> █▀▀▀▀▀█  █  █▄█ █ █▀▀▀▀▀█ <{|n|Math.sin(3.14*n
    *t[i]/4000)}+(0...f> █ ███ █ ▄██▀▀▄▀██ █ ███ █ <).map{0}};w.map!{|v
    |(128+90*v).round};> █ ▀▀▀ █ ▀▄▄▀█   █ █ ▀▀▀ █ <open(%[/dev/dsp],%[
    wb]){|f|f.print(w.p> ▀▀▀▀▀▀▀ ▀ █▄▀ █▄█ ▀▀▀▀▀▀▀ <ack(%[C*]))}};print
    (%(\e[0;0H\e[2J));r> ▀█▄  ▀▀█ █▄█▀▀▀▄   ▄██▄▄  <equire(%(zlib));s=[
    Zlib::Inflate.infla> ▄▄▀█▀ ▀▀ ▄▀▄ ▀ █▀▄█▀██ ▀█ <te(%(eNqNkrENAzEIRX
    tPcV26eALWSIXEIuyQh> ▄█ ▄  ▀█▄█ ▄█ ▄██▄▀█   ▄▀ <djpVojvAAsrhoQKW/+B
    4bu1Iw8+RagUAMDQFJI> █ █ ▄█▀▄▄▀▀▄▄ ██ ▀██▀█▄▀█ <Od7CfyeOZQqe8FRqJAv
    MGyn4reCB8BW7IUH4kZ> ▀  ▀  ▀ ▄▄▄▄ █▀ █▀▀▀█ ▀   <JVklvER+oZFfY+pLLuW
    gp4koD4OXXST7HvqOTZ> █▀▀▀▀▀█ █ ▀▀ ▀█ █ ▀ █  ▄▀ <F7HtdL3IIx6BW2KoQaa
    ecgZcvjmfHH22CxtpgQ> █ ███ █   █▄▀▀█▀█▀█▀▀ ▀█▄ <ZhFnSFMwS1xV9SSf8Tx
    Q6iNnPm/0ZoDaW37MI8> █ ▀▀▀ █ ▄ ▀ ▀▀▄▀█▀▄▄▄▀▀ █ <4RPmQdYqBt/YBTrTJig
    ==).unpack(%(m))[0]> ▀▀▀▀▀▀▀ ▀   ▀   ▀▀▀  ▀  ▀ <)];s.push(s[0].gsub
    (/=/,%(_)));c=0;loo>        2023@kat0h         <p{%(KK);print(%(\e[
    0;0H),s[(c+=1)%2]);puts(%(  )*12+%(Happy New Year 2023 !!!));sleep(
    0.5);if(!m.status);break;end};print(%(\e[0;0H\e[2J))end;puts(%($s=)
    +$s.inspect.gsub(92.chr+110.chr,10.chr)+%(;eval$s.gsub(/>.{27}</,%(
    )).gsub(10.chr,%())));";eval$s.gsub(/>.{27}</,%()).gsub(10.chr,%())