Golf seorang juru bahasa InterpretMe

8

Ini adalah tantangan yang sangat sederhana.

Bahasa lelucon InterpretMe terdiri dari satu perintah; *, yang menyebabkan program untuk mengambil input dari program InterpretMe dan menjalankannya.

Program InterpretMe akan menafsirkan sebanyak mungkin program InterpretMe yang ada *di input.


Tujuan Anda adalah membuat program yang menginterpretasikan InterpretMe dalam sesedikit mungkin byte.


Memasukkan

Input akan terdiri dari string ASCII satu baris, string unicode utf-8 jika Anda benar-benar menginginkannya, atau pengkodean karakter apa pun yang digunakan bahasa Anda, jika Anda menginginkannya sebanyak itu. String ini dapat dimasukkan pada awal, atau pada awal setiap proses interpreter InterpretMe. Jika mereka semua dimasukkan pada awal, program harus menampilkan setiap baris program saat memulai.

Keluaran

Dalam tantangan ini, tidak akan ada output kecuali pilihan satu input dipilih, jika tidak hanya terminasi dan non-terminasi


Kasus uji tidak terdiri dari input dan output, tetapi input dan terminasi. Baris baru menunjukkan input baru untuk ditafsirkan sebagai InterpretMe.

Jika menggunakan satu input di awal, ini bisa dianggap apa yang dikeluarkan ketika program ini diinput, diikuti oleh garis tidak aktif (tidak melakukan apa-apa).

1. *   (executes input as an interpret me program, finishes)
2. *   (^same)
3. **  (executes input as an interpret me program, then does this again after the first program is done, finishes)
4. hi  (nothing, first star of previous line finishes)
5. **  (same as the other two star line)
6. hi  (nothing, first star of previous line finishes)
7. hi  (nothing, second star of line 5 finishes, so second star of line 3 finishes, so line 2 finishes, so line one finishes)
[termination] (not outputted)

hi  (does nothing and finishes)
[termination]

*hi  (executes inputted program, finishes)
*yo  (executes inputted program, finishes)
hey  (nothing)
[termination]

Sekali lagi, ini adalah , jadi lebih sedikit byte lebih baik

Lemon dirusak
sumber
1
Saya tidak begitu mengerti. Bukankah ini 0 byte dalam hampir semua bahasa?
James
1
tidak, karena Anda harus mengambil input sebanyak yang ada "*" dalam sebuah program, lalu ulangi hal yang sama dengan setiap input
Destructible Lemon
Bisakah Anda memberikan contoh program non-pemutusan hubungan kerja?
Neil
17
Tunggu sebentar? Apa?
Rohan Jhunjhunwala
3
Ini sepertinya bukan tantangan yang didefinisikan dengan baik, karena tampaknya tidak ada kriteria yang jelas untuk apakah suatu program "benar-benar menafsirkan" inputnya.
user2357112 mendukung Monica

Jawaban:

2

05AB1E , 11 byte

Kode:

[¬'*QiIJ}¦Ž

Penjelasan:

[            # Enter an infinite loop
 ¬           # Get the first character of the input string (leaves the input on the stack)
  '*Qi  }    # If equal to an asterisk...
      I      # Request another line of input and
       J     # Join it to the string that was left on the stack
         ¦   # Remove the first character
          Ž  # If everything is processed, terminate

Menggunakan pengkodean CP-1252 . Coba online? .

Adnan
sumber
10

Python 3, 35 byte

i=1
while i:i+=input().count('*')-1

set i to one, tambahkan jumlah '*' -1 ke i

Saya pikir saya bisa mengurangi ini dengan ~tipu daya yang tidak bisa saya lakukan

Lemon dirusak
sumber
9

Python 3, 39 38 byte

def f():[f()for c in input()if c=="*"]

Disimpan 1 byte berkat @atlasologist

TuxCrafting
sumber
2
35 byte dalam CoffeeScript f=->f()for c in prompt()when c=='*'(saya tidak ingin membuat jawaban lain karena ini adalah salinan langsung dari Anda)
Bojidar Marinov
2
Saya pikir Anda akan menyimpan byte dengan pergi dengan fungsi biasa ( def f()bukan f=lambda).
atlasologist
8

Ruby, 29 byte

i=1
i+=gets.count ?*while$.<i

Variabel ajaib Ruby $.melacak jumlah baris yang dibaca dari stdin. Tetap baca input saat angka ini lebih rendah dari jumlah tanda bintang (ditambah 1 awal).

daniero
sumber
6

JavaScript, 53 45 44 byte

f=_=>{for(i in prompt().match(/\*/g))f()}f()

Program ini agak mengganggu untuk digunakan karena kurangnya I / O JavaScript yang baik.

Meminta program, lalu meminta program lain untuk setiap *program input.

Kucing Bisnis
sumber
6

Java hanya 45 60 101 100 99 byte

Membalikkan kode-golf: D. Saya perhatikan bahwa saya salah membaca spesifikasi (dua kali), tetapi sekarang seharusnya berfungsi. Tampaknya cukup sederhana, mungkin ada cara yang lebih baik untuk menulis ini sebagai ungkapan lamda.

void a(char[]a){for(char b:a)if(b==42)a(new java.util.Scanner(System.in).nextLine().toCharArray());}

Kecurangan busuk hanya 17 byte!

void a(char[]a){}

Versi ini akan menerima input melalui pengetikan yang sangat cepat

Rohan Jhunjhunwala
sumber
2
if(b=='*')dapat di-golf hingga if(b==42)-1 byte. Dan new Java.util.Scanner(harus dengan huruf kecil j. +1 untuk bagian kode golf terbalik. ;)
Kevin Cruijssen
1
Jawaban ini membuat hari saya: D for(int b:a)menyimpan byte tambahan, jadi kurang dari 100 byte untuk tidak melakukan apa pun: D
Frozn
Terima kasih! @Frozn (karakter-karakter ini membantu komentar sesuai ppcg)
Rohan Jhunjhunwala
4

Mathematica, 38 byte

f:=StringCases[InputString[],"*":>f];f
alephalpha
sumber
4

APL, 15 byte

{⍵='*':∇¨⍞⋄⍬}¨⍞

Uji:

      {⍵='*':∇¨⍞⋄⍬}¨⍞
*
*
**
hi
**
hi
hi
⍝ termination

Penjelasan:

              ⍞  read a line from the keyboard
{           }¨   for each character:
 ⍵='*':          if it is *:
         ⍞         read another line from the keyboard
       ∇¨          do the same for each character
          ⋄⍬     otherwise, return empty list (which displays as nothing)
marinus
sumber
2

Perl, 33 byte

for(my$c;$c+=()=<>=~/\*/g;$c--){}

Menghitung berapa kali * yang terjadi pada input dan menambahkan itu ke berapa kali loop. Saya merasa harus ada cara untuk melakukan decrementing pada langkah yang sama dengan incrementing tetapi saya tidak bisa mengetahuinya.

theLambGoat
sumber