Você acabou de ser contratado por uma empresa alemã de fabricação de automóveis. Sua primeira tarefa, como engenheiro, é escrever um programa que calcule a pegada ecológica das seqüências de caracteres ASCII.
A pegada ecológica do caractere é calculada da seguinte forma:
Escreva o código ASCII do caractere em binário e conte o número de 1s.
Por exemplo, A
tem uma pegada de 2, mas O
é mais sujo com uma pegada de 5.
A pegada global de uma string é a soma das pegadas de seus caracteres. Uma cadeia vazia tem uma área de cobertura zero.
Seu programa deve aceitar uma string ASCII como parâmetro (por linha de comando ou entrada), calcular sua pegada ecológica e produzi-la. O próprio programa deve ser codificado em ASCII.
Há um soluço embora. Como sua empresa deseja entrar em um novo mercado com regras ambientais mais rígidas, você precisa ajustar seu programa para que ele se comporte de maneira diferente no "modo de teste". Portanto:
O programa deve gerar 0 quando receber a string
test
como parâmetro.
Pontuação
O código fonte com a menor pegada ecológica vence (e sim, a resposta test
é proibida!)
fonte
\x7F}~_?{ow7yvu/s\x1F;=znm>k|OW[]^gc\x1Ex\x1D\eef\\'ZY+-VU.St\x173iNM5K6r\x0FG9:q<ljQ\x15\x13pC\aEF8IJL4\x0E21\x16RTh,X*)\x19\v&%\x1A#d\x1C\rab`!\"$(\x180\x05A\x14B\x12\x11DHP\x03\f\x06\n\t\x80\x10\x01@\x04\b\x02 \x00
Respostas:
CJam,
3331Existem 113000000009500000000340000000116000000010100000001150000000116000000003400000000610000000033000000004200000000580000000105000000005000000001020000005000000005000000001020000000098000000004900000001020000000098490000000102000000009800000000109800000000989800000000109800000000980000000049000000001098000000004900000001000000000989800000000109800000000980000000049000000010000000009800000000109800000000980000000049000000010000000009800000000109800000000980000000049000000010000000009898000000001098000000009898000000004949000000009898
O código é equivalente a
que pode ser testado online .
Como isso funciona
Como isso funciona
Esse código-fonte tem uma pegada ecológica de 75.
fonte
Linguagem , 0
A saída é unária , pois o Lenguage / Brainfuck não possui uma maneira sensata de imprimir números inteiros na base 10.
O código fonte real contém
bytes nulos e é equivalente ao seguinte programa Brainfuck:
Experimente online no brainfuck.tk .
O comprimento do código Brainfuck é altamente abaixo do ideal - para iniciantes, eu codifiquei as pegadas de todos os caracteres ASCII - mas a pontuação 0 é a pontuação 0 ...
fonte
PowerShell,
337344304 pontosEstou gritando com você porque é mais barato!
Recebe a entrada como
$A
, depois lança como uma matriz de caracteres, itera sobre um loop for em cada caractere, usa o ridiculamente prolixo[convert]::ToString()
para converter o caractere naquela posição em binário, substitui todos os 0 por nada, depois conta o comprimento e acrescenta isso a$B
. No final, usa uma equivalência para indexar em uma matriz dinâmica (ou seja, se$A
fortest
, então-CEQ
é$TRUE
, então indexa para o segundo elemento0
).Edit1 - Caso de teste corrigido
"TEST"
Edit2 - Golpeou alguns pontos repetindo os caracteres em vez de seus índices e lembrando que
-replace
não é necessário um segundo parâmetro se você o substituir por nada.fonte
" 00100010
são mais ecológicas que as aspas simples' 00100111
."TEST"
"
. Também corrigido com diferenciação entre-CEQ
maiúsculas e minúsculas. Isso aumentou um pouco os pontos, porque eu estava pontuando incorretamente porque' '
não os delimitei corretamente nos meus testes.Pitão -
5249Economize três pontos graças ao @orlp.
É necessário inserir aspas para economizar espaço.
Conjunto de Teste .
fonte
@,0
por*
para salvar 3 :)@,0
: você esqueceu de mudar?Lisp comum,
294281235Para reduzir a pontuação, usei
@
(custo 1) e!
(custo 2) como nomes de variáveis (edit: e é ainda melhor se eu usar@
a variável que mais ocorre na função). ESTOU GRITANDO DEMAIS porque é mais barato.Pretty-impresso
fonte
;)
JavaScript, 279
Editar correção de bug (não contava o bit 1 de cada caractere)
Um programa completo, com entrada e saída via pop-up. Testado no Firefox, deve funcionar em qualquer navegador moderno.
Algumas ferramentas (testadas com o Firefox)
fonte
test
, em vez de 0.prompt
função. No Firefox,prompt
traduz as novas linhas (2bit) em espaços (1bit), então temos 277 em vez de 279Julia,
254246232A
count_ones
função conta o número de unidades na representação binária de sua entrada.Reduzi minha pegada ecológica graças a FryAmTheEggman!
fonte
Python 3, 271
fonte
z=input();print(sum(bin(ord(i)).count("1")for i in z)*(z!="test"))
.... @ FryAmTheEggman jinx?Perl,
13611873Substitua tudo
@
por\0
Exemplo de uso:
fonte
MATLAB,
198194 bytesPrimeiro, a string é lida em STDIN através da
input
função Quando isso acontece, comparamos a string de entrada com a stringtest
. Se o resultado não fortest
, convertemos cada caractere em seu código ASCII e, em seguida, em sua representação binária viadec2bin
. Uma conseqüência bonita dessa função é que, se você enviar uma string, a representação binária de seu código ASCII será delimitada como um caractere por linha.Como um exemplo:
dec2bin
gera uma matriz de caracteres. Quando isso acontecer, subtraia por 48, que é o código ASCII para 0, para que a matriz seja convertida emdouble
consistindo em 0s e 1s. Quando isso acontece, uma chamada parannz
contar o número total de elementos diferentes de zero nesta matriz. Observe que esse resultado é multiplicado pelo oposto da string comparada comtest
. Caso a string não sejatest
, obtemos o cálculo da pegada. Se for igual, a multiplicação resultará em 0.Alguns exemplos:
fonte
de2bi
e evitar-48
convertê-lo em um tipo numérico (além dos 2 caracteres extras no nome da função).Bater
440430412405403Bem direto. Faz um loop dos caracteres na entrada, convertendo primeiro em ascii (com
printf %d
e o principal'
no número e depois em binário (combc
)), retira os zeros e conta o número de caracteres.Não é uma ótima resposta, mas ainda não tinha visto uma tentativa de festa.
Modificada desde a minha primeira resposta, a string de entrada pode ser dada simplesmente na linha de comando (ou seja, tornou-se vários parâmetros de entrada, se houver várias palavras), mas depois de ler algumas outras respostas, acho que posso supor que ela esteja entre aspas, portanto, toda a string aparece como
$1
fonte
do
por{
edone
com}
. 2. Você também não precisa dos espaços ao redor<<<
. 3. Você pode substituir\n
por um avanço de linha literal.=
e||
custa 15 enquanto usando!=
e&&
é apenas 13! Um caractere extra, mas economiza dois pontos ...Ceilão,
1431,764,697,571,547,538,501,493,467, 451Este era o original, não destruído:
Isso leva o argumento a partir de um parâmetro da linha de comando ... process.arguments é uma sequência de sequências (possivelmente vazias); portanto, antes de usar uma delas, precisamos verificar se ela realmente existe. No outro caso, emitimos uma mensagem de erro (isso não é requerido pela pergunta e será descartado nas próximas versões).
A
sum
função do Ceilão pega um Iterável não vazio de elementos de algum tipo que precisa satisfazerSummable
, ou seja, possui umplus
método, como Inteiro. (Ele não funciona com sequências vazias porque cada tipo de Summable terá seu próprio zero e o tempo de execução não tem chance de saber qual é o significado.)Os elementos de uma string ou os bits de um número inteiro não são iteráveis não vazios. Portanto, estamos usando aqui o recurso para criar uma iterável especificando alguns elementos, depois uma "compreensão" (que será avaliada como zero ou mais elementos). Portanto, no caso de caracteres, estamos adicionando uns (mas somente quando o bit correspondente é definido), no caso de string, estamos adicionando o resultado dos caracteres. (A compreensão será avaliada apenas quando a função de recebimento realmente iterar sobre ela, não ao criar o Iterable.)
Vamos ver como podemos diminuir isso. Primeiro, cada uma das funções é chamada apenas em um local, para que possamos incorporá-las. Além disso, como mencionado acima, livre-se da mensagem de erro. (764 pontos de pegada).
Na verdade, não precisamos do interior aninhado
sum
, podemos fazer uma grande compreensão. (Isso economiza 37 pontos de pegada parasum({0,})
, e mais alguns, para espaços em branco, que serão eliminados no final de qualquer maneira.) Isso é 697:Podemos aplicar um princípio semelhante à
"test"
sequência especial : como nesse caso o resultado é 0 (ou seja, nada é contribuído para a soma), podemos fazer isso como parte da soma (mas temos que inverter a condição) . Isso nos poupa principalmenteprint(0);
, algumas chaves e um monte de espaços de recuo, chegando a uma pegada de 571:Fazemos o mesmo para o primeiro
if
, com o efeito colateral que agora não gera argumentos também gera, em0
vez de não fazer nada. (Pelo menos eu pensei que isso iria acontecer aqui, em vez disso, parece travar com um laço eterno? Estranho.)Na verdade, podemos omitir o
()
para asum
função aqui, usando uma sintaxe de chamada de função alternativa , que usa{...}
em vez de()
, e irá preencher compreensões em argumentos iteráveis. Isso tem pegada 538:Substituir o nome da função
footprint
(40) porp
(3) economiza outros 37 pontos, levando-nos para 501. (Os nomes das funções do Ceilão precisam começar com caracteres minúsculos, portanto, não podemos obter menos de 3 pontos aqui.)Os nomes das variáveis
s
(5) ec
(4),i
(4) também não são ótimos. Vamos substituí-los pora
(argumento),d
(dígito?) Eb
(índice de bits). Pegada 493:Não vejo nenhuma otimização restante de espaço em branco, portanto, vamos remover o espaço em branco não necessário (1 ponto para cada espaço, dois para cada uma das duas quebras de linha):
Ao navegar na API, descobri que Character.hash realmente retorna o mesmo valor que seu
integer
atributo. Mas tem apenas 14 pontos em vez de 30, então chegamos a 451!fonte
PowerShell,
273336328324293288295editar - esqueci o caso 'teste' ... muito caro.
edited - perdeu uma oportunidade de MAIÚSCULAS.
edititedit - incorporou as sugestões de comentários (Obrigado TimmyD).
editar 4 - D é uma variável mais barata que C (2 vs. 3)
editar 5 - Voltar para 295 devido à verificação de distinção entre maiúsculas e minúsculas.
Faz um loop na string e conta os 1s que são deslocados do valor ASCII dos caracteres.
Dica para TimmyD por me dar a previsão de usar caracteres maiúsculos E usar o índice de matriz no final.
fonte
PARAM($A)[CHAR[]]$A|%{$C=[INT]$_;WHILE($C){$B+=$C-BAND0X1;$C=$C-SHR1}};($B,0)[$A-EQ"TEST"]
PS C:\scripts> .\ecological-footprint.ps1
"TEST"
PARAM($A)(([CHAR[]]$A|%{$B=$_;0..9|?{[INT]$B-SHR$_-BAND1}}).LENGTH,0)[("TEST"-EQ$A)]
Matlab, 320
fonte
C, 374
Novas linhas (não incluídas na pontuação) adicionadas para maior clareza. Poderia ser aprimorado para 360 apenas alterando os nomes das variáveis para maiúsculas, mas tentarei pensar em algo melhor.
A entrada é via linha de comando, o que significa segfaults na entrada ausente. Espero uma pontuação pior para entrada através de stdin.
fonte
PHP,
377337299 Pegada Ecológica (ainda muito) ,10291 BytesParece que o PHP é favorável ao meio ambiente apenas no modo de teste. ;)
Executa a partir da linha de comando como:
while
é mais favorável ao meio ambiente do quefor
mesmo que eles compartilhem a mesma contagem de caracteres. Também nomes de variáveis em maiúsculas têm uma pegada melhor do que seus equivalentes em minúsculas.Editar
decbin
vez debase_convert
fonte
VBA,
475418Obrigado Jacob por 57 pontos de desconto
Converte seqüência de caracteres em matriz de bytes (128 é o atalho vba para "Converte a seqüência de caracteres de Unicode na página de código padrão do sistema", portanto, não funciona no Mac ....)
Loops embora matriz de bytes convertendo em binário e concatenando tudo juntos.
VBA por que você é tão ruim no golfe ... :(
fonte
"test"
claro)JavaScript,
418410fonte
" 00100010
são mais ecológicas que as aspas simples' 00100111
.Pyth, 64
Verifica se a entrada é teste e, se não, conta o número de 1s na representação binária da entrada.
fonte
Haskell, 292
Não há muito o que dizer aqui: transforme cada caractere em valor ASCII (
fromEnum
) e calcule os1
(viaa
). Soma todos os resultados.fonte
JavaScript (ES6),
521478458449473465Esta é a minha primeira tentativa de jogar golfe em JavaScript, por isso é provavelmente muito não-destruído.
fonte
Ruby,
316313Muito simples, procurando mais possibilidades de golfe:
b
vez dex
economizar 3 pontos.fonte
$*[0]
em vez degets.chomp
(leva de entrada como um argumento de linha de comando)" 00100010
são mais ecológicas que as aspas simples' 00100111
.H
é melhor do queI
pela mesma razão.Python 2,
294281269266Um porto da minha resposta Pyth, acima.
A entrada é recebida como uma sequência (entre aspas):
fonte
" 00100010
são mais ecológicas que as aspas simples' 00100111
.A=input();print[sum(bin(ord(H)).count("1")for H in A),0][A=="test"]
com uma pontuação de 243.CJam, 123
fonte
Pyth, 96
Uma porta da minha resposta CJam, acima / abaixo.
fonte
I
tentar usar o ternário?
, mas neste caso, como é um bool que você pode usar*
(depois de alternar para emn
vez deq
),k
é automaticamente""
es
nas strings é o mesmo ajk
. Espero que você se divirta aprendendo pyth! :)CJam,
83817977Melhor até agora, depois de tentar várias variações:
Experimente online
Explicação:
fonte
Ruby, 247
Abordagem direta, percorrendo todos os bytes da entrada e todos os bits em cada byte, somando a variável
d
.d
é inicializado como -2 porqueh
contém a nova linha final da entrada (vale 2 bits) e não queremos contar isso.Da mesma forma,
h
ele conterátest
uma nova linha à direita, portanto, uma nova linha deve ser incluída no valor de comparação.fonte
R, 279
Bastante auto-explicativo.
Testes:
fonte
C, pegada 378, 98 bytes
Outra solução C:
A maneira como isso funciona é que s é inicializado como 0 normalmente, mas se torna -17 se o argumento da linha de comando for "test" (strcmp retorna 0 em cadeias iguais e diferente de zero em cadeias distintas, portanto, invertendo, fornece 1 se cadeia de caracteres é "teste"). O número -17 foi escolhido para compensar a pegada de 17 que será calculada para "teste". O cálculo da área ocupada é fácil com os operadores bit a bit.
Snap! Inicialmente, eu perdi as "vitórias mais baixas", então estava buscando o código mais curto ... Vou ver se posso diminuir a "pegada".
fonte
Java, 594
Java não é muito verde.
Versão não destruída:
D
é declarado como umInteger
para que possamos acessarInteger
obitCount
método estático de uma maneira ambientalmente consciente. ObitCount
método trata oschar
como números inteiros e retorna o número de bits definidos.fonte