Kode ini mencetak peta India. Bagaimana cara kerjanya?
#include <stdio.h>
main()
{
int a,b,c;
int count = 1;
for (b=c=10;a="- FIGURE?, UMKC,XYZHello Folks,\
TFy!QJu ROo TNn(ROo)SLq SLq ULo+\
UHs UJq TNn*RPn/QPbEWS_JSWQAIJO^\
NBELPeHBFHT}TnALVlBLOFAkHFOuFETp\
HCStHAUFAgcEAelclcn^r^r\\tZvYxXy\
T|S~Pn SPm SOn TNn ULo0ULo#ULo-W\
Hq!WFs XDt!" [b+++21]; )
for(; a-- > 64 ; )
putchar ( ++c=='Z' ? c = c/ 9:33^b&1);
return 0;
}
c
obfuscation
narayanpatra
sumber
sumber
Jawaban:
String panjang hanyalah urutan biner yang dikonversi ke ASCII.
for
Pernyataan pertama membuatb
mulai dari 10, dan[b+++21]
setelah string menghasilkan 31. Memperlakukan string sebagai array, offset 31 adalah awal dari data "nyata" dalam string (baris kedua dalam sampel kode yang Anda berikan). Sisa kode hanya loop melalui urutan bit, mengubah 1 dan 0 ke! Dan spasi dan mencetak satu karakter pada suatu waktu.Versi yang kurang dikaburkan:
Bagian pintar yang
anehada diputchar
pernyataan. Ambil yang pertamaputchar
. ASCII'Z'
adalah 90 dalam desimal, jadi 90/9 = 10 yang merupakan karakter baris baru. Di kedua, desimal 33 adalah ASCII untuk'!'
. Mengubah bit orde rendah dari 33 memberi Anda 32, yang merupakan ASCII untuk spasi. Ini menyebabkan!
dicetak jikab
aneh, dan ruang kosong dicetak jikab
genap. Sisa kode hanya ada di sana untuk berjalan "pointer"a
melalui string.sumber
Pada dasarnya, string adalah pengkodean run-length dari gambar: Karakter bergantian dalam string mengatakan berapa kali untuk menggambar spasi, dan berapa kali untuk menggambar tanda seru secara berurutan. Berikut ini adalah analisis dari berbagai elemen program ini:
String yang disandikan
31 karakter pertama dari string ini diabaikan. Selebihnya berisi instruksi untuk menggambar gambar. Karakter individu menentukan berapa banyak spasi atau tanda seru untuk menggambar secara berurutan.
Luar untuk loop
Loop ini melewati karakter dalam string. Setiap iterasi meningkatkan nilai
b
satu, dan menetapkan karakter berikutnya dalam stringa
.Batin untuk loop
Loop ini menarik karakter individu, dan baris baru setiap kali mencapai akhir baris. Jumlah karakter yang diambil adalah
a - 64
. Nilaic
dari 10 hingga 90, dan ulang ke 10 ketika akhir garis tercapai.Itu
putchar
Ini dapat ditulis ulang sebagai:
Ini menarik karakter yang sesuai, tergantung pada apakah
b
genap atau ganjil, atau baris baru saat diperlukan.sumber
b
dimulai pada 10 dan indeksnya(b++)+21
, yang dimulai pada 31.