Desde que o Halloween está chegando, pensei em começar um divertido e desafiante desafio de golfe com código!
O desafio é bastante simples. Você precisa escrever um programa que produza trick
ou treat
.
"A torção?" você pode perguntar. Bem, deixe-me explicar:
Seu programa precisa fazer o seguinte:
- Seja compilável / executável em dois idiomas diferentes. Versões diferentes do mesmo idioma não contam.
- Quando você executa o programa em um idioma, ele deve ser exibido
trick
e o outro deve ser exibidotreat
. O caso é irrelevante e o preenchimento da string com caracteres de espaço em branco é permitido (veja exemplos). - Isso é código-golfe , então a solução com o menor número de bytes vence.
Algumas explicações:
Saídas válidas (apenas para as palavras que não são para executar o código nos dois idiomas. Também adicionando aspas para sinalizar o início ou o final da saída. Não as inclua na sua solução!):
"trick"
"Treat"
" TReAt"
"
tRICk "
Saídas inválidas :
"tri ck"
"tr
eat"
"trck"
Estou interessado em ver o que você pode criar! Golfe feliz!
Gostaria de observar que este é o meu primeiro desafio, portanto, se você tiver sugestões sobre essa questão, deixe-as na forma de um comentário.
Classificação
Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
# Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet da tabela de classificação:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
Respostas:
2sable / pl , 8 bytes
Ambos os programas foram testados localmente com o mesmo arquivo de 8 bytes, portanto, este é um poliglota adequado.
2sable: truque
Este é o programa na página de código 1252 .
Experimente online!
pl: tratar
Este é o programa na página de código 437 .
Experimente online!
Como funciona
2sable: truque
pl: tratar
fonte
Lote Python / Windows, 25 bytes
Tudo depois do # é interpretado como um comentário por python, enquanto o || é um OR em lote, dizendo que, como o comando anterior falhou, execute este.
Eu também gosto do uso de uma sala de cirurgia, pois quase lê "gostosuras ou travessuras" :)
fonte
2>nul
.Espaço em branco / estrelado, 135 bytes
Aqui está um céu noturno claro no Halloween!
Observe que o espaço em branco nas linhas vazias pode não ser preservado se você copiar do código acima
O espaço em branco gera "TRICK". Experimente Online!
Saídas estreladas "TRATAR". Experimente Online!
Explicação
Estrelado
Estrelado ignora todas as guias e novas linhas, de modo que o código que lê é o seguinte
Por outro lado, enviar valores é muito caro comparado às operações de empilhamento e aritmética no Starry. O código começa pressionando e duplicando 4 e executa várias operações nele, e com 2 e 1 pressionados posteriormente produz todos os valores ASCII necessários.
Código anotado
Espaço em branco
Como o nome pode sugerir, o espaço em branco analisa apenas os três caracteres de espaço em branco - espaço, tabulação e nova linha. Ao contrário do estrelado, o espaço em branco simplesmente empurra os valores ASCII de
T
,R
,I
,C
, eK
e as impressões deles.Código anotado
O entrelaçamento de pushes e impressões foi escolhido com base apenas em razões estéticas, pois não afeta a contagem de bytes.
fonte
Arquivo Linux ELF x86 / DOS .COM, 73 bytes
Fonte NASM:
Isso usa o fato de que o cabeçalho ELF começa com 7F 45, que, interpretado como código x86, é um salto.
As partes relevantes para o DOS .com:
fonte
mal / ZOMBI , 109 bytes
Outra resposta assustadora!
O
ZOMBIE
código define umvampire
nomexf
cuja única tarefaf
é ativada na instanciação e será exibidatrick
uma vez antes de ser desativadastumble
. A outrasay
chamada é código morto (como apropriado!) ParaZOMBIE
, mas contém a maior parte doevil
código.Pois
evil
, oxf
nome é uma chamada para pular para o próximoj
, que precede ozuueeueeawuuwzaeeaeeaeawuuuuwzuueeueeaw
gemido de zumbi que é produzido e produzidotreat
. O código a seguir é executado (letras minúsculas) ou ignorado, mas como nãow
há saída, deve ser produzido.fonte
Python / Perl, 28 bytes
Explicação
Como
[]
é um ArrayRef em Perl, é verdade, mas é um array vazio em Python, portanto falso.fonte
print({}and"trick"or"treat")
em Python / Lua.{}
é um HashRef!print ([]and"trick"or"treat")
print({}and"trick"or"treat")
!PHP / JavaScript,
3230 bytesExibe
trick
em PHP etreat
em JS.A
NaN
constante desconhecida é implicitamente convertida em uma string pelo PHP, tornando-a verdadeira. É falso em JS.Método alternativo, 38 bytes
O operador ternário é associativo à direita no JS:
E associativo à esquerda em PHP:
fonte
HTML / HTML + JavaScript, 53 bytes
treat
é o conteúdo de texto do documento em HTML.Se o JS estiver ativado, ele substituirá o conteúdo HTML por
trick
.fonte
document.write()
lugar. -8 bytesdocument.write
não substitui a saída HTML, mas anexa a ela.C / Java 7,
165155128123122120103 bytes// \ faz com que a próxima linha também faça um comentário em C, mas é um comentário comum de uma linha em Java, para que você possa fazer com que C ignore o código destinado a Java e, adicionando / * na segunda linha, faça um comentário para Java que seja analisado como código por C.
Edit: Eu melhorei um pouco reorganizando as linhas e comentários.
Edit2: Eu fiz um pouco mais de reorganização e reduzi ainda mais.
Edit3: Eu adicionei correções sugeridas pelo BrainStone para remover 5 bytes, obrigado :)
Edit4: Uma nova linha acabou por ser desnecessária, então eu a removi.
Edit5: Eu mudei printf para puts.
Edit6: Eu adicionei uma correção sugerida por Ray Hamel.
fonte
#include<stdio.h>
por#include<cstdio>
. Não muito, mas um byte é um byte. E remover adicionalmente naint
frente domain
cofre 4 bytes.int
é implícita em C e C ++ #String[]s
.Jolf + Chaîne, 12 bytes
Como Chaîne não pode aceitar um arquivo para carregar com uma codificação, eu assumo UTF-8. (Se eu pudesse assumir a ISO-8859-7, isso seria 11 bytes, mas isso seria injusto.)
Em Chaîne,
«
começa um comentário e o restante é impresso literalmente. Em Jolf,«
começa uma string. Felizmente,trick
não faz nada prejudicial (10; range(input, parseInt(input))
basicamente) etreat
é impresso.Tente Jolf aqui!
Tente Chaîne aqui!
Ambos funcionam no meu navegador (firefox, versão mais recente), mas o mesmo não pode ser dito para outros navegadores.
fonte
tr
.tr
possa ser reutilizado em qualquer golfe - é uma pequena informação que levaria pelo menos um operador a codificar em idiomas de golfe, depois em um idioma específico condicional. Provavelmente chegaria ao mesmo comprimento ou mais. No entanto, essa é apenas a minha conjectura;)#hell / Agonia , 43 bytes
Tanta coisa em
><>
todo lugar, o que é isso, um desafio para os enganados? Aqui está uma resposta com idiomas com temas apropriados.#hell
é um subconjunto doLUA
qual felizmente aceitaio.write
chamadas de saída. UsamosLUA
os--
comentários para que ele execute apenas este fragmento.Agony
é umBrainfuck
derivado, que tem a particularidade de ter seu código e memória de trabalho na mesma fita. A primeira linha imprime apenas 5 caracteres (10 células) no final do segmento de código, onde codifiqueitreat
comoAgony
comandos.LUA
A abertura do comentário--
modifica o valor de uma célula que não é usada.fonte
Cubix / Hexagony , 31 bytes
Engane-o! Trate-o online!
Temático de Halloween ? Observe os fatos terríveis sobre esses idiomas e o código:
=v=
sorriso para você que atua no no-ops no códigoVamos nos aprofundar no mistério do protocolo de comunicação oculto de 31 bytes de dimensões e terror ...
truque
Quando o código se dobra ou se desdobra ... Ou seja
cubified
, o layout fica assim:E a parte principal é essa parte no meio:
Empurra
k,c,i,r,t
para a pilha eo
gera e;
aparece dentro de um loop delimitado por refletores e?
que o guia dependendo do valor no topo da pilha ...tratar
De repente, o código se transforma de um cubo em um hexágono. (Imagine isso)
E a parte principal é esta parte:
Ele executa o
t;
que imprimet
e atinge o espelho e vira sua direção para NW a partir do canto SE e atinge outro espelho. Este é executador;
e passará parae;_a
ea]
traz para o ponteiro de instrução 1 que começa no NE esquina apontando SE e sucessos/
que reflete horizontalmente para;
depoist
.Em seguida, ele passará para
=
,;
e@
termina a confusão.Então ... O que está
_
fazendo lá?Por que está dentro das
t
e
a
(as 3 primeiras letras do código)?Aí vem o fim da história -
isso não faz nada .
Parece o fim de uma história de terror?fonte
SQL / Javascript, 54 bytes
A mesma abordagem da minha resposta QB / JS : a primeira linha possui a instrução SQL, a segunda linha possui um 'comentário' para SQL e um NOP para JS. Em seguida, definimos a
select
instrução do SQL como uma função JS válida.fonte
/Brainf..k/, 143 + 3 = 146 bytes
Essa resposta requer que a
-A
flag seja exibida em ASCII para Brain-Flak e, felizmente, Brainfuck não se importa com essa flag, portanto não afeta a saída em Brainfuck.Experimente Online!
Experimente Online!
Como isso funciona
A única sobreposição entre a sintaxe de Brain-Flak e Brainfuck são os personagens
<>[]
. Para ataques cerebrais, isso significa principalmente que o programa precisa garantir um número par de comutadores de pilha<>
. E para Brainfuck isso significa que precisamos evitar infinitos loops causados pelo uso da[]
mônada.O código Brain-Flak é o seguinte:
Além da parte
[<<...>>]
do meio e do<[<>]<>[<>]<>>
final, esse código é bastante parecido no que diz respeito aos programas Brain-Flak. O negativo em torno do zero ([<...>]
) existe para criar um loop para o Brainfuck. O interior<...>
é usado para mover o Brainfuck para uma célula vazia antes de encontrar o[][][][]
que seria repetidamente infinito.O código Brainfuck é o seguinte:
Além dos bits mencionados acima, este também é um programa bastante padrão, portanto, pouparei os detalhes.
fonte
/brainf..k/
, portanto, você deve usar o mesmo formato de cabeçalho que todos os outros.For brain-flak this mostly means the program has to ensure an even number of stack switches
Você tem certeza sobre isso? Não deve assunto desde<>
é um NOP em brainfuck> <> / Pesca , 38 bytes
Para fazer um
><>
/Fishing
polyglot.É o meu primeiro pedaço de
Fishing
código depois de jogar por um longo tempo><>
.Minha primeira impressão: como na natureza, o pescador tem menos capacidade física do que reza, mas a compensa com sua ferramenta!
Aqui o código é extremamente simples:
><>
só executará a primeira linha, onde_
é um espelho vertical e não tem efeito, já que o peixe começa a nadar na horizontal. Apenas empurratrick
a pilha e imprime-a antes de parar.Pois
Fishing
, o_
instrui a descer. O pescador seguirá o convés que é a segunda linha enquanto captura os caracteres da terceira linha. Eles pressionamtreat
a fita e a imprimem, parando quando atingem o final do baralho.Se o erro for permitido, você poderá descer para 35 bytes com o código a seguir, que emitirá um erro quando executado como
><>
uma veztrick
impresso na pilha:Você também deve verificar minhas respostas em idiomas temáticos, #hell / Agony and evil / ZOMBIE !
fonte
05AB1E / Na verdade , 10 bytes
Explicação
05AB1E
Experimente online
Na realidade
Experimente online
fonte
trick
, mas como é’®Â
tratar ..?Haskell / ML padrão , 56 bytes
Visualização Haskell
Os pontos-e-vírgulas permitem várias declarações em uma linha e agem como quebras de linha.
Um programa Haskell é executado chamando a
main
função, portanto, na última linhaputStr"trick"
é executada que apenas imprimetrick
.As duas primeiras linhas são interpretadas como declarações de função seguindo o padrão
<functionName> <argumentName1> ... <argumentNameN> = <functionBody>
. Portanto, na primeira linha,fun
é declarada uma função nomeada, que recebe dois argumentos nomeadosputStr
ex
e o corpo da funçãoprint"treat"
. Essa é uma função Haskell válida com tipofun :: t -> t1 -> IO ()
, o que significa que é necessário um argumento de um tipo arbitráriot
e um segundo de algum tipot1
e, em seguida, retorna uma ação de IO. Os tipost
et1
não importam, pois os argumentos não são usados no corpo da função. O tipo de ação de IO resulta deprint"treat"
, que imprime"treat"
no StdOut (observe o"
, é por isso queputStr
em vez deprint
é usado emmain
). No entanto, como é apenas uma declaração de função, nada é realmente impresso comofun
não é chamadomain
.O mesmo acontece na segunda linha
val main=();
,val
é declarada uma função que recebe um argumento arbitrário chamadomain
e retorna a unidade , a tupla vazia()
. Seu tipo éval :: t -> ()
(tanto o valor quanto o tipo de unidade são indicados()
).Experimente em Ideone.
Visualização ML padrão
ML padrão é uma linguagem principalmente funcional com uma sintaxe relacionada a, mas não a mesma que Haskell. Em particular, as declarações de função são prefixadas com a palavra-chave
fun
se eles aceitarem algum argumento e a palavra- chave se não aceitaremval
. Também é possível ter uma expressão no nível superior (significando que não está em nenhuma declaração) que é executada quando o programa é executado. (Em Haskell, escrever1+2
fora de uma declaração gera umnaked expression at top level
erro). Finalmente, o símbolo para testar a igualdade está no=
lugar de==
Haskell. (Existem muitas outras diferenças, mas essas são as únicas que importam para este programa.)Portanto, o SML vê duas declarações
seguido por uma expressão
que é então avaliado. Para determinar se
main
iguaisputStr"trick"
, ambos os lados devem ser avaliados e ambos devem ter o mesmo tipo, pois SML (assim como Haskell) é estaticamente tipado. Vamos primeiro dar uma olhada no lado direito:putStr
não é uma função de biblioteca no SML, mas declaramos uma função nomeadaputStr
na linhafun putStr x=print"treat";
- ela recebe um argumentox
(esta é a string"trick"
no nosso caso) e a esquece imediatamente novamente, pois não ocorre no corpo da função. Em seguida,print"treat"
é executado o corpo que imprimetreat
(sem anexar"
, os SMLsprint
são diferentes dos de Haskellprint
).print
tem o tipostring -> unit
, entãoputStr
tem o tipoa -> unit
e, portanto,putStr"trick"
tem apenas o tipounit
. Para ser bem digitado, tambémmain
deve ter o tipounit
. O valor da unidade é no SML o mesmo que no Haskell()
, por isso declaramosval main=();
e tudo está bem digitado.Experimente no codingground.
Nota: A saída no console é
porque em SML \ NJ, o valor e o tipo de cada instrução são exibidos após cada declaração. Então, primeiro os tipos
putStr
emain
são mostrados, depois as expressões são avaliadas fazendotreat
com que sejam impressas, então o valor da expressão (true
como ambos os lados=
são()
) é vinculado à variável implícita do resultadoit
que também é exibida.fonte
fun ... ... =
era açúcar sintáticoval rec ... = fn ... =>
. Mas, novamente, faz décadas desde que eu usei ML.fun
é um açúcar sintático para funções anônimas vinculadas aval
(rec
só é necessário se a função for recursiva) e, portanto, a formulação "deve ser prefixada" é mal escolhida, editarei a resposta. Em geral, o usofun
é uma prática recomendada, especialmente no código de golfe, pois é muito mais curto.Ruby / C,
64625148 bytesO que Ruby vê:
O
tap
método pega um bloco e o executa uma vez. É um identificador curto para o qual podemos criar uma#define
macro em C. Ele também nos permite colocar um bloco entre chaves no código compartilhado, mesmo que Ruby não permita{}
s na maioria dos contextos.Os únicos valores falsos em Ruby são
false
enil
. Em particular, 0 é verdade. Assim, Ruby imprimirá "truque".O que C vê (depois do pré-processador):
0 é falso em C, então C imprimirá "tratar".
2 bytes salvos graças a daniero.
fonte
puts
vez deprintf
salvar dois bytes #printf
em C, esqueci que ele também tem umaputs
função.tap
? E por que você não se livrou dos espaços?p ? "trick":"treat"
=>p?"trick":"treat"
tap
na verdade, serve a dois propósitos. É um identificador curto para o qual#define
se agarrar, mas também me permite colocar as chaves diretamente no código Ruby.{}
blocos em Ruby não funcionam como fazem em C e idiomas semelhantes, mastap
faz exame de um bloco, e executa-lo uma vez.p
.?<character>
é um caractere literal, portanto, é necessário um espaço após o?
.QBasic / JavaScript,
5144 bytesNo QBasic, ele imprime a segunda linha e não executa a primeira porque acredita-se ser um comentário (obrigado). No JS, ele chama a função PRINT, que é definida na primeira linha, logo após o JS NOP
'';
.fonte
ShapeScript / Foo , 13 bytes
Experimente online! truque | tratar
Como funciona
O ShapeScript é analisado caractere por caractere. Quando o EOF é atingido sem encontrar uma cotação de fechamento, nada é empurrado na pilha.
'trick'
empurra a string dentro das aspas, que é impressa em STDOUT implicitamente.Foo não possui nenhum comando atribuído aos caracteres
'trick'
, portanto essa parte é ignorada silenciosamente. No entanto, imprime qualquer coisa entre aspas duplas imediatamente para STDOUT, mesmo se a cotação de fechamento estiver ausente.fonte
Ruby / Perl, 21 bytes
Perl
Calcula
"trick" % 1
qual é0 % 1
assim que o||
enviatreat
aoprint
invés, já que Perl aceita barewords.Rubi
Formata a string
"trick"
com o argumento1
, o que resulta em"trick"
que é verdade, para que||
não seja processado.fonte
MATL / CJam , 17 bytes
Em MATL isso gera
TRICK
. No CJam, ele geraTREAT
.Explicação
MATL
CJam
fonte
Gelatina / pl , 12 bytes
Este é o programa exibido na página de códigos de Jelly .
Experimente online!
Este é o programa exibido na página de códigos 437 .
Experimente online!
Ambos os programas foram testados localmente com o mesmo arquivo de 12 bytes, portanto, este é um poliglota adequado.
Como funciona
No Jelly, toda linha define um link (função); a última linha define o link principal , que é executado automaticamente quando o programa é executado. A menos que o código antes do último
7f
byte (o avanço de linha na página de códigos do Jelly) contenha um erro do analisador (que interromperia a execução imediatamente), eles são simplesmente ignorados. A última linha,“¡ṾI»
simplesmente indexa no dicionário de Jelly para buscar a palavra truque , que é impressa implicitamente no final do programa.Não sei muito sobre pl, mas parece que o intérprete busca apenas uma linha de código e ignora tudo o que vem depois dela. Como no Perl, as palavras de bar são tratadas como seqüências de caracteres, então
treat
imprime exatamente isso.fonte
Objective-C / C, 50 bytes
Objective-C tem doces e estampas deliciosas , mas C não gosta e estampas .
Como funciona
Não sei muito sobre o Objective-C , mas faz o que esperávamos razoavelmente nessa situação. A redefinição de
puts
não afeta a saída, pois nunca chamamos a função e asmain
impressões tratam e um avanço de linha para STDOUT.Você pode esperar C faça o mesmo, mas pelo menos o gcc 4.8, o gcc 5.3 e o clang 3.7 não.
Como não precisamos do printf real (que recebe uma sequência de caracteres de formato e argumentos adicionais) e a sequência a ser impressa termina com um avanço de linha, podemos usar put em vez disso. put é um pouco mais rápido que printf (que precisa analisar seus argumentos antes de imprimir), portanto, a menos que redefinamos a função printf , o compilador otimiza e substitui a chamada para printf por uma chamada para put . Mal sabe o compilador que chamar com argumento irá imprimir truques !
puts
"treat"
Não incluir stdio.h é crucial aqui, pois a definição de putaria exigiria o mesmo tipo de arquivo no cabeçalho (
puts(const char*)
).Finalmente, é de salientar que a chamada para printf em puts passa uma corda sem um avanço de linha final. Caso contrário, o compilador "otimizará" essa chamada também, resultando em uma falha de segmentação.
fonte
Lote / sh, 30 bytes
Explicação. O lote vê a primeira linha como um rótulo, que ele ignora, e executa a segunda linha, que imprime Truque. O @ suprime o eco padrão do lote do comando para stdout. (As etiquetas nunca ecoam.) Enquanto isso, sh vê o seguinte:
A primeira linha não faz nada (é um apelido de
true
), a segunda linha imprime Treat e a terceira linha sai do script, para que o @echo Trick nunca seja alcançado.fonte
sed / Hexagony 32 bytes
sed
Experimente Online!
A primeira linha imprime
trick
se houver uma sequência vazia no final da entrada. (sed não faz nada se não houver entrada, mas uma linha em branco no stdin é permitida neste caso)Exemplo de execução:
Hexagonia
Experimente Online!
O primeiro
/
redireciona o ponteiro de instruções para cima e para a esquerda, de modo que envolve o canto inferior esquerdo, pulando o texto usado para sed. Ele reutiliza or do código sed e executa alguns outros sem nenhum efeito. O hex expandido é assim:Resultado:
fonte
A
letra maiúscula , embora você pudesse tornar isso menos feio alterando todas as letras para maiúsculas): hexagony.tryitonline.net/…C # / Java
Isso provavelmente não se qualifica, pois não é executado por conta própria, mas o desafio me lembrou uma peculiaridade de como C # e Java lidam com a comparação de strings de maneira diferente com a qual você pode se divertir com a ofuscação do código.
A função a seguir é válida em C # e Java, mas retornará um valor diferente ...
fonte
Brain-Flak / Brain-Flueue, 265253
219 165 139 115 113101 bytesInclui +1 para
-A
Agradeço ao Wheat Wizard por ir e voltar, jogando alguns bytes do código um do outro comigo.
Brain-Flak: Experimente online!
Brain-Flueue: Experimente online!
Explicação:
A primeira seção lista os valores que o Brain-Flak vê.
Quando muda para o Brain-Flueue, começo a listar os valores como o Brain-Flueue os vê.
fonte
PowerShell / Foo, 14 bytes
O
'trick'
PowerShell cria uma string e a deixa no pipeline. Ele#
inicia um comentário, para que o programa seja concluído e asWrite-Output
impressões implícitastrick
.Em Foo, (Experimente Online!) , O
'trick'
é ignorado,#
faz com que o programa durma por0
segundos (já que não há nada no ponteiro da matriz) e"treat
inicia uma sequência. Desde que o EOF é alcançado, há um implícito"
para fechar a sequência, e isso é impresso em stdout.fonte
#
é a função de cópia e leva apenas argumentos à esquerda complexos e não negativos, não seqüências de caracteres. O símbolo do comentário éNB.
#
PHP / Perl, 28 bytes
defined&x
dá algo verdadeiro em PHP (não faço ideia do porquê, mas faz).
No Perl, verifica se a função
x
está definida - o que não é.->
trick
em PHP,treat
em Perl.fonte
CLS
?`
é o valor truthy de & x definidos ou d & x me perguntam não o que d você começa