터미널에 Matrix가 내려오는 Hack

1. 터미널에 눈을 내리는 스크립트라는 것이 있다고 합니다.



ruby -e 'C=`stty size`.scan(/\d+/)[1].to_i;S=["2743".to_i(16)].pack("U*");a={};puts "\033[2J";loop{a[rand(C)]=0;a.each{|x,o|;a[x]+=1;print "\033[#{o};#{x}H \033[#{a[x]};#{x}H#{S} \033[0;0H"};$stdout.flush;sleep 0.1}'

2. 실행하면 이렇게 된다





※ 재료 원은 여기에 코멘트란인 것 같습니다

3. 루비 부분을 꺼내 읽기 쉽고 리팩터 해 보았습니다.



루비
width = `stty size`.split(' ').last.to_i
positions = {}
puts "\033[2J" # clear screen
loop do
  positions[rand(width)] = 0
  positions.each { |column, row|
    print "\033[#{row};#{column}H " # erase snow
    positions[column] += 1
    print "\033[#{positions[column]};#{column}H❃" # draw snow
  }
  sleep 0.1
end

4. 에서, 개조하고 싶어졌습니다



루비
width = `stty size`.split(' ').last.to_i
positions = {}
print "\033[40m\033[32m" # black and green
puts "\033[2J" # clear screen
loop do
  positions[rand(width)] = 0
  positions.each { |column, row|
    positions[column] += 1
    print "\033[#{positions[column]};#{column}H#{[*' '..'z', *'ヲ'..'ン'].sample}"
  }
  sleep 0.1
end

5. 원라인으로 되돌리자



ruby -e 'w=`stty size`.split(" ").last.to_i;p={};print"\033[40m\033[32m\033[2J";loop{;p[rand(w)]=0;p.each{|c,r|;p[c]+=1;s=[*" ".."z",*"ヲ".."ン"].sample;print"\033[#{p[c]};#{c}H#{s}";};sleep 0.1}'

6. 실행하면 이렇게 됩니다.





7. 정리



타이틀은 일부러 어색해 보았습니다. 낚시입니다 😐

8. 덤



눈을 다중 스크롤화해 보았습니다. 터미널을 전체 화면으로 만든 다음 실행해보십시오

ruby -e 'puts "\033[2J";Y,X=`stty size`.split(" ").map(&:to_i);z={"."=>1,"*"=>2,"❃"=>3};a=[];loop{a<<[rand(X),0,z.keys.sample];a.map{|b|;print "\033[#{b[1]};#{b[0]}H ";b[0]+=rand(3)-1;b[1]+=z[b[2]];print "\033[#{b[1]};#{b[0]}H#{b[2]}";b};a.reject!{|b|b[1]>Y};$stdout.flush;sleep 0.1}'

실행하면 이렇게



코드는 이렇게

루비
height, width = `stty size`.split(' ').map(&:to_i)
z = { '.' => 1, '*' => 2, '❃' => 3 }
positions = []
puts "\033[2J" # clear screen
loop do
  positions << { x: rand(width), y: 0, z: z.keys.sample, i: 0 }
  positions.map { |position|
    print "\033[#{position[:y]};#{position[:x]}H " # erase snow
    position[:x] += rand(3) - 1
    position[:y] += z[position[:z]]
    print "\033[#{position[:y]};#{position[:x]}H#{position[:z]}" # draw snow
    position
  }
  positions.reject! { |snow| snow[:y] > height }
  sleep 0.1
end

좋은 웹페이지 즐겨찾기