Berikut ini definisi bahasa yang sangat sederhana:
A Variable is any string that does not contain ^, <, >, !, or ?
The empty string is a valid variable identifier
The value of every variable starts at 0.
A Statement is one of (var is a Variable, P is a Program):
var^ -> changes var to be equal to 1 more than itself
var<P> -> while var > 0, changes var to be equal to 1 less than itself, then runs P
var! -> output value of var
var? -> ask for non-negative integer as input, increase var by that value
A Program is a concatenation of Statements, running a Program means running each Statement in order
Contoh program (perhatikan bahwa string kosong adalah variabel, tetapi saya akan menggunakannya dengan hemat demi kejelasan, dan beberapa variabel diberi nol pada program ketika biasanya 0 secara default):
<>: sets the value of the empty string variable to 0
b<>b?b<a^>: asks for b, then adds the value stored in b to a, zeroing b in the process
b<>b?a<>b<a^>: asks for b, then sets a to the value of b, zeroing b in the process
a<>c<>b<a^c^>c<b^> : copies the value in b into a without zeroing it
b<>c<>a<c^c^c<b^>>b! : outputs a multiplied by 2
b^b<a<>a?a!b^> : outputs what you input, forever
Tujuan Anda adalah untuk menulis juru bahasa terkecil untuk bahasa ini.
Nilai suatu variabel bisa besar secara sewenang-wenang dan seharusnya hanya dibatasi oleh total memori yang dapat diakses oleh bahasa Anda, secara teori, tetapi Anda hanya diminta untuk menangani nilai hingga 2 ^ 256.
Program Anda seharusnya dapat menangani program panjang yang sewenang-wenang, secara teori, tetapi Anda hanya akan diminta untuk mengerjakan program dengan panjang 2 ^ 32 karakter. Anda diminta untuk menangani loop bersarang dengan kedalaman hingga 2 ^ 32 juga.
Anda dapat mengasumsikan bahwa program tersebut adalah program yang valid, dan bahwa Anda hanya akan mendapatkan bilangan bulat non-negatif saat Anda meminta input. Anda juga dapat berasumsi bahwa hanya karakter yang dapat dicetak ASCII yang dimasukkan dalam string input.
Kecepatan program yang Anda tafsirkan tidak masalah, itu akan sangat lambat untuk hal-hal sesederhana perkalian 5 digit, tanpa optimasi.
Jika Anda ingin menggunakan bahasa yang tidak dapat menerima input atau menghasilkan output dengan cara yang dijelaskan oleh bahasa, gunakan interpretasi apa pun yang Anda inginkan. Ini berlaku untuk alasan apa pun bahasa Anda tidak dapat menerapkan beberapa perilaku yang diperlukan. Saya ingin semua bahasa dapat bersaing.
Kemenangan program terpendek. Celah standar berlaku.
sumber
Jawaban:
Ruby, 182 byte
Coba seperti ini:
Bagaimana itu bekerja
The
r
Fungsi tokenizes string input dan mengeksekusi setiap token:Kami mencari beberapa
$2
pencocokan nama variabel[^!?^<>]*
, diikuti oleh salah satunya<...>
di mana...
cocok dengan nol atau lebih program (\g
rekursi), dalam hal$4
ini tidaknil
!
,,?
atau^
karakter, ditangkap oleh$3
, dalam hal$4
ininil
.Maka logika untuk mengeksekusi token cukup sederhana ketika membuat indentasi sedikit:
sumber
JavaScript (ES6) 184
194 209Sunting Sederhana (menggunakan parameter fungsi untuk input dan output sepertinya ide yang bagus, tetapi ternyata tidak), 1 byte lebih disimpan thx @ ӍѲꝆΛҐӍΛПҒЦꝆ
Edit 2 Penguraian yang dimodifikasi. Logika untuk kenaikan / input dipinjam dari jawaban @ Lynn
Kurang golf
UJI Potongan mulai mengevaluasi 2016 menggunakan program yang diposting oleh @Neil. Sabar...
sumber
eval
untuk menghindarireturn
bukan pilihan?Perl, 251 byte
Versi yang lebih mudah dibaca:
Ini membuang banyak byte memperbaiki loop menjadi lompatan langsung, tetapi pemindaian mundur untuk loop mulai menyinggung perasaan saya tentang estetika.
sumber
Standar C ++, 400 byte
Ini mengkompilasi dengan
g++ -g test.cpp -Wall -Wextra -pedantic -std=gnu++11
Saya mungkin bisa mempersingkat lagi. Jika Anda memiliki beberapa saran, silakan komentar.
sumber