Saya merancang bahasa di mana pointer aritmatika adalah alat utama pemrograman.
Berikut ini beberapa contohnya.
(print 0 to 8)
=9[>1=9-*-1.>-1-1]
(print 1 to 10 with spaces in between, character literal extension used)
=1[.>1=10-*-1[>1=' '!>-2+1;-2];1]='\n'!
(compute the factorial of 10)
=10>1=*-1-1[>-1**1>1-1]>-1.
(print "hi")
=104!=105!
(print "hi" with extension for arrays)
={104,105,0}[!>1]
(print "Hello, world!" with extension for C-style string literals)
="Hello, world!"[!>1]
Spesifikasi Bahasa
Definisi bahasa sangat sederhana. Anda akan memahami dengan mudah jika Anda memiliki pengalaman dengan C, tetapi saya tidak akan menganggapnya demikian.
Setiap program di PointerLang memiliki pointer , singkatnya P
,. Anda dapat menganggapnya sebagai variabel global tunggal tersembunyi, yang dapat Anda kontrol dengan menggunakan perintah . P
awalnya menunjuk ke awal array . Setiap elemen dalam array memiliki tipe int
yang merupakan integer bertanda 32-bit.
Untuk programmer C.
int32_t *P = malloc(1000);
Di PointerLang, ada perintah dan argumen . Argumen adalah int
yang harus datang setelah perintah. Semua perintah dijalankan dari kiri ke kanan kecuali ditentukan lain. Berikut ini adalah daftar perintah. A
singkatan argumen. Perintah tanpa A
berarti itu tidak mengambil argumen. Perintah dengan A
harus mengambil argumen. Di dalam tanda kurung adalah ekspresi C setara.
=A
: assign A at P (*P = A
)+A
: tambahkan A at P (*P += A
)-A
: kurangi A at P (*P -= A
)*A
: kalikan dengan A di P (*P *= A
)/A
: bagi dengan A at P (*P /= A
)>A
: pindahP
olehA
(P += A
).
: cetak bilangan bulat di P (printf("%d", *P)
)!
: cetak integer di P as ASCII (printf("%c", (char)*P)
)[
: jika nilai pada P adalah 0 pergi ke perintah setelah next]
(while (*P) {
)]
: buka sebelumnya[
yang merupakan pasangan yang cocok (}
);A
: jikaA
positif, buka perintah setelahA
th]
datang berikutnya; jikaA
negatif, pergi keA
th[
datang sebelum; jika A adalah 0, jangan lakukan apa pun.
Literal integer adalah argumen.
Dua berikut adalah argumen khusus yang mengambil argumen.
-A
: dievaluasi sebagai argumen yang memiliki nilai absolut yang sama denganA
dan tanda kebalikan dariA
; minus unary*A
: PindahP
olehA
, mengevaluasi nilai padaP
, bergerakP
dengan-A
(P[A]
)
Semua komentar di PointerLang ada di antara tanda kurung (comment)
.
Contoh Program
Program ini yang dihitung dari 1 hingga 10 adalah contoh yang baik untuk melengkapi pemahaman Anda.
(print 1 to 10 with spaces in between)
=1[.>1=10-*-1[>1=32!>-2+1;-2];1]=10!
Berhati-hatilah saat menafsirkan -*-1
. -
adalah perintah dan *-1
argumennya. Integer literal secara efektif menunjukkan akhir dari pasangan argumen-perintah.
Ini dapat diterjemahkan ke C dengan korespondensi 1-ke-1 sebagai
int main(void) {
int32_t *P = malloc(1000);
*P = 1; // =1
l:
while (*P) { // [
printf("%d", *P); // .
P += 1; // > 1
*P = 10; // =10
*P -= P[-1]; // -*-1
while (*P) { // [
P += 1; // >1
*P = 32; // =32
printf("%c", (char)*P); // !
P += -2; // >-2
*P += 1; // +1
goto l; // ;-2
} // ]
break; // ;1
} // ]
*P = 10; // =10
printf("%c", (char)*P); // !
return 0;
}
Ekstensi dapat diterapkan ke bahasa ini seperti literal karakter, array, string string dll, tetapi Anda tidak harus mengimplementasikannya, untuk kesederhanaan.
Tantangan
Anda harus mengimplementasikan fitur inti yang dirinci di bagian Spesifikasi Bahasa dan CATATAN di bawah ini. Cobalah dengan bahasa pemrograman favorit Anda, tuliskan program sesingkat mungkin.
CATATAN1: Ukuran array tidak ditentukan. Tetapi harus cukup besar untuk menyelesaikan sebagian besar masalah.
CATATAN2: Overflow bilangan bulat tidak ditentukan.
CATATAN3: Spesifikasi hanya mendefinisikan hasil atau efek dari konstruksi bahasa tertentu. Misalnya, Anda tidak harus mengikuti langkah-langkah dalam definisi argumen dengan tepat *
.
CATATAN4: Setiap karakter yang bukan perintah, argumen, atau komentar Whitespaces diabaikan. =104!=105!
sama seperti = 1 0 4! = 1 05 !
misalnya.
CATATAN5: Komentar tidak disarangkan. ((comment))
adalah kesalahan sintaksis.
NOTE6: Saya telah membuat perubahan untuk memperbaiki lubang dalam bahasa saya. The ~
perintah sekarang tidak terpakai dan ;
selalu membawa argumen.
CATATAN7: Setiap literal bilangan bulat adalah desimal.
sumber
=9[>1=9-*-1.>-1-1]
mencetak 0 hingga 9? Setelah itu ptints 8 karena P [0] = 1 maka kemudian kurangi 1 tepat sebelum akhir dari loop yang membuat P [0] = 0 dan kemudian ketika memulai loop lagi itu harus keluar karena P [0] = 0 sehingga Misalnya hanya mencetak 0 hingga 8. Atau apakah saya benar-benar bingung?Jawaban:
C 413
Berkat @ceilingcat untuk beberapa permainan golf yang sangat bagus - sekarang bahkan lebih pendek
Cobalah online!
dan versi yang sedikit kurang golf dari jawaban asli saya:
sumber
switch(...){case'(':...case'.':...
denganj=='('?...:j=='.'?...
dan memfaktorkan panggilan fungsi agar sesuai dengan operator ternary.