Lý lịch
Mùa hè đã kết thúc ở Bắc bán cầu và rất nhiều người trong chúng ta nhớ mặt trời, bãi biển, sóng biển ... Thử thách này nhằm mục đích cổ vũ họ bằng cách nhắc nhở họ về biển.
Các thách thức
Đây là biển:
** ** ** ** **
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
** ****** ****** ****** ****** ****
Biển được làm bằng 5 lần mô hình sóng này:
**
****
*****
** **
** **
* *****
Lưu ý rằng mẫu dài 16 ký tự và biển gấp 5 lần mẫu này = 80 ký tự.
Mà bạn có thể in vào một thiết bị đầu cuối bằng dòng lệnh này:
perl -e 'print " ** \n **** \n ***** \n ** ** \n ** ** \n* *****\n"'
Hoặc cái này:
perl -e 'print " "x12, "*"x2, " "x2, "\n", " "x8, "*"x4, " "x4, "\n", " "x5, "*"x5, " "x6, "\n", " "x3, "*"x2, " "x3, "*"x2, " "x6, "\n", " "x1, "*"x2, " "x6, "*"x2, " "x5, "\n", "*"x1, " "x10, "*"x5, "\n"'
(Cái thứ hai sẽ giúp bạn dễ dàng lấy được mẫu chính xác hơn)
Nhiệm vụ của bạn là hiển thị biển trong một thiết bị đầu cuối và trông giống như những con sóng đang di chuyển về phía bên phải: nó cần dịch chuyển sang phải với tốc độ 1 ký tự mỗi 100ms (= 10 lần mỗi giây). Không được in ký tự sau cột thứ 80, nhưng khi sóng ngoài cùng bên phải biến mất, một ký tự mới xuất hiện ở bên trái.
Dưới đây là một ví dụ về đầu ra:
thời gian = 0,0s
** ** ** ** **
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
** ****** ****** ****** ****** ****
thời gian = 0,1s
** ** ** ** **
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
*** ****** ****** ****** ****** ***
thời gian = 0,2s
* ** ** ** ** *
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
**** ****** ****** ****** ****** **
thời gian = 0,3 giây
** ** ** ** **
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
***** ****** ****** ****** ****** *
thời gian = 0,4 giây
** ** ** ** **
* **** **** **** **** ***
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
****** ****** ****** ****** ******
Tất nhiên, mỗi đầu ra nên thay thế trước đó.
Bạn có thể chạy mã này vào một thiết bị đầu cuối unix để xem nó sẽ trông như thế nào với hình ảnh động:
perl -M5.010 -MTime::HiRes=sleep -E '@arr=([($")x12,($n="*")x2,($")x3],[($")x8,($n)x4,($")x4],[($")x5,($n)x5,($")x6],[($")x3,($n)x2,($")x3,($n)x2,($")x6],[($")x1,($n)x2,($")x6,($n)x2,($")x5],[($n)x1,($")x10,($n)x5]);while(++$j){for$i(0..5){for$k(0..15) {$out[$i][16*$_+$k]=$arr[$i][($k-$j)%16]for 0..4}}say"\e[H",$/,join$/,map{join"",@$_}@out;sleep 0.1}'
(Lưu ý rằng mã này không được chơi tốt lắm: Tôi chỉ làm cho nó đủ nhỏ gọn để thuận tiện để chạy trong một thiết bị đầu cuối.)
Tiêu chí chiến thắng
Đây là codegolf, vì vậy mã ngắn nhất trong byte thắng.