Golf um intérprete InterpretMe

8

Este é um desafio muito simples.

A linguagem da piada InterpretMe consiste em um comando; *, o que faz com que o programa receba a entrada de um programa InterpretMe e o execute.

Um programa InterpretMe interpretará quantos programas InterpretMe houver *na entrada.


Seu objetivo é criar um programa que interprete o InterpretMe no menor número de bytes possível.


Entrada

A entrada consistirá em seqüências ASCII de uma linha, sequências unicode utf-8, se você realmente quiser, ou em qualquer codificação de caracteres que seu idioma utilize, se você desejar muito. Essas cadeias podem ser inseridas no início ou no início de cada execução do interpretador InterpretMe. Se todas elas forem inseridas no início, o programa deverá emitir todas as linhas do programa assim que for iniciado.

Resultado

Nesse desafio, não haverá saída, a menos que a opção de uma entrada seja escolhida; caso contrário, somente terminação e não terminação


Os casos de teste consistem não em entrada e saída, mas em entrada e finalização. Uma nova linha indica uma nova entrada a ser interpretada como InterpretMe.

Se estiver usando uma entrada no início, pode ser considerado o que é gerado quando esses programas são inseridos, seguido por linhas inativas (não faça nada).

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]

Novamente, isso é , então menos bytes é melhor

Limão destrutível
fonte
1
Eu realmente não entendo. Esses 0 bytes não estão em praticamente todos os idiomas?
James James
1
não, porque você tem que tomar entrada como muitas vezes como existem "*" s em um programa, em seguida, reiterar o mesmo com cada entrada
Destrutível Lemon
Você pode dar um exemplo de um programa sem término?
Neil
17
Espere um segundo? O que?
Rohan Jhunjhunwala
3
Isso não parece um desafio bem definido, uma vez que não parece haver um critério claro para o fato de um programa "ter realmente interpretado" sua entrada.
User2357112 suporta Monica

Respostas:

2

05AB1E , 11 bytes

Código:

[¬'*QiIJ}¦Ž

Explicação:

[            # 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

Usa a codificação CP-1252 . Experimente online? .

Adnan
fonte
10

Python 3, 35 bytes

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

define i como um, adiciona a quantidade de '*' -1 a i

Eu acho que posso reduzir isso com ~truques que não consegui

Limão destrutível
fonte
9

Python 3, 39 38 bytes

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

Guardado 1 byte graças a @atlasologist

TuxCrafting
fonte
2
35 bytes em CoffeeScript f=->f()for c in prompt()when c=='*'(Eu não quero fazer outra resposta, uma vez que é uma cópia direta do seu)
Bojidar Marinov
2
Eu acho que você salvaria um byte indo com uma função regular (em def f()vez de f=lambda).
Atlasologist
8

Ruby, 29 bytes

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

A variável mágica do Ruby $.rastreia o número de linhas lidas no stdin. Continue lendo a entrada enquanto esse número for menor que a contagem de asteriscos (mais o 1 inicial).

daniero
fonte
6

JavaScript, 53 45 44 bytes

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

Este programa é bastante irritante de usar devido à falta de boas E / S do JavaScript.

Solicita um programa e, em seguida, solicita outro programa para cada um *no programa de entrada.

Gato de negócios
fonte
6

Apenas Java 45 60 101 100 99 bytes

Código reverso de golfe: D. Percebi que li errado as especificações (duas vezes), mas agora deve funcionar. Parece bastante simples, talvez haja uma maneira melhor de escrever isso como uma expressão lamda.

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

Trapaça levemente desprezível por apenas 17 bytes!

void a(char[]a){}

Esta versão terá entrada via digitação muito rápida

Rohan Jhunjhunwala
fonte
2
if(b=='*')pode ser jogado if(b==42)para -1 byte. E new Java.util.Scanner(deve estar em minúsculas j. +1 para a parte de código reverso de golfe. ;)
Kevin Cruijssen
1
Esta resposta fez o meu dia: D for(int b:a)salva um byte adicional, portanto, menos de 100 bytes por não fazer nada: D
Frozn
Obrigado! @Frozn (esses personagens ajudar o comentário de acordo com PPCG)
Rohan Jhunjhunwala
4

Mathematica, 38 bytes

f:=StringCases[InputString[],"*":>f];f
alefalpha
fonte
4

APL, 15 bytes

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

Teste:

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

Explicação:

              ⍞  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
fonte
2

Perl, 33 bytes

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

Conta o número de vezes que * ocorre na entrada e adiciona isso ao número de vezes que ele faz um loop. Eu sinto que deveria haver uma maneira de fazer o decremento na mesma etapa do incremento, mas não consegui descobrir.

theLambGoat
fonte