Seu objetivo : escrever um pedaço de código que resultará no resultado clássico de "Olá, mundo!" sendo impresso em STDOUT ou equivalente.
Regras : O código deve estar inteiramente impresso ASCII. Todo o código deve estar funcional - a remoção de qualquer caractere de contagem único deve alterar o resultado ou fazer com que o código não funcione. Todas as variáveis devem ser usadas após a atribuição. Literais de caracteres e cadeias devem ser necessários para a saída - ou seja, a substituição de qualquer literal de caractere ou qualquer caractere dentro de uma literal de cadeia por outro caractere deve ser capaz de alterar o resultado (e não via efeito da sequência de escape - substituindo caractere por barra invertida ou equivalente)
(NOTA: a regra final foi editada em)
Pontuação : é aqui que fica interessante. A pontuação mais alta ganha conforme determinado pelo número de caracteres, de acordo com as regras típicas do boliche de código. Mas o uso repetido de caracteres resultará em deduções de pontos. Especificamente...
- O uso repetido de qualquer caractere alfanumérico (az, AZ, 0-9) resultará em uma dedução de 3 pontos por repetição (o primeiro uso não resulta em dedução).
- O uso repetido da pontuação básica ([!? .-, ": ';]) - incluindo os colchetes - resultará em uma dedução de 2 pontos por repetição.
- O uso repetido de outros caracteres ASCII {`~ @ # $% ^ & * _ + = | \ /> <} - incluindo os colchetes - resultará em uma dedução de 4 pontos por repetição.
- O uso repetido de espaços, tabulações e novas linhas resultará em uma dedução de 1 ponto por repetição. Ou seja, apenas o primeiro uso de um espaço, guia ou nova linha contará para o seu total.
Nota: os comentários não contam para o total, apesar dos caracteres que marcam o início / fim de um comentário. Por exemplo, em C / C ++, se você tiver /* This is a comment */
, ele contará duas barras e dois asteriscos, mas nada entre eles.
Alguns exemplos (nota: usando Julia como linguagem de exemplo) ...
print("Hello, world!");
Total de caracteres visíveis: 22
Contém espaço: +1
Alfanuméricos repetidos: -12 para llor Pontuação
repetida: -2 para "
Pontuação final: 22 + 1-12-2 = 9
print("Hel",char(108),"o, wor",0x108,"d!"); # 0x108 makes a Uint8 that prints as ASCII
Total de caracteres: 43 (não conta nenhum caractere depois de #, que é o caractere de comentário)
Contém espaço: +1
Alfanuméricos repetidos: -18 para rr1008 Pontuação
repetida: -24 para () "" "" ",,,,,
Final pontuação: 43 + 1-24-18 = 2
xy=STDOUT
m="Hello, world!"
print(xy,m);
Total de caracteres visíveis: 37
Contém nova linha: +1
Contém espaço: +1
Alfanuméricos repetidos: -18 para xyllor Pontuação
repetida: -4 para ",
outro ASCII repetido: -4 para =
Pontuação final: 37 + 1 + 1-18-4 -4 = 13
Alguns códigos inválidos ...
x=2;print("Hello,world!")
Problema: x
está atribuído, mas não usado.
print("Hello,"*" world!")
Problema: *
é desnecessário, o resultado será o mesmo sem ele.
k=1
if k>0
print("Hello, world!")
else
print("abcghjmquvxyzABCDEFGIJKLMNOPQRSTUVWXYZ_+*-&|")
end
Problema: O segundo print
comando não será executado. Além disso, a remoção de caracteres entre aspas no segundo print
comando não altera a saída.
x="Hello, world!";
print(x)
Problema: a remoção da nova linha não altera o resultado ou causa o erro (em Julia, ponto e vírgula é necessário apenas se vários comandos estiverem na mesma linha, caso contrário, apenas suprime o valor de retorno).
print("Hellos\b, world!")
Problema: o s
personagem não afeta o resultado, pois é apagado \b
. Isso é aceitável se feito por meio de code ( "Hello",char(100),"\b, world!"
), mas não pode ser feito por meio de literais de string ou de caracteres.
Calculadora de pontuação conveniente - http://jsfiddle.net/4t7qG/2/ - graças a Maçaneta
Respostas:
Perl - 96
(Muito bom, considerando a pontuação máxima teórica de 97)
(Observe que a segunda linha começa com um
\t
caractere de tabulação real )O código tem 98 caracteres e contém todos os caracteres ASCII exatamente uma vez, mais um extra
-
.98 - 2 = 96
Não há literais de string aqui, mas a remoção de qualquer caractere único interrompe o programa.
Desobuscação
Existem 3 instruções neste programa (bem, na verdade 2, mas eu abusei
+
como algum tipo de separador de instruções)s{}[Hel0o, w3$=d!]
Este é um caso muito esticado do operador sed. É mais comumente escrito como
s/a/b/
, ous:a:b:
, mas o perl permite muito mais fantasia aqui:,s(a)(b)
s(a)^b^
s(a)[b]
e até mesmos qaqbq
.Ele substitui uma sequência vazia (interna
{}
) porHel0o w360d!
(interna[]
) ($=
interpola60
por padrão). Devido à falta de um~=
operador, ele opera$_
.y<"#%&'*.124578:?@BCDEFGIJKLMNOQ/-9>(\n\t6PRSTUVWXYZ^_`abfghjmqvxz|~\cAk-u)
Este também é um caso muito esticado, mas de um
tr
operador, que também é chamadoy
(y< >( )
).Vejamos a tabela de substituição:
" # %&'*.124578:?@BCDEFGIJKLMNOQ /-9
\n\t6PRSTUVWXYZ^_`abfghjmqvxz|~\cA k-u
movi alguns caracteres para que a string existente não seja quebrada. A única parte que realmente funciona aqui é
/-9
->k-u
. Ele substitui0
porl
,3
como
e6
comr
.Novamente, por falta de
~=
operador, ele opera.$_
Agora, temos a frase completa na
$_
variável.print
A falta de argumentos faz com que ela imprima apenas a
$_
variável.fonte
/-9
ek-u
são realmente usados para transformar a string. O resto é um lixo de tamanho igual . Se você remover apenas um caractere, os conjuntos ficarão desalinhados e o programa não exibirá "Olá, mundo!" não mais.<...> removal of any single counting character must change the result or cause the code to not function.
remoção de 1 caractere em qualquer lugar o quebra. Você pode fazer isso removendo 2 caracteres, mas isso não está nas regras.All code must be functional
. Você está claramente dobrando as regras, no mínimo. Não estou dizendo "isso quebra as regras", mas é definitivamente questionável.Esta resposta foi criada antes da adição da regra sobre literais de strings e não participa do concurso.
É completamente legítimo. : P Se você remover qualquer caractere dessa sequência, ela será impressa
ello, world!
.fonte
<<
precisam ser removidos.if 'x'>'w'
técnicas, mas bloqueia "k \ bH" para resultar em "H", por exemplo. Sinta-se livre para contribuir com uma segunda resposta após a restrição adicionada.CJam, 94
Experimente online! Observe que deve haver um tabulador antes do avanço de linha. O SE não gosta de tabuladores, então você terá que inseri-lo manualmente.
Pontuação total: 94
Eu usei o código a seguir para verificar se nenhum dos caracteres dentro da string pode ser removido:
Ele imprime uma matriz mostrando o número de vezes Olá, mundo! seria impresso se o caractere correspondente ao índice fosse removido.
fonte
254b
). O módulo de resultado final 7 deve ser 1, para que o bloco de código anterior seja executado uma vez. Vou precisar de um módulo para tornar cada personagem necessário.Z
, oT
ou provavelmente alguns outros caracteres não altera o resultado.Ruby,
2841Apenas para começar as respostas com uma solução no espírito da pergunta:
Pontuação (acho que entendi direito):
orli
)"'
)fonte
.
no3.1
pode ser removido sem problema. Como pode ox
em0x4
ou o-
in8-5
.PHP, 1 (sim, um ponto!)
Usando caracteres mágicos para gerar uma soma de verificação, que na forma binária corresponde a "Inferno", "o, w", "orld" e "!".
Normalmente, gosto de encontrar brechas, mas desta vez decidi jogar de acordo com o espírito e a intenção do concurso. Todo personagem e sua posição são essenciais para a saída. Os únicos lugares que você pode substituir são nomes de variáveis que não são valores literais, o espaço em branco entre
php
eforeach
quePHP
trata como equivalente e o uso de'
vs"
quePHP
trata como semelhante.Para sua informação, estas são algumas outras seqüências mágicas e hashes de interesse:
fonte
\t
,\n
ou o espaço. Não é um especialista em PHP, mas;
parece opcional também.Befunge-98 , 97 pontos!
Experimente online!
A guia está entre o
q
e on
.Usa um truque semelhante à resposta anterior do Befunge para preencher as linhas com os caracteres restantes, mas evita o uso de caracteres duplicados na seção de execução. A remoção de qualquer um dos caracteres não executados resulta no deslocamento das partes em execução, geralmente terminando em loops infinitos ou imprimindo a saída incorreta.
Como funciona
Realmente, a única parte executada se parece com:
Primeiro, ele usa uma cadeia de caracteres literal para adicionar
, world!
à pilha. Isso evita dois"
s.Isso adiciona
Hello
à pilha usando uma variedade de métodos para evitar caracteres duplicados.$
aparece o excesso de espaço causado pelo literal da string de quebra automática.7+
adiciona 7 aoh
final do literal da string para criar oo
.ba*46\%:
calcula 111, o valor ascii del
e o duplica.'e
adiciona e à pilha.f1g
recebe o personagem em 1,15, que é oH
Em seguida, reutiliza a
,
sequência para imprimir o todoHello, world!
. O resto são apenas mudanças de direção para navegar até o final@
.fonte
Ruby, 78
Mais regras abusam, eu acho, sem saber exatamente qual seria o patch. Utiliza uma sequência longa e verifica a soma do resultado; portanto, qualquer exclusão ou alteração fará com que o programa falhe. Provavelmente poderia ser otimizado um pouco para remover a duplicação de algumas letras e obter espaço em branco.
fonte
if
pode ser removido.if
ele realmente funcione e as coisas depois que ainda obedeçam às regras.puts('Hello, world!')
funcionaria. Eu acho que as regras precisam esclarecer se isso é legítimo.PHP, 2257
Brecha: a barra invertida foi omitida nas especificações e na calculadora de pontuação!
Esse código conta o número de ocorrências de barras invertidas em cada sequência e imprime um equivalente ASCII. Substituir qualquer barra invertida por outro caractere ou excluir uma barra invertida causa um erro de análise ou altera o resultado.
Um recurso interessante sobre barras invertidas e
PHP
é que elas precisam ser escapadas, para que dobre a pontuação automaticamente! Você pode dobrar, triplicar, etc., a pontuação multiplicando o número de barras invertidas, mas não queria ser ganancioso, e acho que pode exceder os limites do que você pode inserir.fonte
Befunge - 87
A primeira linha vale quatro pontos devido a toda a repetição, mas não há caracteres duplicados na segunda linha. A única string literal neste código é
dlrow ,olleH
, que é revertida e impressa como saída. A remoção de qualquer caractere desconectará ov
final da primeira linha do@
final da segunda, fazendo com que o programa nunca termine. Se ov
próprio for removido, o código entrará em um loop infinito imprimindo a saída correta.fonte
Aceto , 3
Finalmente conseguiu obter uma pontuação positiva!
Experimente online!
fonte
∑
não está imprimindo ASCIIAcc !!, -138 (e sim, isso é negativo 138)
Embora essa possa não ser exatamente a melhor pontuação que eu já recebi no PPCG, duvido que possa ser maior do que isso no Acc !!
Experimente online!
fonte