Ultimamente, sua empresa contratou um novo grupo de administradores de sistemas extremamente dedicados . Eles acham que apenas observar as telas dos computadores é bastante limitante (quero dizer, a taxa de atualização de 60Hz simplesmente NÃO é suficiente), então conectaram o barramento de dados da CPU a um DAC e o reproduziram em um alto-falante na sala do servidor para que pudessem ouvir. a 20kHz. Um problema: eles são administradores de sistemas, não engenheiros elétricos, e a configuração dos alto-falantes continua quebrando. Eles concluíram que isso é causado por alterações muito abruptas nos valores de bytes no código que os engenheiros de software compilam no mainframe. Os administradores do sistema agora estão organizando uma pequena competição para ver quem pode criar um código que seja o mais gentil para a configuração dos alto-falantes.
Desafio
Sua missão é criar um programa ou função em um idioma de escolha que tenha a menor diferença possível entre bytes consecutivos (consulte a seção Cálculo). Este programa terá a tarefa de calcular sua própria pontuação.
Entrada
Uma sequência ASCII no stdin
equivalente mais próximo do seu idioma ou como entrada de função se você estiver criando uma função. Como o seu programa terá que ser usado como entrada para calcular sua pontuação, ele deverá oferecer suporte ao Unicode se ele contiver algum Unicode. Caso contrário, o ASCII é suficiente. A entrada pode ser assumida como sendo pelo menos 2 bytes.
Cálculo
Cada caractere da string será convertido em seu equivalente numérico, usando o padrão ASCII. Em seguida, a diferença entre todos os caracteres será quadrada e depois somada . Por exemplo, a sequência abd
receberá uma pontuação de 1²+2²=5
.
Saída
Saída será o título da sua entrada. Isso significa que ele deve ser anexado por uma #
ou anexado por uma nova linha e um -
(traço). Em seguida, ele deve exibir o nome da sua linguagem de programação, seguida por vírgula, espaço e depois um número inteiro representando o resultado do cálculo. Por exemplo
#C++, 98
seria uma saída válida. A saída deve ser fornecida no stdout
equivalente mais próximo do seu idioma ou como um valor de retorno para sua função.
Pontuação
Sua pontuação será o valor calculado pelo seu programa, com o próprio programa como entrada.
Edit: Deve lidar com novas linhas agora, desculpe-me antes, pessoal
Aqui está um script Pyth para verificar o cálculo da pontuação.
fonte
Respostas:
CJam,
1051827643569545407327279235233229O programa acima gera o código-fonte real, com 1.179.112 bytes de comprimento.
Teste
Usando o interpretador Java , o código-fonte pode ser gerado e testado da seguinte forma:
Versão alternativa
Ao custo de 36 pontos - para uma pontuação final de 265 -, podemos tornar o código fonte 99,92% mais curto:
Você pode experimentar esta versão online no intérprete CJam .
Idéia
Queremos executar o código
mantendo a pontuação o mais baixa possível. Para conseguir isso, vamos construir essa sequência de caracteres por caractere (com algumas no-ops antes e depois) e avaliar o resultado.
Felizmente,
'
(caractere push literal),(
(decremento) e)
(incremento) são caracteres ASCII consecutivos, portanto, empurrar caracteres arbitrários é relativamente barato.Os caracteres ASCII posteriores
'
podem ser pressionados como'()…)(
, onde o número de)
depende do ponto de código.Por exemplo,
+
pode ser pressionado como'())))(
. A distância entre'
e(
, e(
e)
é 1. O final se)(
cancela; sua única função é pavimentar o caminho para o seguinte'
(correspondente ao próximo caractere) com caracteres consecutivos.Personagens pressionados dessa maneira aumentarão a pontuação em 4 pontos.
Os caracteres ASCII anteriores
'
podem ser pressionados como''(…(
, onde o número de(
depende do ponto de código.Por exemplo,
#
pode ser pressionado como''((((
. A distância entre'
e(
é 1.Personagens pressionados dessa maneira aumentam a pontuação em 2 pontos.
''(…(
realmente funciona para todos os caracteres ASCII, já que Character tem 16 bits de largura e envolve. Por exemplo,+
pode ser pressionado como''
, seguido por 65.532(
s.Essa técnica é usada na versão de 1,2 megabyte do código.
O personagem
'
pode ser pressionado como''
, deixando a pontuação inalterada.Código
fonte
Haskell,
1528279574291196839217744771742Uso (nota:
"
deve ser evitado):Anexo a sequência vazia
""
à sequência de entrada para ajudar o intérprete Haskell a descobrir os tipos. Sem que a inferência de tipo falhe, o código é muito polimórfico. O resto é normal: mapeie cada caractere para ascii, faça uma lista de diferenças de vizinhos, quadrado, soma e nome do idioma.fonte
> <>, 30227
Gah, o título dobrou minha pontuação; nas palavras do meu próprio programa, n & oooooo! Levarei algum tempo depois para melhorar isso. Também sei que essa pontuação pode estar baixa, pois não consigo inserir novas linhas no intérprete on-line e não tenho certeza de que haja uma maneira de preencher uma pilha de entrada na oficial.
De maneira alguma completamente otimizado, mas aproveita ao
máximoa proximidade relativa (pelo menos em termos de caracteres ASCII) dos comandos em> <>. Como não consegui enviar facilmente a nova linha como entrada, usei o verificador de pontuação Pyth, mas ele corresponde a vários casos de teste aleatórios que usei, por isso deve ficar bem com isso.Aqui está um com uma pontuação de 30353 (que deve estar correto, pois é uma linha):
fonte
Java,
664656550662434Surpreendentemente curto. Aceita uma matriz de caracteres em vez de uma sequência.
Eu usei um programa para gerar os melhores nomes de variáveis.
fonte
((Function<char[],String>) ABCD->{…}).apply(…)
obrigado. Essas lambdas parecem bastante incompletas sem o contexto de tipo.K5, 25478
Solução bastante simples. Esta é uma função que recebe sua entrada por meio de uma string.
fonte
Windows PowerShell ISE anfitrião, 62,978
638946796077050Editar - salvou alguns pontos, livrando-se da
$A
variável e, em vez disso, contando ao longo da string e também convertendo algumas palavras-chave em CAPSEdit2 - salvou mais alguns pontos usando em
$($HOST.NAME)
vez dePowerShell
Edit3 - economizou mais alguns pontos trocando nomes de variáveis e alterando como a saída é gerada.
Usa variáveis nomeadas com números, pois elas estão "mais próximas",
$
portanto nossa penalidade é menor.É interessante não usar técnicas regulares de golfe. Por exemplo,
|%{$
é 22534, enquanto|foreach{$
é apenas 8718.Provavelmente, isso está próximo do ideal sem alterar as técnicas.
fonte
MATLAB,
1921439748394443878537593Obrigado a Luis Mendo por reduzir ainda mais a diferença!
Obrigado ao NumberOne por reduzir a contagem de ruídos alterando o nome da variável de entrada!
Como isso funciona
ans
variável padrão no MATLABA9876543210
e imprime a soma das diferenças quadráticas vizinhas da sequência.diff
localiza diferenças vizinhas aos pares em uma matriz e produz uma matriz delength(A9876543210)-1
. Ao usardiff
em uma matriz de strings, isso é convertido em umadouble
matriz em que os códigos ASCII de cada caractere são gerados e as diferenças dos pares consecutivos resultam em outra matriz.diff(A9876543210)'
realmente produziu mais barulho do que comA9876543210.'
(obrigado Luis Mendo!)fonte
A=
norm(diff(B))^2
é mais curto%d
.B
como um nome de variável?A=@(A)...
é válido MATLAB, poisA
tem escopo definido.QBasic, 38140
YAY PARA SHOUTY SYNTAX
(Testado com QB64 .)
Este é um programa completo que insere a string e gera a resposta. A única limitação aqui é que o programa não pode receber entrada de várias
LINE INPUT
linhas ( pode lidar com qualquer coisa, desde que seja uma única linha).Desofuscada:
Convenientemente, passar uma sequência de vários caracteres para
ASC
fornecer o valor ASCII do primeiro caractere. Também convenientemente, variáveis numéricas são inicializadas automaticamente para zero.fonte
Python 2, 91026
Define uma função anônima que pega uma string e retorna a pontuação. Experimente online .
A maior parte disso é uma implementação funcional bastante direta: zip
A
comA[1:]
para obter uma lista de pares de letras e subtrairord
s, quadrado e soma com uma expressão geradora.Observe que as duas variáveis dentro do gerador de expressão são sempre apenas seguido pelos seguintes caracteres:
)
,,
, e no espaço. Todos os três têm valores ASCII muito baixos, portanto, devemos terminar cada variável com um caractere com o menor valor ASCII possível. O caractere mais baixo que pode terminar uma variável em Python é0
. Além disso, todas as oportunidades que temos para dividir um único salto grande em dois saltos menores diminuirão a pontuação:A0
custa 289, masA90
é apenas 145 eA9876543210
é insignificante 73.(Essa abordagem não ajudou a variável lambda
A
, provavelmente porque é seguida por[
uma ocorrência.)fonte
JSFuck, 144420642
Crie a partir de:
Cole isto em JSFuck.com caixa de entrada pequeno 's para compilá-lo para JSFuck. O resultado é um script com 112701 caracteres, então não posso colocá-lo aqui. Os dois últimos caracteres deste script são parênteses, coloque a entrada entre eles.
O programa leva quase 20 segundos no meu computador para se avaliar.
Explicação
Eu tenho mais tempo para trabalhar nisso, então me sentei e tentei otimizar os nomes das variáveis. Aqui estão os nomes das variáveis que vale a pena usar, em ordem de pontuação.
Aqui está o JavaScript que eu traduzi para o JSFuck:
Dei uma olhada mais de perto no tradutor do JSFuck.com e descobri como sua função de avaliação funciona. Com a opção "Eval source" marcada, o código se tornará uma função JSFuck de execução automática. Para obter a entrada, no entanto, precisamos acessar argumentos [0] de dentro da função. Isso traz nosso código JS final para ...
(Se você está se perguntando por que minha versão anterior teve uma pontuação menor que essa, é porque foi um programa JSFuck que retornou uma string que precisava ser avaliada como JS. É também por isso que não a deixei no post)
fonte
abs
é desnecessário. Eu acho que só poderia fazer a diferença ... :)JSFuck, 102280181
.CJam,
236631938911547Experimente online
Está começando a parecer que isso pode ser empurrado quase infinitamente, adicionando estrategicamente mais personagens. Mas acho que estou começando a chegar a um ponto de retornos decrescentes aqui, então vou parar por agora. Por exemplo, onde eu tenho
ULC;;;
, eu poderia usar o alfabeto inteiro para trás, seguido de 26;
, mas os ganhos ficam cada vez menores.De longe, a maior diferença que me resta é entre o
m
e o,
na string inicial. Não encontrei nada razoável para me livrar dele. Tenho certeza que existem maneiras. Mas se eu empurrar para o limite, pode começar a parecer a solução de Dennis ...fonte
JAVASCRIPT, 33911
Essa é de longe uma das otimizações mais bobas que já fiz em um código de golfe ...
Adereços para Neil para a sugestão "comentar spam" = P
fonte
/**/
nos locais apropriados.JAVASCRIPT, 31520
Essa solução era
significativamente mais ridícula emuito diferente da minha outra, então eu senti que merecia sua própria resposta.São 7306 caracteres, a maioria dos quais é o programa real codificado nessa sequência 0/1 e o restante simplesmente para decodificá-la. Ele funciona obtendo o índice de cada '1' menos o índice do '1' anterior para obter o valor de caractere necessário. Em seguida, avalia a sequência resultante para a função real, que é essencialmente um programa de golfe padrão para resolver o problema (que possui apenas cerca de 105 caracteres).
fonte
R,
68911571835381652224Pega uma string de STDIN e a converte em um número inteiro via raw. Difere, quadratura e soma o vetor resultante. O resultado é retornado como uma sequência. Obrigado a @nimi pela dica de nome da variável.
fonte
Mathematica, 33552
Esse código é avaliado como uma função sem nome, que calcula o "ruído" de uma sequência de entrada. Ele faz uso do fato de que a representação ASCII de dados binários é essencialmente "silenciosa". Os dados binários que você vê são a sequência
que teria sido uma resposta válida por si só, marcando 37848.
Todo o resto
apenas decodifica a string binária e a interpreta como código do Mathematica. Observe que o comentário vazio do Mathematica
(**)
é muito "silencioso" e, na verdade, remove o ruído do"
s.fonte
Java8:
1171701005089906298890Com a ajuda da expressão lambada e a atribuição inline de variável, é possível encurtar um pouco esse código.
fonte
Java,
129300128400110930106581105101Na verdade, esse desafio me fez pensar mais profundamente sobre os personagens a serem usados e otimizados do que encontrar a solução mais curta. Vou continuar trabalhando para diminuir o número.
Esta é uma função lambda,
B
sendo a sequência que representa a função. Não se esqueça de escapar das aspas ("
) ao passar isso como uma string.fonte
Pyth, 16391
O único truque de observação usado aqui é a codificação de base 256
#Pyth,
, que custa muito menos do que a própria string.fonte
M, 47033
52798Para usar isso, precisamos escapar de aspas e caracteres de espaço em branco "escape" (que são significativos em MUMPS!) Da seguinte maneira:
Observe que "M" é um nome alternativo para "MUMPS" - há discordância entre os profissionais sobre qual deles está correto. Naturalmente, eu escolhi a opção mais curta aqui.
fonte
NEW
encher). Então, quando eu começo a fazer aritméticaAAAA
(agoraAAA9876543210
), ela é coagida0
(talvez seja apenas um detalhe da implementação do Caché? Eu não tenho uma instalação do GT.M para testar). Boa chamada à coisa das prioridades do operador; Sempre acho difícil pensar em termos de operações puramente da esquerda para a direita. (I também esqueceu que M tem um operador de exponenciação - não é algo que surge muitas vezes quando você está escrever aplicativos CRUD.)Ruby, 118402
Ele lê um arquivo através da linha de comando, como
ruby diff.rb /path/to/file
. Há espaço para melhorar, e é nisso que estou trabalhando agora.fonte
C ++ 166345
fonte
Perl, 93556
Vou tentar reduzir isso um pouco mais.
Acontece que os chavetas (
{
e}
ASCII 123 e 125) e o sublinhado (_
ASCII 95) são muito caros, já que todos os outros caracteres estão na faixa de 30 a 70, e é por isso que formateiif
da maneira que fiz e por que estou usando, em$AAAAA
vez da amada de Perl$_
.Infelizmente, todas as variáveis com símbolos são somente leitura, então não posso tirar proveito de combinações como
$#
e$$
.fonte
F #,
136718130303Onde há um
\n
após o;
.fonte
POSIX Shell, 172026
pena que não consigo obter o mesmo resultado que o verificador Pyth (178386) ...
fonte
Lua,
171078117896Golfe:
Ungolfed:
fonte
C ++, 49031
uma macro C ++ que pega uma string c e grava o resultado na saída padrão
Experimente online!
fonte
C ++, 5
fonte