The SAS bahasa pemrograman adalah kikuk, kuno bahasa dating kembali ke 1966 yang masih digunakan sampai sekarang. Kompiler asli ditulis dalam PL / I , dan memang banyak sintaks yang berasal dari PL / I. SAS juga memiliki bahasa makro preprosesor yang berasal dari bahasa PL / I juga. Dalam tantangan ini, Anda akan menafsirkan beberapa elemen sederhana dari bahasa makro SAS.
Dalam bahasa makro SAS, variabel makro didefinisikan menggunakan %letkata kunci dan pencetakan ke log dilakukan dengan %put. Pernyataan diakhiri dengan titik koma. Berikut ini beberapa contohnya:
%let x = 5;
%let cool_beans =Cool beans;
%let what123=46.lel"{)-++;
Nama variabel makro tidak sensitif huruf dan selalu cocok dengan persamaan reguler /[a-z_][a-z0-9_]*/i. Untuk keperluan tantangan ini, kami akan mengatakan yang berikut:
- Variabel makro hanya bisa memegang nilai-nilai yang terdiri sepenuhnya dari karakter ASCII yang dapat dicetak kecuali
;,&, dan% - Tidak akan ada spasi awal atau akhir dalam nilai
- Nilai tidak akan pernah lebih dari 255 karakter
- Nilai mungkin kosong
- Kurung dan tanda kutip dalam nilai mungkin tidak cocok
- Mungkin ada jumlah ruang sebelum dan sesudah
=dalam%letpernyataan dan ruang ini harus diabaikan - Mungkin ada jumlah ruang sebelum terminal
;dalam%letpernyataan dan ruang ini juga harus diabaikan
Ketika variabel makro dipanggil, kita katakan itu "diselesaikan" ke nilainya. Variabel makro diselesaikan dengan memprioritaskan &. Ada trailing opsional. yang menunjukkan akhir pengidentifikasi. Sebagai contoh,
%put The value of x is &X..;
menulis The value of x is 5.ke log. Perhatikan bahwa dua periode diperlukan karena satu periode akan dikonsumsi oleh &X.dan diselesaikan 5. Perhatikan juga bahwa meskipun kita definisikan xdalam huruf kecil, &Xsama dengan &xkarena nama variabel makro tidak sensitif huruf.
Di sinilah rumit. Beberapa &s dapat dirangkai bersama untuk menyelesaikan variabel, dan &s pada tingkat yang sama menyelesaikan sarang pada saat yang sama. Sebagai contoh,
%let i = 1;
%let coolbeans1 = broseph;
%let broseph = 5;
%put &&coolbeans&i; /* Prints broseph */
%put &&&coolbeans&i; /* Prints 5 */
Keputusan terdalam &pertama, dan resolusi berlanjut ke luar. Pencocokan nama variabel dilakukan dengan rakus. Dalam %putpernyataan kedua , prosesor membuat langkah-langkah berikut:
&imemutuskan untuk1, dan pimpinan terdalam&dikonsumsi, memberi kita&&coolbeans1&coolbeans1memutuskan untukbroseph, memberi kita&broseph&brosephmemutuskan untuk5.
Jika ada trailing .s, hanya satu .yang dikonsumsi dalam resolusi, bahkan jika ada beberapa &s.
Tugas
Diberikan antara 1 dan 10 %letpernyataan yang dipisahkan oleh baris baru dan satu %putpernyataan, cetak atau kembalikan hasil %putpernyataan tersebut. Input dapat diterima dengan cara standar apa pun.
Anda dapat mengasumsikan bahwa input akan selalu valid dan bahwa %letpernyataan akan mendahului %putpernyataan. Variabel yang didefinisikan tidak akan didefinisikan ulang dalam %letlaporan nanti .
Jika benar-benar berjalan di SAS, tidak akan ada masalah dengan variabel yang menyelesaikan variabel yang tidak ada dan semuanya akan benar secara sintaksis seperti dijelaskan di atas.
Contohnya
Memasukkan:
%let dude=stuff; %let stuff=bEaNs; %put &&dude..;Keluaran:
bEaNs.Memasukkan:
%let __6 = 6__; %put __6&__6;Keluaran:
__66__Memasukkan:
%let i=1; %let hOt1Dog = BUNS; %put &&HoT&i.Dog are FUNS&i!");Keluaran:
BUNS are FUNS1!")Memasukkan:
%let x = {*':TT7d; %put SAS is weird.;Keluaran:
SAS is weird.Memasukkan:
%let var1 = Hm?; %let var11 = var1; %let UNUSED = ; %put &&var11.....;Keluaran:
Hm?....Perhatikan bahwa
&&var11kecocokanvar11karena pencocokan nama serakah. Jika ada., yaitu&&var1.1, makavar1akan dicocokkan dan 1 tambahan tidak akan menjadi bagian dari nama apa pun.
Ini kode golf, jadi solusi terpendek dalam byte menang!
&&&&&&&&&a......................apakah hanya akan menghapus satu periode?
&stuff.menghapus periode?