Seu desafio é escrever um poliglota que funcione em diferentes versões do seu idioma. Quando executado, sempre gera a versão do idioma.
Regras
- Seu programa deve funcionar em pelo menos duas versões do seu idioma.
- A saída do seu programa deve ser apenas o número da versão. Sem dados estranhos.
- Seu programa pode usar qualquer método que você desejar para determinar o número da versão. No entanto, a saída deve seguir a regra 2; no entanto, você determina o número da versão, a saída deve ser apenas o número.
- Seu programa precisa apenas produzir a versão principal do idioma. Por exemplo, no FooBar 12.3.456789-beta, seu programa precisaria apenas produzir 12.
- Se o seu idioma colocar palavras ou símbolos antes ou depois do número da versão, você não precisará apresentá-los, e apenas o número. Por exemplo, em C89, seu programa só precisa imprimir
89
e, em C ++ 0x, seu programa só precisa imprimir0
. - Se você optar por imprimir o nome completo ou os números de versão secundários, por exemplo, C89 em vez de C99, ele deverá imprimir apenas o nome.
C89 build 32
é válido, enquantoerror in C89 build 32: foo bar
não é. - Seu programa não pode usar sinalizadores de compilador internos, macro ou personalizados para determinar a versão do idioma.
Pontuação
Sua pontuação será o tamanho do código dividido pelo número de versões em que funciona. A pontuação mais baixa vence, boa sorte!
code-golf
code-challenge
polyglot
MD XF
fonte
fonte
(number of languages)^3 / (byte count)
.Respostas:
Sério e Realmente , 3 bytes, pontuação 1.5
Experimente on-line: na verdade , sério
Explicação:
u
eD
ter funcionalidade nas strings foi adicionado apenas no Actually (que é seriamente v2).fonte
v1
ramificação. Antes de ser seriamente reprovado, residia nav2
filial. Além disso, os1.x
números de versão usados seriamente nos lançamentos , enquanto o Na verdade usa2.x
(tanto lá quanto no PyPI ).Python 3.0 e Python 2, pontuação 6
(12 bytes, 2 versões)
Experimente on-line:
Python 2
Python 3
Confia no fato de que o Python 3+ usa a divisão de flutuação por padrão, diferente do Python 2, que usa a divisão de piso.
fonte
Your program should work in at least two versions of your language.
Funciona em pelo menos duas versões 2.7 e 3.0. Eu escolhito print the full name or minor version numbers
.from __future__ import division
, problem resolve :)Java, 189 bytes, 10 versões, pontuação = 18,9
As versões suportadas:
1.0
,1.1
,1.2
,1.3
,1.4
,1.5
,1.6
,1.7
,1.8
e9
(Para pontuações anteriores, verifique o histórico !)
Execute-o no Java 8
Execute-o no Java 9 ou posterior
Ungolfed
Observe que a parte do código
return v<9?"1."+v:v;
(anteriormentereturn(v<9?"1.":"")+v;
) precisa ser verificada em qualquer versão entre Java 1.0 e Java 1.3 incluído. Não tenho nenhuma instalação do Java 1.3 ou anterior à disposição para testar essa sintaxe.Introdução
O controle de versão Java tem um histórico especial. Todas as versões foram historicamente
1.x
incluídas1.0
. Mas ... a partir do Java 9 em diante e do JEP223 , o esquema da versão mudou de usado1.x
parax
. Essa é a versão como conhecida internamente. Portanto, temos a seguinte tabela (junto com o Javadoc e a Wikipedia ):Esta entrada de desafio corresponde à coluna da versão na tabela acima, que é o que está contido na propriedade do sistema
"java.version"
.Explicação
O objetivo é verificar a partir de qual versão uma classe começa a existir, porque o Java reprova o código, mas nunca o remove. O código foi escrito especificamente em Java 1.0 para ser compatível com todas as versões, novamente, porque o JDK é (principalmente) compatível com o encaminhamento de origem .
A implementação tenta encontrar os nomes mais curtos de classe que cada versão introduzida. Porém, para obter bytes, é necessário tentar escolher um subpacote comum. Até agora, achei o pacote mais eficiente
java.util
porque ele contém várias classes de nome curto, espalhadas por todas as versões do Java.Agora, para encontrar o número da versão real, os nomes das classes são classificados introduzindo a versão. Em seguida, tento instanciar cada classe sequencialmente e incrementar o índice da matriz. Se a classe existir, pularemos para a próxima, caso contrário, deixamos a exceção ser capturada pelo
try
bloco. Quando concluído, outra exceção é lançada porque não há mais classes cuja existência precisamos verificar.De qualquer forma, o encadeamento deixará o
try
bloco com uma exceção. Essa exceção não é capturada, mas simplesmente retida graças aofinally
bloco, que, por sua vez, substitui a exceção retida na verdade, retornando um valor que é"1."+v
ondev
está o índice usado anteriormente. Também acontece que fizemos esse índice corresponder ao número da versão secundária do Java.Uma parte importante do golfe foi encontrar o novo nome de classe mais curto no pacote
java.util
(ou qualquer pacote filho) para cada versão. Aqui está a tabela que eu usei para calcular esse custo.Créditos
-boxpensamento -tentar-catch!finally
truque portátil .return(i<9?"1.":"")+i;
porreturn i<9?"1."+i:i;
(isso precisa ser validado com relação a 1,0 ou no máximo 1,3, pois nenhuma alteração de sintaxe ocorreu antes da versão 1.4)With builtins
Se builtins fossem permitidos:
54 bytes para 13 versões (de 1,0 a 12), portanto a pontuação seria 4,1538.
fonte
return"...
sem espaço é possível em todas as versões TBH).String v(){return "1."+(e("time.Year")+e("nio.file.Path")+e("io.Console")+e("util.UUID")+e("text.Bidi")+e("util.Timer")+e("sql.Ref")+e("lang.Void"));}int e(String c){try{Class.forName("java."+c);return 1;}catch(Exception e){return 0;}}
String v(){int i=0;try{for(String[]s={"lang.Void","sql.Ref","util.Timer","net.URI","util.UUID","net.IDN","nio.file.Path","time.Year","lang.Module"};;i++)Class.forName("java."+s[i]);}catch(Exception e){}return"1."+i;}
finally{return"1."+i;}
.Python , 606 bytes / 15 versões = pontuação 40.4
-67 bytes (lol) graças a NoOneIsHere.
As versões são 0.9.1, 2 (.0), 2.2, 2.2.2, 2.5.0, 2.5.1, 3 (.0), 3.1, 3.1.3, 3.2.1, 3.3, 3.4, 3.5 aa e 3.6 .
Todo o crédito à incrível resposta do Sp3000 . A nova linha à direita é necessária.
Foi divertido jogar golfe. Isso deve funcionar (sim, eu instalei cada uma dessas versões), mas posso ter acidentalmente causado algo. Se alguém encontrar um bug, entre em contato.
fonte
print'0.9.1'
sintaxe inválida.print
chamadas ... Obrigado por me avisar!except
s porexcept:
).x=<string inside eval>
vez de apenas avaliar o código manualmente?1/0
, mas então percebi. Obrigado!C ++ 14/11/17, pontuação = 147/3 = 49
Para distinguir entre C ++ 11 e C ++ 14/17, ele usa a alteração no padrão
const
deconstexpr
funções-membro no C ++ 14 (com crédito para o exemplo em https://stackoverflow.com/questions/23980929/ o que muda-introduzido-em-c14-pode-potencialmente-quebrar-um-programa-escrito-em-c1 ). Para distinguir entre C ++ 14 e C ++ 17, ele usa o fato de que o C ++ 17 desativou os trigramas.Ungolfed:
(Testado com o Debian gcc 7.1.0 usando
-std=c++{11,14,17}
.)fonte
include
e o<
nas instruções de inclusão, por exemplo#include<iostream>
.__cplusplus
macro) - para distinguir C ++ 17 de C ++ 14, eu me inclinaria a usar a alteração no intervalo baseado em para semântica. Talvez crie classes mínimas de iterador / sentinela ao longo das linhas paraboost::integer_iterator
que a conversão de sentinel em iterador tenha um comportamento "surpreendente".return 0;
está implícito paramain
que você possa salvar 9 bytes lá. Também de acordo com awc -c
sua solução, você está usando 251 bytes e não 252 (seu editor pode ter inserido uma nova linha no final).return *
=>return*
EcmaScript 3/5/2015 / 2016/2017 no navegador, 59 bytes / 5 versões = 11,8 pontos
Economize 1 byte graças ao GOTO 0
fonte
-!
vez de+!!
onde faz sentido (e alterar as constantes numéricas de acordo).JavaScript (ES5 e ES6), 14 bytes / 2 versões = 7
0o
constantes octais de estilo são novas no ES6; O ES5 lança a sequência naNaN
qual não afeta o resultado do XOR bit a bit.fonte
JavaScript (ES 2, 3 e 5 -
89),59/6 = 9.83375/7 = 10.714Também pode enviar a solução com mais versões, mesmo que a pontuação seja ligeiramente superior à solução de 2 versões.
Experimente online
Verifica a presença de vários métodos nos protótipos Array, RegExp & String, os nega, fornecendo um booleano e subtrai esse booleano de um valor inicial de 9. A multiplicação de
![].map
contas pelo fato de o ES4 ter sido abandonado.dotAll
propriedade (e os
sinalizador relacionado ) para Expressões regulares foi introduzida no ES2018 (v9).padEnd
método String foi introduzido no ES2017 (v8).includes
método Array foi introduzido no ES2016 (v7).keys
método Array foi introduzido no ES2015 (v6).map
método Array foi introduzido no ES5.1 (v5).pop
método Array foi introduzido no ES3 (v3).fonte
PHP 5/7, pontuação 5,5
3V4L-lo online!
PHP 5.3.9 / 5.3.11, pontuação 10
3V4L-lo online!
A versão online é mais longa porque as versões antigas do PHP na caixa de areia não têm tags curtas ativadas.
fonte
Nota:
1511 bytes / 2 versões = 5,54 bytes eliminados por @ Pietu1998
Experimente on-line:
Befunge 93
Befunge 98
Usa o operador ponto-e-vírgula exclusivo do Befunge 98 ("pular para o próximo ponto-e-vírgula") para diferenciar versões. Ambos imprimirão "9". O Befunge 93 ignorará os pontos e vírgulas, subtrairá 5 de "8" (valor deixado no topo da pilha), imprimirá o "3" resultante e terminará. Por outro lado, o Befunge 98 irá pular, imprimir "8" e terminar.
fonte
"89",;5-;,@
para 11 bytes;
parte.Pitão 4/5 - 6 bytes / 2 versões = 3
No Pyth 5, uma quantidade uniforme de espaços no início da linha é ignorada para uso no recuo, enquanto no Pyth 4, ele age como um único espaço e impede a impressão do
5
. No Pyth 4, ponto-e-vírgula apenas termina as instruções, o que permite4
que seja impresso, enquanto no Pyth 5, um espaço e ponto-e-vírgula fazem um comentário ao restante da linha.fonte
Python 3 e Python 2.0, 18 bytes, pontuação 18/2 = 9
Arredondamento de banqueiro em Python 3, arredondamento padrão em Python 2.
Experimente online - Python 3!
Experimente online - Python 2!
fonte
Cubicamente, 4 bytes, pontuação 4 / ∞
Funciona em todas as versões em que seu sistema possui memória suficiente para executar. Não competir porque é coxo. Válido para esta meta postagem .
Basicamente, B3 gira uma linha da face esquerda para a face superior. F3 funcionaria tão bem quanto F3 ou B3. Como uma linha no Cubically 3x3x3 é três cubelets por um cubelet, isso coloca três
1
na face superior, dando uma soma de 3.%0
faces que imprime essa soma da face superior, imprimindo 3 para Cubically 3 x3x3.No Cubically 4x4x4, as linhas são cubos 4x1. Coloca 4 1 na face superior, produzindo uma soma de 4.
fonte
x86 código da máquina de 16/32/64 bits: 11 bytes, pontuação = 3,66
Esta função retorna o modo atual (tamanho padrão do operando) como um número inteiro em AL. Chame de C com assinatura
uint8_t modedetect(void);
Código de máquina do NASM + listagem de fontes (mostrando como funciona no modo de 16 bits, pois
BITS 16
instrui o NASM a montar os mnemônicos de origem no modo de 16 bits.)Justificação :
O código de máquina x86 não possui oficialmente números de versão, mas acho que isso satisfaz a intenção da pergunta ao produzir números específicos, em vez de escolher o que é mais conveniente (que leva apenas 7 bytes, veja abaixo).
A CPU x86 original, 8086 da Intel, suportava apenas código de máquina de 16 bits. O 80386 introduziu o código da máquina de 32 bits (utilizável no modo protegido de 32 bits e, posteriormente, no modo compatível em um sistema operacional de 64 bits). A AMD introduziu o código da máquina de 64 bits, utilizável no modo longo. Essas são versões da linguagem de máquina x86 no mesmo sentido em que Python2 e Python3 são versões de linguagem diferentes. Eles são principalmente compatíveis, mas com alterações intencionais. Você pode executar executáveis de 32 ou 64 bits diretamente em um kernel do sistema operacional de 64 bits da mesma maneira que poderia executar os programas Python2 e Python3.
Como funciona:
Comece com
al=64
. Desloque-o para a direita por 1 (modo de 32 bits) ou 2 (modo de 16 bits).16/32 vs. 64 bits: os códigos de 1 byte
inc
/dec
são prefixos REX em 64 bits ( http://wiki.osdev.org/X86-64_Instruction_Encoding#REX_prefix ). O REX.W não afeta algumas instruções (por exemplo, ajmp
oujcc
), mas, neste caso, para obter 16/32/64, eu queria aumentar ou diminuir emecx
vez deeax
. Isso também defineREX.B
, o que altera o registro de destino. Felizmente, porém, podemos fazer isso funcionar, mas configurar as coisas para que os 64 bits não precisem mudaral
.As instruções que são executadas apenas no modo de 16 bits podem incluir a
ret
, mas não achei isso necessário ou útil. (E tornaria impossível alinhar como um fragmento de código, caso você queira fazer isso). Também poderia ser umjmp
dentro da função.16 bits vs. 32/64: os imediatos são 16 bits em vez de 32 bits. A mudança de modos pode alterar o comprimento de uma instrução; portanto, os modos de 32/64 bits decodificam os próximos dois bytes como parte da instrução imediata, em vez de uma instrução separada. Eu mantive as coisas simples usando uma instrução de 2 bytes aqui, em vez de descodificar a sincronização para que o modo de 16 bits decodificasse a partir de limites de instruções diferentes de 32/64.
Relacionado: O prefixo do tamanho do operando altera a duração do imediato (a menos que seja um imediato de 8 bits com extensão de sinal), assim como a diferença entre os modos de 16 e 32/64 bits. Isso dificulta a decodificação no comprimento das instruções em paralelo; As CPUs Intel têm barragens de decodificação LCP .
A maioria das convenções de chamada (incluindo os psABIs x86-32 e x86-64 System V) permite que valores de retorno limitados tenham lixo nos bits altos do registro. Eles também permitem derrotar CX / ECX / RCX (e R8 para 64 bits). IDK, se isso era comum em convenções de chamada de 16 bits, mas este é um código de golfe, então sempre posso dizer que é uma convenção de chamada personalizada de qualquer maneira.
Desmontagem de 32 bits :
Desmontagem de 64 bits ( Experimente online! ):
Relacionado: minhas perguntas e respostas sobre código de máquina poliglota x86-32 / x86-64 no SO.
Outra diferença entre 16 bits e 32/64 é que os modos de endereçamento são codificados de maneira diferente. por exemplo
lea eax, [rax+2]
(8D 40 02
) decodifica comolea ax, [bx+si+0x2]
no modo de 16 bits. Esta é, obviamente, difícil de usar para o código-golf, especialmente desdee/rbx
ee/rsi
são, em muitos convenções de chamada preservado-call.Também considerei o uso de 10 bytes
mov r64, imm64
, que é o REX +mov r32,imm32
. Mas como eu já tinha uma solução de 11 bytes, isso seria no máximo igual (10 bytes + 1 pararet
).Código de teste para os modos 32 e 64 bits. (Na verdade, não o executei no modo de 16 bits, mas a desmontagem mostra como será decodificado. Não tenho um emulador de 16 bits configurado.)
Este programa Linux sai com exit-status =
modedetect()
, portanto, execute-o como./a.out; echo $?
. Monte e vincule-o a um binário estático, por exemplo7 bytes (pontuação = 2,33) se eu puder numerar as versões 1, 2, 3
Não há números de versão oficiais para diferentes modos x86. Eu apenas gosto de escrever respostas asm. Eu acho que violaria a intenção da pergunta se eu chamasse os modos 1,2,3 ou 0,1,2, porque o objetivo é forçar você a gerar um número inconveniente. Mas se isso fosse permitido:
Que decodifica no modo de 32 bits como
e 64 bits como
fonte
python2
vs.python3
intérpretes no mesmo programa Python. As novas CPUs x86 sempre incluem um modo compatível com as CPUs mais antigas (essa é a única desculpa para usar um formato de código de máquina complicado e difícil de decodificar!), Mas o modo protegido de 32 bits de 386 e o modo longo de x86-64 realmente são novas versões do código de máquina x86. O modo longo removeu alguns códigos de operação, tornando-os inválidos.Brachylog / Brachylog v1 , 5/2 = 2,5
Experimente online! (Braquilog)
Experimente online! (Brachylog v1)
Explicação para Brachylog:
Explicação para o Brachylog v1:
fonte
2,1
no Brachylog v2 não constrói a lista[2,1]
(2;1
faria), mas o número21
(que não muda a maneira como você pretendia que sua resposta funcionasse).2;1
não teria funcionado no Brachylog v1 como;
meio lógico OU lá.C89 / C99, 25 bytes, 2 versões, pontuação = 12,5
//
comentários de estilo não são reconhecidos no C89.Versão Golfed:
Experimente online: C89 , C99
fonte
int v()
pormain()
, é mais curto e compilará realmente como um programa completo!Perl 5 e Perl 6,
23 bytes19 bytes, pontuação 9,5O Perl 5
grep
first op é sempre tratado como um regex, não no Perl 6.fonte
Bash, todas as 4 versões,
727132 bytes ⇒ score = 8Este trecho de código utiliza diferentes interpretações de
$'...'
strings em cada versão do Bash.Produz o número da versão principal - e é isso.
Doc encontrado aqui .
Ungolfed:
Essa resposta é apenas um palpite; Eu só testei no bash 4 e 3, mas deve funcionar em outras versões também.
Deixe-me saber se existe / não, tentarei com outras versões assim que as tiver disponíveis.
-1 char graças a Jens.
-29 bytes graças ao Digital Trauma (a
expr
idéia toda )!fonte
;;
na última alternativa. Use;
para cortar um byte.$'\xN
recurso de interpretação parece ter sido adicionado em 2.01.1 ... Vou ter que atualizar minha resposta. Trabalhando nissos="$'\ua\xa\n'";case ${#s} in 3)echo 4;;5)echo 3;;7)echo 2;;9)echo 1;esac
s=$'\ua\xa\n';expr 5 - ${#s} / 2
. Isso funciona na v3 e v4. Não tenho versões antigas para testar agora.R, versões 2 e 3, pontuação: 10,5 pontos
Este comando retorna
2
para R 2.xx e3
para R 3.xx A funçãocite
foi adicionada no R versão 3.0.0. Portanto, o comandoexists("cite")
retornaFALSE
para R 2.xx eTRUE
para R 3.xxR, todas as versões (1, 2 e 3), pontuação: 12⅓ pontos
A função
eapply
foi introduzida no R 2.0.0.fonte
R.version$major
. 15 caracteres. Não desde quando existe.Python , 196 bytes / 16 versões = pontuação 12.25
As versões são 1.5, 1.6, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5 e 3.6
Infelizmente, tive que deixar de fora 2.7, porque não existem módulos no (até onde eu sei) que não está no 2.6, mas no 3.0.
Percorremos vários módulos que foram introduzidos em diferentes versões do python e, no primeiro erro, encerramos e retornamos a versão. As lacunas entre as principais versões são preenchidas importando repetidamente
os
. O teste para o python 1.5 depende destring.split
não estar presente até 1.6.Agradecemos a resposta de Olivier Grégoire pela idéia de testar novas classes / módulos em um loop.
Agora finalmente testei em todas as versões relevantes do python ... que exigiam a edição do código-fonte 1.5 para compilá-lo ...
fonte
Arquivo em lote do Windows , 35 bytes / 2 versões = pontuação 17,5
Imprime
DOS
no MS-DOS (duh) eNT
no Windows NT. (duh)Agora, para alguma explicação.
O Windows possui scripts em lote desde os tempos do MS-DOS e não mudou muito desde então. No entanto, quando o Windows NT apareceu, a Microsoft alterou o intérprete padrão para scripts em lote, de
COMMAND.COM
paracmd.exe
(agora também permitindo a extensão.cmd
como uma alternativa ao original.bat
).Com isso, eles também implementaram algumas alterações , como o
/i
sinalizador para ignorar maiúsculas e minúsculas em condicionais. Ou seja, enquantoZ==z
é falso,/i Z==z
é verdade.Exploramos que o DOS não tinha distinção entre maiúsculas e minúsculas e comparamos maiúsculas
Z
com minúsculasz
. Usando o/i
sinalizador, acabamos com umZ==z
(falso) condicional no DOS ez==z
(verdadeiro) no NT.Agora, percebo que o desafio especifica que um número de versão deve ser impresso. Mas, até onde eu sei, não existe um 'número de versão' para o script em lote, portanto esse é o mais próximo que pude chegar.
Testado no Windows 10, DOSBox e vDos:
Windows 10:
(execute com
cmd /k
para impedir o fechamento da janelaexit
)DOSBox:
vDos:
fonte
7
é mais curto que o WindowsNT
.7
não é realmente uma versão do idioma, é a mesma em todos os Windows 'desde 3.1. Então eu não acho que seria muito justo chamá-lo de7
quando deveria talvez até mesmo ser3.1
Wolfram Language / Mathematica 10/11, 37 bytes / 2 versões = 18,5
Considere
(Length@DateRange[{1},{1}][[1]]+27)/3
, com 37 bytes e trabalhando com 2 versões, me dá uma pontuação de 18,5.e
Tenho certeza de que existe uma maneira mais eficiente, mas a discrepância entre a saída DateRange me incomodou recentemente, então comecei a usá-la.
Como acompanhamento, alguém provavelmente poderia tirar proveito da
Length@DateRange[{1}, {1}][[1]]
avaliação1
nas versões 1 a 8 do Mathematica, mas não tive tempo para incorporar isso.fonte
$Version
:Your program may not use a builtin, macro, or custom compiler flags to determine the language version.
$Version
para demonstrar que ela exiba o resultado correto na versão correta,$Version
não faz parte da minha resposta ...$VersionNumber
, mas está chamando$Version
. Na minha opinião, embora aLength@DateRange
essência do seu programa seja o material, isso não funcionaria sem$Version
apenas fornecer as informações da versão completa que você processa, o que viola as regras.{1} Tr[1^#&@@%~DateRange~%]/3+9
(31 bytes), ou mesmo7+Length@Now
(12 bytes)Ruby 1.xe 2.x, 20 bytes, pontuação 10
Com base no
to_h
método que foi introduzido naArray
classe no Ruby 2.fonte
p [].to_h&&2rescue 1
é um pouco mais curto.Erlang, 180 bytes, 11 versões, pontuação 16.36
Com recuo e quebras de linha:
Testado em uma versão menor de cada versão principal desde 10:
A ideia é que toda versão principal tenha adicionado pelo menos um novo argumento permitido para a função
erlang:system_info
, então vamos tentar os da lista, contar quantas delas falham e subtrair o número de falhas de 20, que é a versão atual.fonte
Julia 0.4, 0.5, 46 bytes, pontuação 22
Julia mudou o nome do tipo dos tipos String abstratos e concretos em várias versões.
Este código, em particular, tira proveito de:
Julia 0.4 :
ASCIIString
,AbstractString
,String
.Julia 0.5 :
String
,ASCIIString
,AbstractString
(embora isso não importe aqui)Veja também minha nova solução mais eficaz, baseada em princípios diferentes
fonte
Japt (1 e 2),
86/2 =43Teste v1 | Teste v2
Explicação
Antes da v2, o Japt usava uma sintaxe RegEx personalizada, para que pudéssemos tirar vantagem disso.
O número 1 como uma sequência.
Substitua (
r
) a seguir por a2
.Japt 2 vê isso como o RegEx
/\S/g
, que corresponde ao1
. O Japt 1 ignora o\
caractere de escape e apenas vê oS
, que é a constante do Japt para um caractere de espaço e, obviamente, não corresponde ao1
.fonte
Befunge, score = 3.5
7 bytes, 2 versões
Experimente online em Befunge-93
Experimente online em Befunge-98
"]"
é uma string literal nas duas versões, pressionando 93 (o valor ASCII de[
) na pilha.'b
é um literal de caractere no Befunge-98, pressionando 98 (o valor ASCII deb
), mas essas são instruções inválidas no Befunge-93, portanto elas são simplesmente ignoradas. Assim, terminamos com 93 no topo da pilha em Befunge-93 e 98 em Befunge-98..@
grava o valor no topo da pilha e sai.fonte
]"[email protected]'
ou][email protected]'
também trabalhamRuby 1.x (<1.9) e 2.x,
108 bytes, pontuação = 4Tente:
Isso funciona explorando os diferentes comportamentos
?x
entre o Ruby 1.xe 2.x. No Ruby 1.x,?A
(por exemplo) retorna65
(o valor ASCII do caractereA
), mas no Ruby 2.0 ele retorna a cadeia de um caractere"A"
.O código acima é equivalente a isso:
No Ruby 1.x (<1.9), o valor de
val
é50
(o valor ASCII do caractere2
), um Fixnum.Fixnum#%
é o operador módulo, então50 % 7
retorna1
.No Ruby 2.x,
val
é a sequência"2"
.String#%
é uma versão infix desprintf
, então"2" % 7
é equivalente asprintf("2", 7)
, onde"2"
está a cadeia de formato. Como a sequência de formatação não contém nenhuma sequência de formato (por exemplo%d
), os argumentos subsequentes são descartados e"2"
retornados.Finalmente,
$>
é um alias para$stdout
, então$> << ...
imprime o resultado.fonte
?A==66?1:2
antes de eu me deparei com a sua respostaPython 2 e Python 3 ,
3634 bytes, pontuação1817No Python 2 , o hash do infinito negativo é -271828, mas no Python 3 é -314159. Editar: salvou 2 bytes, 1 ponto de pontuação, graças ao @ArBo.
fonte
hash
foi corrigido pela primeira vez para trabalhar com infinitas de ponto flutuante, o desenvolvedor relevante usou pi * 1e5 e e * -1e5 como valores de hash. Em algum momento no Python 3, o valor has para infinito negativo foi alterado para ser a negação do valor hash para infinito.Python 3 , Python 2 , pontuação 17,5
(35 bytes, 2 versões)
Python 2 , 35 bytes
Experimente online!
Python 3 , 35 bytes
Experimente online!
Economizou 5 bytes graças a ETHproductions
Não é uma boa resposta ao código de golfe, mas uma grande mudança!
fonte
try:exec("print 2")\nexcept:print(3)