Não é chato quando você encontra um pedaço de código e não sabe em que idioma ele foi escrito? Este desafio tenta resolver um pouco isso.
Desafio
Você precisará escrever um programa que, quando executado em dois idiomas diferentes, produzirá a string:
This program wasn't written in <language program compiled/interpreted in>, it was built for <other language the program can be run in>!
Na saída, os nomes de idiomas devem ter letras maiúsculas oficiais. por exemplo: CJam, C ++
Nenhum dos programas deve receber nenhuma entrada do usuário.
Quando executado nos dois idiomas, a saída deve ser stdout ou equivalente.
Não deve haver saída para stderr em nenhum dos programas.
Você pode usar comentários em qualquer idioma.
Duas versões diferentes do mesmo idioma contam como idiomas diferentes.
Se isso for feito, o programa deverá gerar o número da versão principal e, se estiver executando em duas versões secundárias diferentes, também deverá reportar a versão secundária.
Você não deve usar funções de versão pré-construídas (isso inclui variáveis que já foram avaliadas em tempo de execução).
Exemplo de saída:
Perl e Ruby:
Perl:
This program wasn't written in Perl, it was built for Ruby!
Rubi:
This program wasn't written in Ruby, it was built for Perl!
Python e C:
Pitão:
This program wasn't written in Python, it was built for C!
C:
This program wasn't written in C, it was built for Python!
Python 2 e Python 3:
Python 2:
This program wasn't written in Python 2, it was built for Python 3!
Python 3:
This program wasn't written in Python 3, it was built for Python 2!
Python 2.4 e Python 2.7:
Python 2.4:
This program wasn't written in Python 2.4, it was built for Python 2.7!
Python 2.7:
This program wasn't written in Python 2.7, it was built for Python 2.4!
Esse é o código golf, portanto o código mais curto em bytes vence.
argv[0]
?Respostas:
Foo / CJam, 70 bytes
Em Foo, como muitos descobriram, ele apenas imprime tudo entre aspas duplas e ignora a maioria dos outros caracteres ou faz algo que não afeta a saída na maioria dos casos. Em resumo,
\@
não faz nada e as seqüências de caracteres são todas impressas como estão.No CJam, alterna
\
os dois itens superiores e@
move o terceiro item para o topo, que organiza as seqüências na ordem correta. E depois que o programa termina, tudo o que resta na pilha é automaticamente impresso.fonte
R"This program wasn't written in ""Fission"", it was built for ""CJam"\@'!O
"This program wasn't written in Clip, it was built for CJam!"3{4-_36+e\}/
para o Clip / CJam.C89 / C99,
171152136114111107105 bytesObrigado em @Hurkyls, @Qwertiys, @ jimmy23013 e @MD XF por suas dicas.
versão golfed:
versão não destruída:
Pouca descrição:
Versões C, C99 anterior, tiveram o comentário multilinha assim:
com C99, o comentário de linha única foi introduzido. como isso:
portanto, se você compilar uma linha como esta:
o código relacionado à compilação do compilador c99 seria:
enquanto o código relevante para o compilador c89 seria:
(como o primeiro
/
não faz parte de um comentário e, portanto, o trata como operador)fonte
//**/
. Em C89, esse é o operador de divisão seguido por um comentário vazio. Em C99,//
inicia um comentário de linha única, para que o restante da linha fique em branco. Portanto, em C89, torna-se(90-(-4.5/-4.5))
, o que é de 89, enquanto em C99, torna-se(90-(-4.5-4.5))
, que é 99.188-c
vez dec==99?89:99
.JavaScript / Ruby, 170 bytes
Pode ser apenas o 2.0, não parece funcionar em pelo menos 2.1.5 ... Edit: Atualizações de acordo com o conselho do @Jordan, espero que funcione em mais algumas versões agora!
Abusa o
~
operador em que Ruby tratará=~
como uma correspondência de regex, retornando a posição da primeira correspondência na string (0
), mas o JavaScript a tratará como=
~/1/
qual é-1
(já que/1/
é convertidaNaN
em operações numéricas, que tem0
valor).fonte
NoMethodError: undefined method `log' for :log:Symbol
eval
está retornando:log
. Eu acho que você poderia consertar colocando;c
depoisend
. O=~
/= ~
truque é ótimo!$><<s
vez deputs s
e usando aspas duplas para que você possa soltar a barra invertidawasn\'t
.\'
aspas duplas e$><<
significa que posso aplicar a correção mencionada e manter a mesma contagem de bytes!Python 2 / Python 3, 92
Usa a verificação de versão "padrão" do Python (divisão de número inteiro vs. divisão flutuante).
fonte
Pesca / > <>
233217 bytesA pesca é uma língua baseada em um pescador andando por aí pescando. Para criar um programa nesse idioma, primeiro é necessário definir uma doca na qual ele anda. O encaixe fornece apenas o fluxo de controle para um programa. A doca neste programa é:
Sempre que o
C
comando é encontrado, o pescador joga sua linha para pegar uma instrução. As instruções+
e-
diminuem e aumentam o comprimento de sua linha, respectivamente.v
muda sua direção de lançamento para baixo. Os peixes que ele captura neste programa são:> <> é uma linguagem baseada em um peixe que se move pela água. O
v
comando inicia o peixe se movendo para baixo, onde é refletido à direita com o\
comando. Tudo entre aspas é colocado na pilha. Depois que a corda é empurrada para a pilha, o peixe passa para o outro lado, onde é refletido para baixo\
. Em seguida, imprime o conteúdo da pilha com:fonte
23 / Malbolge, 5688 bytes
Observe que o programa requer um avanço de linha à direita. Nenhuma linha contém espaços em branco à direita; portanto, copiar / colar deve funcionar perfeitamente.
Verificação
Para testar o código Malbolge neste intérprete online , cole-o na área de código Malbolge e clique Load/Resetem Execute.
Para testar o código 23 neste intérprete online , cole-o na área Origem , pressione Enterpara inserir o avanço de linha à direita, digite
23
na área Console (para alternar da notação 23.dezsy padrão para a detecção automática) e clique em Run Interpreter!.fonte
Lua / C -
182164 bytesAproveita o recurso em que Lua trata uma marca de hash na primeira linha como um comentário para permitir shebangs do Unix. Caso contrário, agrupa os comentários do outro idioma em seus próprios comentários.
Para barbear bytes, confio no comportamento implícito que emite apenas avisos no GCC e Clang: declaração implícita de int para a definição principal e implícita de printf.
fonte
//
comentário na parte C? Salva 2 bytes.JavaScript / Haskell,
158 bytes147 bytesIdeia geral: esgueirar a sintaxe do comentário de cada um para o outro.
Em uma linha:
Como isso se parece com Haskell:
Como é o JavaScript:
fonte
alert
é golfista.Brainfuck / Foo, 769 bytes
Uma resposta extremamente intrincada e complexa ... ou não.
fonte
,
ao texto no final. Eu acredito que isso vai contra as regras de atribuição.,
apenas define celular a 0, para EOFC / Python, 238 caracteres
Isso não imprime 100% exatamente o que é solicitado, mas é bem próximo.
Uma reinicialização do meu cartão de dia dos namorados .
fonte
def
e:
depoisdef main()
, e na verdade você não abre um corpo de função para main. Você realmente tentou compilar sua resposta em C?#define def main(){0?
está faltando#define return
me faz chorar um pouco ...C / C ++, 136
Novas linhas adicionadas para formatação. Experimente em C ou C ++ .
fonte
struct{}s;z=2*sizeof s
Befunge / > <> ,
141138134133130 bytes3 bytes salvos graças a @Cole .
Para ser exato, estou usando o Befunge-98.
Usando os fatos que:
\
é um espelho em> <> e troca no Befunge'string'
é uma string em> <> e'c
é um caractere no Befungefonte
?!;>ol
PHP / MySQL, 147 bytes
fonte
SELECT"This program wasn't written in MySQL, it was built for PHP!";
Python 3 / > <> ,
177173172167 BytesObrigado a @mathmandan por remover 5 bytes de distância!
Bem, essa foi uma experiência e também uma tentativa. Todas as sugestões de golfe são bem-vindas, pois isso é bastante longo. Eu tentei o meu melhor para reutilizar o texto, mas foi bastante difícil.
Tecnicamente, seria o Python 3 que esse programa deveria produzir (e eu poderia mudar isso se não atender às especificações - mas no exemplo a saída do Python / C
Python
foi listada).Experimente em um intérprete on - line> <> e um intérprete Python 3 (o intérprete > <> requer que você insira o código manualmente)
Devoluções
em> <> e
em Python.
Explicação (Python)
Para o lado Python, é bem simples. Aqui está o código com o qual nos preocupamos (basicamente o código sem comentários, que é indicado por um
#
em Python). Observe que no Python\
é um caractere de escape quando usado em strings, portanto, é\"
avaliado como"
na string.O que mais nos interessa aqui são as operações executadas na variável
aa
:A declaração de impressão é avaliada como
Explicação (> <>)
Agora chegamos à parte mais difícil. Mais uma vez, aqui está o código com os bits desnecessários removidos.
Linha 1:
A pilha agora (se impressa):
\This program wasn't written in
Linha 2:
Observe que a linha 2 começa com a
/
posição do ponteiro da linha 1 e se move da direita para a esquerda.A pilha agora:
><> ni nettirw t'nsaw margorp sihT
Linha 3:
Como a linha anterior, esta começa na
\
, onde é a linha 2 que envia o ponteiro. Observe que, como o ponteiro passa pela linha quando atinge o primeiro,a
escreverei minha explicação na ordem em que o ponteiro vai (e, portanto, o que é executado)A pilha agora (
x
é o personagem formado pela adição de "r" e um espaço. - não é o personagem real, apenas um espaço reservado meu):xof tliub saw ti ,><> ni nettirw t'nsaw margorp sihT
Linha 4:
O ponteiro simplesmente continua para baixo, portanto essa linha não garante mais explicações.
Linha 5:
Começando
/
e indo para a esquerda.A pilha agora (a saída invertida):
!nohtyP rof tliub saw ti ,><> ni nettirw t'nsaw margorp sihT
E deve ser isso para a explicação. Deixe-me saber se há alguma inconsistência entre a explicação / código ou se fiz algo errado; Joguei meu código um pouco mais enquanto escrevia a explicação, para que eu pudesse misturar pedaços de código antigo e novo.
fonte
aa[:-2][::-1]
poraa[-3::-1]
. Nesse caso, é claro, isso pode interferir na formatação> <>, mas talvez valha a pena considerar se você ainda não o fez. Em particular, tenho certeza de que você precisa de um espaço abaixo dov
na linha anterior, mas parece queprint(aa[-3::-1]+"Pytho"
ele se encaixaria nos 24 caracteres abaixoa=", it was built for "+
e, em seguida, você poderia colocar um espaço seguido por+"n"+a)
. Não tenho certeza se isso quebraria outra coisa, mas se funcionar, ele salvará alguns bytes.print aa[-3::-1]+"Pytho" +"n"+a
. Mais uma pergunta: na versão> <>, o que acontece com o1
que foi originalmente colocado na pilha?Arquivo .BAT em lote / arquivo .CMD em lote,
194185 BytesEditar: salvou 9 bytes e corrigiu um erro ausente
!
graças ao DLoscSim, há diferenças entre os arquivos BAT e CMD. Referência. Essencialmente, o CMD define o comando
ERRORLEVEL
onSET
, enquanto o BAT não, o que significa que aqui oERRORLEVEL
conjunto domd
comando malformado é limpo peloSET v=1
em uma versão, mas não na outra. Este script é baseado no exemplo fornecido por "Ritchie" nesse segmento de grupo de notícias.Observe que o script abreviado acima pressupõe
ENABLEEXTENSIONS
a configuraçãoON
(por padrão em todas as plataformas). O script expandido abaixo o define explicitamente, para garantir a funcionalidade correta. Sem isso, oSET
comando do CMD não permite todas as extensões e (em alguns sistemas, talvez) pode não definir oERRORLEVEL
apropriado.Expandido e comentado
fonte
Javascript / C,
148146143 caracteresC:
http://codepad.org/u8UimGLchttp://codepad.org/Y80M5jpchttp://codepad.org/m4DB2NddJavascript: basta copiar o código no console do navegador
fonte
CJam / GolfScript,
8178 bytesVersão original de 81 bytes:
fonte
PHP / Perl,
9896 bytesNão sei se isso é trapaça ou não, já que, até onde eu sei, é a única maneira de executar o PHP sem abrir
<?
tag de é algo parecidophp -r $(cat codefile.php)
. Mas assumindo que isso é legal ...//
é um comentário do PHP, mas no Perl é um regex (que, em uma declaração por si só, não faz nada). O resto deve ser bastante auto-explicativo.Edit: Agora, usando uma palavra de barra na parte somente Perl. Eu queria usá-los em primeiro lugar para os dois idiomas, mas o PHP exibe um aviso quando você faz isso, ao contrário de "Não deve haver saída para o stderr".
fonte
<?'>#';
é uma sintaxe válida nos dois idiomas.Ruby / Python, 105 caracteres
fonte
JavaScript 1.8 / JavaScript 1.7, 89 bytes
Porque Array.prototype.reduce é novo no 1.8
EDIT: Golfed out 7 bytes inicializando diretamente em
a
vez de usarreverse()
EDIT:
JavaScript
pode ser escrito comoJS
, economizando 8 bytesEDIT: Graças Hedi por apontar que eu posso salvar mais 3 bytes se eu não usar a variável
b
maisEDIT: Golfed out 6 bytes pela computação
7+a
e8-a
, ondea=1
se reduzir está definido (JS 1.8) ea=0
se não está definido (JS 1.7)EDIT: Hedi obteve mais 6 bytes, sugerindo o uso da string de modelo
EDIT: ETHproductions obteve 2 bytes, sugerindo em
a=!![].reduce;
vez dea=[].reduce?1:0;
EDIT: no1xsyzy obteve mais um byte sugerindo reverter a verificação booleana
fonte
a=[].reduce?1:0;
paraa=!![].reduce;
.a
manter o valor1
ou0
, nãotrue
oufalse
SWI-Prolog 6 / SWI-Prolog 7, 156 bytes
Usa o fato de que aspas duplas
""
são códigos de string (ou seja, lista de códigos de caracteres) nas versões SWI-Prolog anteriores a 7 e são um tipo de String adequado na versão 7.is_list("")
, portanto, serão falsas na versão 7 e verdadeiras nas versões anteriores.fonte
BF / SPL, 5342 bytes
Tenho certeza de que este é o primeiro poliglota da linguagem de programação de Shakespeare neste site.
Provavelmente não vai ganhar nenhum prêmio. Funciona inserindo código BF em títulos de ato / cena / programa. O código SPL usa pontos de exclamação em vez de pontos, exceto em alguns casos. Os programas não devem receber entrada; portanto, as vírgulas nas declarações de caracteres são "comentadas" zerando as células e colocando colchetes entre as vírgulas. O mesmo procedimento se aplica ao ocultar os colchetes ao redor das instruções enter / exeunt.
Teste o BF em https://repl.it/E8Hh/23 .
O código SPL foi testado no compilador encontrado aqui: https://github.com/drsam94/Spl/ .
fonte
Ruby 1.8 / Ruby 1.9, 87
No Ruby 1.8,
?9
é o valor ASCII de "9", que é 8 módulo 49. No Ruby 1.9, é a string "9" e%49
é uma operação de formatação que não faz nada, já que "9" não possui nenhuma string de formato em isto.fonte
Python 2.7.9 / Python 2.7.10, 127 bytes
Tivemos algumas postagens que usavam versões menores, mas nenhuma que foi para o próximo nível abaixo ...
Experimente no Ideone (Python 2.7.10) e repl.it (tecnicamente Python 2.7.2, mas deve fornecer o mesmo resultado que o 2.7.9).
Python 2.7.10, de acordo com o changelog :
Isso passou
len(dir(types))
de 42 para 43, dando uma diferença numérica que podemos explorar para gerar a saída desejada.fonte
Python / QBasic,
160142 bytesTestado com Python 3 e QBasic 1.1 . Não funcionará no Python 2 sem adicionar
from __future__ import print_function
à linha 4.1#
é a expressão1
(no-op) seguida por um comentário. No QBasic, é um número de linha (com o sufixo do tipo marcando-o como aDOUBLE
). ADEFSTR
instrução informa ao QBasic que todas as variáveis cujos nomes começam comA
ouB
(sem distinção entre maiúsculas e minúsculas) são variáveis de seqüência de caracteres. Dessa forma, podemos chamar nossas variáveisa
e, emb
vez dea$
eb$
(que não funcionaria em Python).'
começa um comentário. Em Python,''
é a string vazia (no-op). Em seguida, trocamos os nomes dos idiomas e definimos um alias para aprint
função (pois as palavras-chave QBasic são formatadas automaticamente para maiúsculas).Se eu puder desativar o autoformatter (que é uma opção no QB64 , embora não no QBasic original), eu posso reduzi-lo para 114 bytes usando o Python 2 :
fonte
Perl / Ruby, 129 bytes
Não há abuso de expressão regular neste, apenas aproveitando ao máximo o fato de que 0 é verdade em Ruby para
eval
uma definição parasort
(que realmentereverse
é) eprintf
ing. Ruby não gostou de usar a lista para os argumentos, então eu tive que fazer cada um individualmente.fonte
a
tem que ser uma variável de instância, em oposição a uma local?@
sigil em uma variável no Perl indica que é uma lista, no Perl armazenando, digamos$a
, não produz saída./// e Retina , 95 + 3 = 98 bytes
+3 bytes para o
-s
sinalizador na Retina.Explicação para ///
A primeira instrução é
remove todas as novas linhas do restante do código, resultando em
Tudo até o
!
final é apenas um literal e impresso para STDOUT. A próxima instrução éMas a cadeia de pesquisa
?.
não pode ser encontrada, então nada acontece. Então o código restante//!
é uma instrução incompleta para que o programa termine, depois de imprimir a sequência correta.Explicação para Retina
Isto diz Retina para substituir
/
com//
. Mas a entrada está vazia, então isso não corresponde a nada.Isso substitui a entrada pela string na segunda linha.
Isso corresponde à string
\/\/\/, it was built for Retina!
e a substitui porRetina, it was built for ///!
para fornecer o resultado correto.fonte
-s
, embora dizer o que fiz estragaria a diversão! : Dsed / Hexagony 251 bytes
sed: Experimente online!
Hexagonia: Experimente Online!
No sed, ele imprime a sequência correta se corresponder à sequência vazia no final (sempre). A segunda linha é um comentário. Isso requer uma string no STDIN, mas pode estar vazia ( permitida com base nesse consenso ).
Exemplo:
No Hexagony, o primeiro
/
redireciona para o canto inferior esquerdo, segue o lado esquerdo até o início da parte sed e, em seguida, apenas envolve da esquerda para a direita, em uma linha, da direita para a esquerda, em uma linha e assim por diante. O hex expandido é assim:fonte
;
necessário o mod atual da célula 256 para determinar um valor de byte (por exemplo, você pode imprimir um espaçoP0;
independentemente do valor atual da célula). Este script CJam gera todos os pares: cjam.tryitonline.net/…Python / Retina,
133120119117115 bytesAgora que sei mais sobre Retina e regexes, joguei um pouco mais. Na verdade, também funciona agora.
Python apenas imprime a declaração. O Retina substitui qualquer coisa pela instrução de impressão Python e remove as
print
cotações. Então, eu trocarPython
eRetina
e retire a#
.Experimente em Python | Experimente na Retina
fonte
JavaScript / CoffeeScript,
125124 bytesNo CoffeeScript,
a==b
é compilado atéa===b
, o que torna a condição intermediária falsa. Usei um pouco de mágica para converter o valor booleano em um número inteiro.Guardado 1 byte graças a @DomHastings!
Versão de 125 bytes:
fonte
+(b=0=='0')
vez de+0
!b^1
, eu acho que você pode usar~b
undefinedScript
.~1 == -2
. Mas(b=0=='0')+0
pode ser escrito como+(b=0=='0')
. Orb=+(0=='0')
. Isso deve cortar 1 byte.