É muito simples: seu programa ou função deve gerar o seguinte texto:
Elizabeth obnoxiously quoted (just too rowdy for my peace): "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG," giving me a look.
Impressão fina
Você pode escrever um programa ou função que retorne a saída como uma string ou imprima-a em STDOUT (ou alternativa mais próxima). Opcionalmente, você pode incluir uma única nova linha à direita na saída.
Pontuação
O número de bytes no seu código multiplicado pelo número de bytes únicos no seu código
Menor pontuação ganha.
Por exemplo, uma resposta cerebral ou um espaço em branco teria uma grande vantagem aqui, pois o multiplicador seria muito baixo (8 e 3, respectivamente). No entanto, geralmente, escrever programas nessas línguas produz código muito mais longo, o que pode negar essa vantagem.
Falhas padrão que não são mais engraçadas são proibidas .
code-challenge
string
kolmogorov-complexity
durron597
fonte
fonte
bytecount~Log(X,unique)
, com X constante para esse problema. Portanto, único byountount constante. A computação dessa pontuação (log2) fornecepython2_mbomb007 728, python2_carpetpython 744, ruby 756, Fish 825, Insomnia 1148, cjam 1277, whitespace 1484, brainfuck 3546
. Portanto, exceto para a resposta brainfuck, é relativamente constante ...Respostas:
Insônia , 575 bytes * 4 = 2300
Usa 4 caracteres
dye=
.Solução 1b (não publicada): 783 bytes * 3 = 2349
Usa apenas 3 caracteres
ey=
.Solução 1: 826 bytes * 3 = 2478
Utiliza apenas 3 caracteres:
yo~
. Um programa é usado para gerar isso.Atualmente, todos os programas usam apenas as instruções 0, 1, 2, 6. Em outras palavras, eles manipulam os bits em um único byte e imprimem o resultado.
fonte
CJam,
266281456 bytes *14127 original =372433723192Experimente online.
Explicação
A estratégia que usei é tratar cada caractere da string como um dígito base 123 e codificá-lo como um número decimal no programa. O programa então converte esse número de volta à base 123 e mapeia cada dígito da base 123 de volta em um caractere. Como é difícil explicar por que o programa está em seu estado atual, explicarei cada versão dele.
Aqui está a aparência do final do programa na primeira versão:
Isso implementa a estratégia da maneira mais direta possível. O número, codificado normalmente na base 10, é convertido novamente na base 123 e cada dígito da base 123 é mapeado de volta para um caractere. Mas isso usa quatro caracteres únicos que não são dígitos, e poder se livrar de qualquer um deles provavelmente valeria o tamanho atingido devido à necessidade de usar um código menos direto.
Primeiro, eu percebi que eu poderia se livrar dos
b
e os:
operadores, criando-los em tempo de execução como os seus valores de caracteres ASCII convertido novamente em um personagem (com o já presentec
operador) e avaliá-los com o~
operador. Foi um pouco complicado fazer isso com o:
operador, pois ele deve ser analisado junto com oc
operador a seguir . Resolvi isso produzindo os caracteres:
e, emc
seguida, produzindo e avaliando o caractere+
, que concatena os dois caracteres anteriores na sequência:c
que pode ser avaliada adequadamente.Segundo, percebi que o
~
operador que acabei de apresentar apresentava uma nova variante sobrecarregada útil: quando recebe um número, produz o complemento bit a bit. Ao usar isso duas vezes seguidas após um número, eu poderia introduzir uma quebra de token na fonte sem efeito computacional resultante, permitindo substituir os espaços usados para separar os números~~
.O resultado final é mais 15 bytes de código no final, mas esse custo é superado pelo benefício de eliminar 2 caracteres únicos de 14. Aqui está uma comparação do final da primeira versão com o final da segunda versão:
Usar menos do que os dois operadores que eu estava usando seria impossível, mas eu ainda queria menos caracteres únicos. Portanto, o próximo passo foi eliminar os dígitos. Alterando a codificação do número para que cada dígito decimal fosse realmente um dígito de base 5, eu poderia potencialmente eliminar os dígitos 6-9. Antes de eliminar qualquer coisa do final do programa, era assim:
Como mencionado anteriormente, é fácil eliminar o espaço. Mas o
b
,:
ec
não seria tão fácil, como seus códigos de caracteres são98
,58
e99
, respectivamente. Todos estes continham dígitos marcados para eliminação, então eu tive que encontrar maneiras de derivar todos eles. E os únicos operadores numéricos úteis com valores de caracteres que não contêm 5-9 foram decremento, incremento, multiplicação e adição.Para
98
, eu usei inicialmente100~~40c~40c~
, que diminui100
duas vezes. Mas então percebi que poderia fazer outro uso do~
operador, pois o complemento bit a bit me permite obter números negativos que, quando adicionados, permitem imitar a subtração. Então, eu então utilizado100~~1~43c~
, que adiciona100
e-2
e é 2 bytes menor. Para58
, eu usei44~~14~~43c~
, que adiciona44
e14
. E para99
, eu usei100~~40c~
, o que diminui100
.O resultado final é bastante grande e ofuscado, mas o custo do número e código de processamento significativamente maiores foi superado pelo grande benefício de eliminar 5 caracteres únicos de 12. Aqui está uma comparação do final do programa antes das eliminações e depois eliminações:
fonte
98
,58
e99
) ainda está fora de alcance. E incrementar a base apenas diminui o tamanho total do programa em 8 a 10%, o que não é suficiente para compensar a pontuação de 10 a 15% obtida com um novo personagem exclusivo. Re-incluindo ob
operador da mesma forma não vale a pena.floor(log_b(x)+1)
e conteráb
símbolos diferentes. Então a pontuação éb*floor(log_b(x)+1)
. x é um número grande e, se você plotar isso para b, verá que o mínimo é praticamente b = 3. Ou seja, o comprimento diminui um pouco quando você usa bases mais altas (log), mas o tamanho do conjunto de caracteres aumenta linearmente, por isso não vale a pena. Feito um programa de espaço em branco simples, mas torna-se apenas uma pontuação de 4134.Espaço em branco,
1157937 bytes * 3 exclusivo =34712811Por solicitação popular (?), Estou postando minha solução de espaço em branco.
Para reduzir o código necessário, codifiquei a string inteira como um número binário (7 bits para cada byte). Um loop simples extrai os caracteres e os imprime.
Código fonte em filebin.ca.
NOTA: As especificações permitem números inteiros grandes arbitrários , mas o intérprete Haskell na página oficial é limitado a 20 bits. Use, por exemplo, este interpretador de ruby no github / hostilefork / whitespaces.
O script ruby para criar o programa de espaço em branco (l = WHITESPACE, t = TAB, u = NEWLINE, tudo depois de // ignorado, grava em um arquivo
prog.h
):Para ilustração, o programa de espaço em branco na forma legível por humanos. Veja abaixo um script simples para convertê-lo em um programa de espaço em branco real.
Basicamente, a sequência a ser impressa é um número inteiro longo e você precisa reduzir sua pontuação.
Assim, procurei uma linguagem com apenas 0/1, mas não encontrei nenhuma, e então lembrei que havia espaço em branco e tentei. Em espaço em branco, você pode inserir números binários com zeros e zeros diretamente.
Código antigo, pior pontuação, mas mais interessante
Código antigo no filebin .
O script ruby que eu usei para criar o programa (l = WHITESPACE, t = TAB, u = NEWLINE, tudo depois de
//
ignorado, grava em um arquivoprog.h
):Para ilustração, o programa de espaço em branco na forma legível por humanos. Veja abaixo um script simples para convertê-lo em um programa de espaço em branco real.
Esse programa de espaço em branco é bastante simples, mas existem três otimizações de golfe:
lul
para clonar a pilha quando houver um caractere duplicadoltl
para clonar a n-ésima entrada da pilha, se for menor do que empurrar o caractere diretamenteUm script ruby simples para converter meu código de espaço em branco legível para humano em um programa de espaço em branco real (leia um arquivo
prog.h
e grave em um arquivoprog.ws
):fonte
Ruby 144 bytes * 39 exclusivo = 5616
Às vezes, o mais simples é o melhor.
fonte
Brainfuck, 1264 bytes * 7 exclusivo = 8848
Sim, é uma pontuação terrível.
fonte
+.
certeza de que seria menor.+
e.
recebo 15018 * 2 =30,036
.> <> (Peixe) - 578 bytes * 8 exclusivo = 4624
Minha pontuação não é tão competitiva quanto eu esperava, mas achei que essa solução ainda era interessante o suficiente para ser postada.
Explicação
A primeira seção do código é uma sequência longa dos dígitos 0-4 que representam uma representação 5 de base de 3 dígitos para cada caractere na sequência. O código restante aproveita o
p
operador do Fish, que permite editar o código-fonte do programa enquanto o programa está sendo executado. Usando esse operador, eu pude gerar o código Fish necessário para converter os caracteres da base 5 de volta à base 10 e produzi-los e, em seguida, inseri-lo no código-fonte no início do arquivo antes que o intérprete chegasse ao final da linha e enrolado. Quando o intérprete chega ao final da linha, o código foi modificado para ter a seguinte aparência:Quando o código envolve e atinge o
v
operador, ele desce para a segunda linha, atinge o>
operador e prossegue em loop, sempre convertendo a codificação da base 5 em um valor ascii da base 10 e, em seguida, emitindo esse valor. Quando não houver mais valores na pilha, o?
operador pulará para;
e o programa será encerrado.fonte
7 , 273 bytes × 7 bytes únicos = 1911, não-concorrentes (desafio de pós-datas no idioma)
Experimente online!
Infelizmente, esse é um desafio antigo, o que significa que não consigo vencer com um dos meus idiomas mais recentes. No entanto, o idioma foi criado sem o conhecimento do desafio (eu apenas o encontrei aleatoriamente em "questões relacionadas"), mas mesmo assim acabou sendo um ajuste perfeito.
Normalmente, sete programas no PPCG são enviados em formato compactado, agrupando oito comandos em três bytes (o idioma possui doze comandos, mas apenas oito podem aparecer em um arquivo de origem, o que significa que três bits são suficientes). No entanto, o idioma também suporta um formato octal no qual cada comando é escrito como um dígito ASCII, e é isso que eu usei aqui, significando que apenas sete bytes distintos são usados (o
6
comando não é necessário em um programa que apenas imprime uma string simples).O programa é muito simples; consiste em dois elementos da pilha, uma sequência longa que é impressa literalmente, a
7
para separar os elementos (infelizmente inevitáveis) e403
que é uma maneira simples de imprimir uma sequência constante em 7 (40
escapa do segundo elemento da pilha, enquanto o move para o topo da pilha, depois a3
imprime e descarta o primeiro elemento antigo da pilha, ou seja, o403
próprio).Então, como eu consegui a string tão curta quanto 269 bytes? 7 suporta vários formatos de E / S, e um de seus formatos é US-TTY , um conjunto de caracteres (especificamente, uma variante do Baudot) que foi amplamente utilizado antes da invenção do ASCII. (O
5
início do segundo elemento da pilha, ou seja, o início do programa, especifica a codificação da string; o restante é o próprio conteúdo da string.) É um conjunto de caracteres de cinco bits e os comandos0
para5
pode ser armazenado com segurança em seqüências de caracteres enquanto não tiver escapado de forma consistente (para que escapar uma vez reproduza exatamente o original), para que o idioma use pares de comandos (36 opções) para codificar caracteres de US-TTY (32 opções, com 4 sendo usadas para diretrizes para o próprio 7 intérpretes). Obviamente, existem mais de 32 caracteres únicos que as pessoas podem querer exibir (e mais de 32 caracteres aparecem na string); portanto, dois deles são "códigos de mudança" que alternam entre quatro conjuntos de caracteres (letras maiúsculas e minúsculas) , figuras e uma "extensão de figuras" definida pelo usuário, que 7 usa para os caracteres ASCII restantes que não estão nos outros conjuntos de caracteres; no entanto, todos os caracteres da string estão "nativamente" em US-TTY, para que os detalhes de a extensão não importava). Aqui'Conto dez turnos adicionados a 124 caracteres de entrada, uma proporção bastante insignificante. Como tal, a capacidade de usar apenas pouco mais de dois bytes de entrada por caractere de entrada, multiplicado por 7 bytes únicos, significa que a pontuação nesse desafio é incrivelmente boa. (Eu acho que uma linguagem que foi projetada especificamente para esse desafio usaria algum tipo de compactação de strings, em vez de um conjunto de caracteres preexistente, mas mesmo que Baudot e US-TTY não tenham sido projetados para jogar golfe, eles ainda são bastante concisos .)
fonte
Python 2,
163147145143 bytes *353635 exclusivo =5705529252205005Provavelmente é tão bom quanto eu vou conseguir.
Edições:
.capitalize()
em favor do usoE
.'
vez de aspas de barra invertida.+
e alguns espaços para usar vírgulas naprint
instruçãofonte
Python 2,
14508 11700 11088 10164 9486 9746 7860145 bytes * 36 exclusivo = 5220Eu vi o título e achei que esse era um desafio interessante para o Python bastante prolixo. Estas são minhas anotações ao lidar com esse problema.
Minha primeira tentativa reduziu os únicos para 31:
Eu pensei que poderia fazer melhor. Ao usar
map
, os únicos chegaram a 26:Por volta dessa época, notei no texto da pergunta que a pontuação era
uniques * bytes
, não apenas única! Isso significava que minhas pontuações para os itens acima foram 14508 e 11700. Não muito competitivo. Então agora reduzo os bytes armazenando o texto como uma sequência hexadecimal:O tamanho foi reduzido, mas mais caracteres únicos. Mas se eu usasse uma string decimal de 2 dígitos compactada com um deslocamento de 32:
Isso tem o mesmo número de bytes, mas salva 3 únicos.
Eu traço um novo plano. Se eu compilar um número inteiro longo do Python com caracteres de 7 bits, poderia extrair cada um deles deslocando:
Bem, isso reduziu a pontuação para 9486. Um experimento interessante, mas nem de longe bom o suficiente. Agora, e se eu me livrar dos nomes das funções e confiar na formatação de strings?
Agora tenho apenas 22 únicos, mas a pontuação não melhora.
Ok, e se eu seguisse o caminho óbvio e apenas imprimisse a string:
Pontuação de 7860. Eu deveria ter feito isso primeiro. Mas eu não teria aprendido muito.
Eu acho que poderia reduzir os únicos em 26 se produzisse dinamicamente as partes maiúsculas, então:
Eu acho que o Python não ficará muito melhor que o 5220. A tarefa de minimizar os caracteres únicos no Python com certeza foi instrutiva.
Atualização: mbomb007 tem uma solução Python melhor com pontuação de 5005. Bom trabalho.
fonte
> <> (Peixe) - 138 bytes * 65 Exclusivo = 8970
A rota simples, ou seja, Olá Mundo:
Bem, na minha primeira incursão em> <> isso foi um desafio. Acho que vejo algumas melhorias, mas foi divertido aprendê-lo :)
Ou, para torná-lo excessivamente complicado - 1567 bytes * 27 Exclusivo = 42309
fonte
r
pilha para trás :) Além disso, você pode mover a finalo
para o espaço em branco no início da segunda linha.f f + 2 + o
tantas vezes na complicada?05AB1E , 380 bytes * 11 caracteres = pontuação 4180
Isso é potencialmente não competitivo
Experimente online!
Empurra a representação da base 5 de caracteres ASCII unidos.
Divide-se em pedaços de 3 e converte novamente em decimal.
Converte o número inteiro ASCII novamente em caractere.
Junta-se novamente.
fonte
Perl 6, 139 bytes * 36 exclusivo = 5004
fonte
Java 8, 141 bytes * 64 caracteres únicos = 9.024
141 bytes, 64 caracteres únicos. Abordagens diferentes da simples "return the string" aumentam a contagem de bytes sem economizar muito nos caracteres usados.
fonte
Perl 5 , 137 bytes * 35 exclusivo = 4795
Experimente online!
fonte
Tcl , 345 bytes, 345 x 13 = 4485
Experimente online!
Tcl , 337 bytes, 337 x 15 = 5055
Experimente online!
Tcl , 329 bytes, 329 x 16 = 5264
Experimente online!
Tcl , 333 bytes, 333 x 16 = 5328
Experimente online!
Tcl , 148 bytes, 148 x 37 = 5476
Experimente online!
Tcl , 277 bytes, 277 x 21 = 5817
Experimente online!
Tcl , 371 bytes, 371 x 16 = 5936
Experimente online!
Tcl , 401 bytes, 401 x 16 = 6416
Experimente online!
Tcl , 403 bytes, 403 x 16 = 6448
Experimente online!
Tcl , 433 bytes, 433 x 15 = 6495
Experimente online!
Tcl , 473 bytes, 473 x 14 = 6622
Experimente online!
Tcl , 133 bytes, 133 x 60 = 7980
Experimente online!
fonte