Deadfish é uma piada "linguagem de programação" com quatro comandos. Como a página Esolang é um pouco contraditória e os intérpretes dessa página não funcionam exatamente da mesma maneira, você deve implementar a seguinte variação:
Especificação
- Existe um acumulador que tem pelo menos 16 bits de tamanho, mais é permitido, mas menos não. Números negativos não precisam ser suportados. O acumulador é
0
quando o programa é iniciado. - Existem os dois conjuntos a seguir de quatro comandos, e seu programa deve suportar os dois ao mesmo tempo.
Peixe morto padrão │ Variante XKCD │ Significado ─────────────────────────────────────────────────────── ─────────────────────────── i │ x │ Acumulador de incremento d │ d accum Decremento acumulador s │ k │ Quadrado (acc = acc * acc) o │ c │ Acumulador de saída, como um número
- Se, após executar um comando, o acumulador for
-1
ou256
, o acumulador deverá ser redefinido para zero. Observe que isso não é normal. Se, por exemplo, o acumulador estiver20
e os
comando for executado, o acumulador deverá ser400
posterior. Da mesma forma, se o acumulador estiver257
e od
comando for executado, o acumulador deverá se tornar0
. - Qualquer entrada que não seja um desses comandos deve ser ignorada.
Programas de teste
xiskso
deve produzir0
xiskisc
deve produzir289
I / O
Seu programa deve exibir um aviso: >>
. O prompt deve estar no início de uma nova linha. Ele deve ler uma linha de entrada do usuário e executar os comandos fornecidos da esquerda para a direita. Ao emitir números, os números devem ser separados. Ou seja, 12 34
está bem, 12,34
está bem,
12
34
está OK, mas 1234
não está.
Seu programa deve continuar fazendo isso em um loop, pelo menos até que EOF
seja alcançado.
Sessão de exemplo:
>> xiskso
0
>> xiskisc
289
>> ddddo ddddo
285
281
>> ddddo ddddo
277
273
>> dddddddo
266
>> dddddddddo
257
>> do
0
>> do
0
>> io
1
>>
code-golf
interpreter
deadfish
marinus
fonte
fonte
#{STDIN.gets}
funcionaria, mas na verdade não funciona.Respostas:
K, 77 bytes
Note que este é o K4 . Uma solução K6 é um pouco mais longa porque os verbos de E / S são mais longos, mesmo que tudo o resto seja melhor:
""0:
imprime e retorna seu argumento. Observe no K4 que simplesmente aplicamos a 1 .0 f/ args
demonstra redução com um valor inicial, ou seja,f[f[0;first arg];second arg]…
{x*2=-1 256?x…
classifica x em 0 (para -1), 1 (para 256) e 2 para todos os outros valores.2=
significa que obtemos1
valores não classificados e0
, caso contrário, multiplicar porx
é mais curto que um condicional. No K6, podemos melhorar um pouco porque{x*^-1 256?x:y@x}
confia no fato de-1 256?x
retornar0N
(nulo) e^
detectar nulos."xkcdiso"
vez da ordem sugerida, porque7#
contorna os quatro argumentos, isto é,7#"abcd"
retornos"abcdabc"
que mantêm nossa tabela menor"x"
e"i"
para a projeção1+
que é equivalente à função,{1+x}
mas mais curta."d"
na projeção-1+
que é equivalente à função,{-1+x}
mas mais curta."k"
e"s"
para a função{x*x}
"c"
e"o"
para a função de saída{-1@$x;x}
que novamente no K6 é um pouco mais longa:{""0:,$x;x}
mas ambos imprimem sua saída seguida por uma nova linha e, em seguida, retornam o argumento.o`
qual é mais curto.fonte
Perl 5 , 90 bytes
Experimente online!
Agradecemos ao @xfix por sua ajuda nisso anteriormente! Guardado 4 bytes graças a @Xcali !
fonte
1
quando o acumulador transborda. Além disso, você pode reduzir seu programa em cinco caracteres, alterando$a
para$?
(que é inicializado0
e não será alterado até que você execute algum programa externo a partir do Perl).issso
como um comando, não se você fizer cada um separadamente ... Vou dar uma olhada nisso mais tarde e certamente usará$?
. Obrigado!''
vez disso""
, quando usado comperl -e '...'
o mapa terminaria com o resultado dos///
. Obrigado novamente!Powershell,
131126121114113for($x=0){...}
- defina o acumulador como 0 e faça um loop para sempreread-host '>>'
- obtenha a entrada do usuário rapidamente>>
[char[]](...)
- converte a entrada do usuário em uma matriz de caracteres|%{...}
- executar o que está dentro{}
de cada personagemswitch -r($_)
- comutador regex para cada caractere"i|x"{$x++}
- combinari
oux
- aumentar o acumulador"d"{$x-=!!$x}
- matchd
- diminua$x
por!!$x
, que será0
if$x
is0
e de1
outra forma. Isso garante que o acumulador nunca chegue-1
."s|k"{$x*=$x}
- combinars
ouk
- quadrado"o|c"{$x}
- combinaro
ouc
- gerar o acumulador$x*=$x-ne256
- multiplique o acumulador por0
se é256
ou por1
outroSaída de exemplo
Eu acho que a implementação de
read-host
é específica do host, portanto esse host do Powershell (ConsoleHost) anexa:
ao prompt especificado.fonte
!!$x
vergonha, eu não posso utilizar essa ...Rebol 3,
178169161159Versão mais bonita:
fonte
Haskell, 202
fonte
e
ev
em operadores. Eu também tentei reescreverv
eg
para que o parâmetrox
permaneça no IO eprint
etc. seja levantado. Não consegui fazê-lo funcionar, mas acho que pode ser um bom lugar para alguém que conhece o haskell.IO
é que elas imprimem com muita freqüência (é por isso que eu usei emr n
vez dex
) ou não o suficiente, porque o valor nunca é solicitado…. Então, como eu ia mudare
ev
em operadores?'i'%x=x+1;'d'%x=x-1
... E apenas chame no vdo n<-x;r$w$o%n
. A razão pela qual os operadores economizam espaço é que eles não exigem espaços ao seu redor.Ruby,
140138Sessão de amostra (igual à sua):
fonte
K, 121
.
fonte
Ada
Aqui está uma implementação Ada para os poucos interessados neste idioma. Levei algum tempo para usar algumas das melhores práticas de Ada (como o uso de Indefinite_Holders em vez de acessar) e também para entender completamente como o Deadfish deve funcionar.
E a saída:
Se algumas pessoas que experimentaram Ada pudessem me dar algumas dicas de otimização, ficaria agradecido.
fonte
C, 159 caracteres
Tentei outra abordagem baseada na criação de uma tabela de pesquisa para decodificação de instruções, mas infelizmente isso acabou por mais tempo ( 169 ). Incluí-o, já que alguém pode apresentar um ajuste inteligente para reduzir o tamanho. (Deve ser executado sem argumentos)
fonte
C, 163
fonte
Python 3,
181175171162Isso gera uma nova linha após oNão mais!>>
, mas o OP não disse que isso não era permitido.Graças a
GlitchMr
,minitech
egolfer9338
!fonte
lambda
vez dedef
para uma função que retorna imediatamente.x in(-1,256)
salva dois caracteres. Como alternativa,s=lambda x:"a=%d"%(x!=-1and x!=256and x)
poderia salvar alguns.print(">>")
e usarfor i in input(">>")
;input()
permite especificar um prompt. Depois, não haverá nova linha depois>>
e você salvará os caracteres.R,
161,148, 138Versão não destruída:
Sessão de exemplo (no modo interativo):
fonte
Python 3, 141
Sei que estou muito atrasado, mas queria aproveitar a oportunidade para publicar uma versão mais curta do Python (e minha primeira tentativa do CodeGolf). :)
A declaração impressa foi meio complicada para isso. Se o prompt precisar terminar com um espaço em branco, adicione um caractere à contagem. :)
Explicação
v
é o acumulador.m
verifica se o valor fornecido é-1
ou256
. Nesse caso,0
será retornado o valor caso contrário.Nas linhas a seguir, as operações são atribuídas às variáveis correspondentes (como algumas têm o mesmo significado (gostar
i
ex
), isso é mais curto do que instanciar um novo dicionário). Esses são então usados noexec
abaixo.while 1:
é o loop principalAgora a diversão começa. Como a solução do @jazzpi , ele itera sobre cada caractere da entrada.
locals()
é o dicionário de todas as variáveis atuais (visíveis). Com.get(n,'')
a chave correspondente será colocada na exec-string (uma string vazia, se a chave (= outra entrada) não foi encontrada). Isso será, quando executado, concatenadov
e transmitidom
. O valor de retorno será armazenadov
novamente.Repita isso até ficar entediado. :)
fonte
y*(-1!=y!=256)
de -3 bytesPython 2, 139
Isso é legal, mas também bastante direto. Aqui está uma versão mais longa e mais fria:
Com 190 caracteres, talvez não seja a resposta mais competitiva aqui. Por outro lado, as corotinas são bem radicais e estou sempre procurando uma desculpa para usá-las (e compartilhá-las)
fonte
TI-BASIC,
104 10710210098Para calculadoras da série TI-83 + / 84 +.
Nomeie isso
prgmD
; eventualmente, transborda a pilha chamando a si mesma. Substitua a recursão por aWhile 1
, ao custo de dois bytes, para corrigir isso.Y é 0 por padrão, portanto, execute-o com uma calculadora limpa de memória recente ou armazene 0 a Y manualmente antes de executar isso.
Pena que as letras minúsculas (na sequência literal) são de dois bytes cada; caso contrário, isso seria mais curto que a resposta de Dom Hastings.
EDIT: Corrigido um erro de divisão por zero (0 ^ 0) ao custo de três bytes.
107 -> 102: usado truque de exponenciação imaginária para salvar quatro bytes (incluindo 1 dos parênteses e -1 do alongamento da cadeia de pesquisa) e usou Y em vez de X, que leva menos um byte para inicializar.
fonte
Postscript 272
Ungolfed:
fonte
C (
224212 caracteres)Esta é provavelmente uma má escolha de idioma, mas tudo bem. Não é que linguagem como C possa fazer melhor do que alguma linguagem de programação dinâmica. No Clang, você precisará especificar um valor para
return
(isso não é necessário para o gcc).fonte
define q
e usar apenasprintf
?q
é usado 3 vezes, entãodefine q
salva ~ 2 caracteres.Lua,
230228Não é o pior, não é o melhor.
NOTA: conforme relatado por @mniip
256or
pode não funcionar no seu intérprete. Mais informações nos comentários.(mais ou menos) Versão legível:
Saída:
Edit: graças a @mniip para otimização de 2 caracteres:
until nil
->until _
fonte
repeat until x
(x é nulo como não definido) é 2 caracteres mais curto ewhile 1 do end
tem exatamente o mesmo comprimento, além da versão lua?256or
é sintaxe inválida no meu intérpreterepeat until x
. Estou usando o último binário do Windows a partir daqui . Como você pode ver,a=a+1 elseif
tem espaço. Issoe
ocorre porque o dígito hexadecimal, enquantoo
in256or
, não é, então meu intérprete tomaor
como outra instrução / block / howYouCallIt.256or
, além disso , também0repeat
e1then
; Estou usando lua oficial do lua.org, seu código não é compilado em 5.1, 5.2 ou 5.3Haskell ,
186178 bytesIsso precisa ser executado com
runhaskell
(ou dentroghci
) uma vez que ambos definir oBufferMode
queNoBuffering
por padrão que cofres bastante bytes:Experimente online!
Explicação
Isto define um novo operador
state # source
(a declaração fixidez nos permite cair parênteses quando usá-lo em conjunto com outros operadores(+)
,(-)
,(^)
,(:)
e(>>)
):-1
e256
r#_
), ele lê novos e começa novamente, mantendo o estado antigoPara iniciar o processo, inicializamos o estado com
0
e lemos uma nova linha de origem, ie. comece com uma fonte vazia:fonte
Lote do Windows,
204256Ignora com êxito outros comandos. Realmente ficou inchado sem ter
or
que trabalhar com ...Editar:
fonte
Script de comando do Windows - 154
Abusin características desconhecidas ao máximo.
fonte
> <> , 258 bytes
Fiz outra resposta> <> desde que não pude testar as fases e ele usou comandos pré-empilhados em vez de emular um shell de qualquer maneira.
Certamente, isso pode ser aproveitado, mas não tenho certeza se terei a bravura de
insanidadenecessária !Testei-o com o intérprete oficial em execução no python 3.5 no cygwin no windows 7 e pude reproduzir o teste:
Caso você não possa executá-lo em sua máquina (a entrada parece complicada) ou apenas queira testá-lo sem nenhum outro software, você pode usar a seguinte versão no interpretador on - line .
Obviamente, desconsidera \ n e EOF, pois você não pode inseri-los no interpretador on-line, mas se comportará como se a tecla enter tivesse sido pressionada após cada comando de saída.
fonte
C (gcc) , 139 bytes
Compilar com
-Dk="_nZZiaeY"
(incluído na contagem de bytes). -2 bytes se o prompt>>\n
for permitido.Experimente online!
Degolf
fonte
Barril , 68B
fonte
Haskell, 230
Se ao menos eu conseguisse me livrar daquela
hFlush stdout
ligação traquina ! Sem ele, o prompt não é exibido até que umao
operação seja executada. Algum conselho?fonte
hFlush
usando emrunhaskell
vez de compilar (veja minha resposta ), mas, quanto a esta solução, ela não é válida e não gera erros.PHP + HTML 345
a saída é um pouco superficial (o histórico / sessão é mostrado em uma área de texto e, com o relatório de erros ativado, muitos avisos são impressos), mas tudo funciona
fonte
239
A pilha inicial é a entrada. Você pode experimentá-lo online aqui .
fonte
Golf-Basic 84, 88 caracteres
Solicita um comando de cada vez, como em pelo menos 3 outras soluções. Aqui está um teste para
xiskisc
:Além disso,
xiskso
gera 0, como deveria.fonte
JavaScript (Node.js), 204 bytes
Provavelmente isso pode ser jogado no golfe. O Node.js novamente prova que é uma verbosidade disfarçada estranha mais uma vez. Código explicado:
fonte
C #, 311 bytes
seria de 283 bytes se usings e declaração de classe, etc, pudessem ser omitidos fornecendo apenas uma definição de função
fonte