Oldukça küçültülmüş Steampunk romanı The Difference Engine'de , sinema evlerinin eşdeğeri, mekanik olarak çevrilebilen karolar tarafından görüntülenen pikselli hareketli bir görüntü verdi. Bu karoların hareketini düzenlemek için kontrol motoru, delikli kart destesi tarafından kontrol edilen büyük bir gürültülü makineydi.
Göreviniz böyle bir motoru taklit etmek ve bir girdi dosyası tarafından belirtilen pikselli bir animasyonu görüntülemek. Giriş, sabit genişlikli formattaki satırlardan oluşur, ancak satır sonu göstergesi için neyin uygun olduğunu varsayabilirsiniz. Biçim:
SSSSYYxxXXOA
SSSS: 4 digit sequence no. may be padded by blanks or all blank
YY: the y coordinate affected by this line (descending, top is 0, bottom is m-1)
xx: the starting x coordinate
XX: the ending x coordinate
O: hexadecimal opcode
A: argument (0 or 1)
Giriş açıkça sıralanmıştır (eğer kart destenizi yere bırakırsanız, bu bölüm için bana teşekkür edersiniz). Bu, programın, sıralama alanını bir sıralama anahtarı olarak kullanarak giriş satırlarının sabit bir türünü gerçekleştirmesi gerektiği anlamına gelir. Aynı sıra numarasına sahip satırlar orijinal göreli sıralarını korumalıdır. (Eğer anahtara gerçek satır numarasını eklerseniz kararsız bir sıralama ile çalışmalıdır.) Boş bir sıra alanı herhangi bir sayıdan daha düşük olarak yorumlanmalıdır (ascii harmanlama sırası).
Tek bir ifade satırı yalnızca tek bir y koordinatını etkileyebilir, ancak bitişik bir x değeri aralığı belirleyebilir. Bitiş x değeri boş bırakılabilir veya tek bir pikseli etkilemek için başlangıç değeri ile aynı olabilir.
Opcode, rasterop olarak kullanılan Evrensel İkili İşlev Kodunu belirten onaltılık bir rakamdır. Argüman 0 veya 1'dir. Gerçekleştirilen tarama işlemi
pixel = pixel OP argument infix expression
--or--
OP(pixel, argument) function call expression
Böylece, pikselin orijinal değeri UBF tablosuna X olarak girilir ve ifadedeki argüman değeri Y olarak girilir. Bu işlevin sonucu, pikselin yeni değeridir. Ve bu işlem, ifadede belirtilen her bir x, y çifti üzerinde xx, YY - XX, YY arasında gerçekleştirilir. Xx ve XX ile belirtilen aralık her iki bitiş noktasını da içerir. Yani
0000 0 010F1
0 satırında 0,1,2,3,4,5,6,7,8,9,10 piksel ayarlamalıdır.
Çıktı boyutları ( m x n ) minimum 20 x 20 olmalıdır, ancak istenirse daha büyük olabilir. Ama tahıl göstermeli, biliyor musun? Pikselli olması gerekiyordu . Hem grafik hem de ASCII-art çıktı kabul edilebilir.
Örneğin, pikselli bir şeklin resmini yapmak isteseydik:
# #
###
##
####
#
#### ####
# #
###
# #
# #
Onu XOR gibi biraz saydam bir op ile çizersek, ekranın siyah veya beyaz olmasına bakılmaksızın çizilebilir ve silinebilir.
00020261
0 6 661
1 3 561
2 3 461
3 3 661
4 4 461
5 0 361
5 5 861
6 3 361
6 5 561
8 3 561
9 3 361
9 5 561
10 3 361
10 5 561
Bu dizinin çoğaltılması rakamın görünmesini ve kaybolmasını sağlayacaktır.
Dizi alanında farklı "çekimler" belirtilerek daha büyük bir animasyon sıra dışı oluşturulabilir.
100 016F0
101 016F0
102 016F0
103 016F0
104 016F0
105 016F0
106 016F0
107 016F0
108 016F0
109 016F0
110 016F0
111 016F0
112 016F0
113 016F0
114 016F0
115 016F0
200020261
2 0 6 661
2 1 3 561
2 2 3 461
2 3 3 661
2 4 4 461
2 5 0 361
2 5 5 861
2 6 3 361
2 6 5 561
2 8 3 561
2 9 3 361
2 9 5 561
210 3 361
210 5 561
00020261
0 6 661
1 3 561
2 3 461
3 3 661
4 4 461
5 0 361
5 5 861
6 3 361
6 5 561
8 3 561
9 3 361
9 5 561
10 3 361
10 5 561
300020261
3 0 6 661
3 1 3 561
3 2 3 461
3 3 3 661
3 4 4 461
3 5 0 361
3 5 5 861
3 6 3 361
3 6 5 561
3 8 3 561
3 9 3 361
3 9 5 561
310 3 361
310 5 561
00020261
0 6 661
1 3 561
2 3 461
3 3 661
4 4 461
5 0 361
5 5 861
6 3 361
6 5 561
8 3 561
9 3 361
9 5 561
10 3 361
10 5 561
üreten:
Bu kod golf çok kısa bir program (byte-count) kazanır. Motor tıkırtı sesi çıkarırsa bonus (-50).
x
koordinatı her zaman kapsayıcı mı?