Produza a música do alfabeto ŋarâþ crîþ sem usar (m) nenhuma letra
Seu objetivo é escrever um programa que não aceita e gera o seguinte texto:
Mas há um problema: para cada letra (qualquer caractere cuja categoria geral em Unicode começa L) na sua fonte, você recebe uma penalidade de 20 caracteres! (Para referência, o texto a ser impresso possui 81 letras.)
O código Perl 6 abaixo tem 145 bytes e 84 letras, portanto, obtém uma pontuação de 1.845:
O código abaixo tem 152 bytes e 70 letras, portanto, obtém uma pontuação de 1.552:
Originalmente, pensei em proibir completamente as cartas, mas não acho que haja muitos idiomas que tornem isso possível. Você é mais que bem-vindo a tentar.
(þarâþcrîþ [ˈŋaɹa̰θ kɹḭθ] é um dos meus conflitos. Eu queria colocar seu nome em maiúscula aqui, mas entendo o grande e feio eng aqui. Ah, bem, a linguagem não usa letras maiúsculas em sua romanização.)
Edit: percebi que uma das linhas está errada, mas vou mantê-la, pois já existem respostas. A versão correta da terceira linha é ma a fa ga pa ta ča; à sua escolha, você pode optar por produzir o texto corrigido.
A complexidade kolmogorov , a fonte restrita e a pontuação especial são todos os tipos de coisas que se beneficiam muito da consideração cuidadosa na caixa de areia. Atualmente, parece que a melhor abordagem para esse desafio seria escrever todos os pontos de código em decimal e transformá-los em texto com um builtin, com algum atalho para codificar todos os as - ou não, dependendo de quantos letras seriam necessárias, porque 20 caracteres é uma penalidade muito grande (embora quando tudo o mais seja marcado por bytes, não esteja muito bem definido ...)!
E, considerando a invocação do Unicode, provavelmente são necessárias algumas regras explícitas que governam páginas de códigos especiais usadas pela maioria dos idiomas de golfe (além de talvez um link para um script para validar a pontuação).
7 , 410 caracteres, 154 bytes na codificação 7, 0 letras = pontuação 154
Em um desafio que não gosta de usar letras, qual idioma melhor usar do que um que consiste apenas em dígitos?
Este é um programa completo que sai por travamento; portanto, há saída estranha para o stderr, mas o stdout está correto.
Um programa 7, em sua primeira iteração, simplesmente envia vários elementos para a pilha (porque dos 12 comandos existentes em 7, apenas 8 deles podem ser representados em um programa de origem e esses 8 são especializados para escrever código empurrar estruturas de dados específicas para a pilha). Este programa não usa o 6comando (que é a maneira mais simples de criar estruturas aninhadas, mas de outra forma tende a não aparecer literalmente em um programa de origem); portanto, são apenas os 7comandos que determinam a estrutura; 7empurra um novo elemento vazio para o topo da pilha (enquanto os comandos 0… 5são apenas anexados ao topo da pilha). Assim, podemos adicionar espaços em branco ao programa para mostrar sua estrutura:
Os elementos próximos ao final do programa são pressionados por último, portanto, estão no topo da pilha no início da segunda iteração. Nesta iteração e em todas as iterações futuras, o interpretador 7 faz automaticamente uma cópia da parte superior da pilha e a interpreta como um programa. O literal 41403empurra o (código ativo e não literal) 47463(7 tem 12 comandos, mas apenas 8 deles têm nomes; portanto, uso negrito para mostrar o código e não negrito para mostrar o literal que gera esse código, o que significa esse, por exemplo, 4é o comando anexado 4ao elemento da pilha superior). Portanto, o programa que é executado na segunda iteração é 47463. Aqui está o que isso faz:
4        Troque os dois elementos da pilha do topo, adicione um elemento vazio entre
7       Adicione um elemento da pilha vazio ao topo da pilha
4      Troque os elementos da pilha do topo, adicione um elemento vazio entre
6     Descubra quais comandos gerariam o elemento da pilha do topo;
acrescente isso ao elemento abaixo (e pop o topo antigo da pilha)
3    Crie o elemento da pilha superior, pop o elemento abaixo
Isso é mais fácil de entender se observarmos o que acontece com a pilha:
… D c b a 47463 (código a ser executado 47463:)
… D c b esvazie a (código a ser executado :)47463 7463
… D c b esvazia um vazio (código a ser executado :)47463 463
… D c b vazio vazio vazio a (código a ser executado :)47463 63
… D c b vazio vazio " a " (código a ser executado :)47463 3
… D c b vazio (código a ser executado: vazio )47463
Em outras palavras, pegamos o topo da pilha a , calculamos o código que provavelmente o produziu e produzimos esse código. O intérprete 7 exibe automaticamente os elementos vazios da parte superior da pilha no final de uma iteração; portanto, terminamos com a 47463parte de trás na parte superior da pilha, assim como no programa original. Deve ser fácil ver o que acontece a seguir: acabamos agitando todos os elementos da pilha, um após o outro, produzindo todos eles, até que a pilha fique sem fluxo e o programa trave. Então, basicamente criamos um loop de saída simples que analisa o código-fonte do programa para determinar o que produzir (não estamos produzindo as estruturas de dados que foram enviadas para a pilha pelos nossos 0…5comandos, em vez disso, estamos recriando quais comandos foram usados, observando quais estruturas foram criadas e produzindo essas). Portanto, a primeira parte da saída de dados é 551220304010420030455(o código fonte que gera o segundo elemento da pilha do topo), a segunda é 3341351…114525(o código fonte que gera o terceiro elemento da pilha do topo) e assim por diante.
Obviamente, porém, essas partes do código-fonte não estão sendo codificadas como saída. 7 contém várias linguagens específicas de domínio diferentes para codificar a saída; depois que um idioma específico do domínio é escolhido, ele permanece em uso até que seja explicitamente limpo, mas se nenhum dos idiomas tiver sido escolhido ainda, o primeiro dígito do código emitido determinará qual dos idiomas usar. Neste programa, apenas dois idiomas são usados: 551e 3.
551é bastante simples: é basicamente o antigo código Baudot / teletipo usado para transmitir letras por teletipos, como um conjunto de caracteres de 5 bits, mas modificado para deixar todas as letras em minúsculas. Portanto, o primeiro pedaço de código a ser decodificado da seguinte maneira:
Como pode ser visto, estamos ajustando cada caractere em dois dígitos octais, o que é uma taxa de compressão bastante decente. Pares de dígitos no intervalo de 0 a 5 nos dão 36 possibilidades, em oposição às 32 possibilidades de que Baudot precisa; portanto, os quatro restantes são usados ​​para comandos especiais; nesse caso, 55no final limpa o formato de saída lembrado, permitindo usar um formato diferente para a próxima parte de produção que produzimos.
3é conceitualmente ainda mais simples, mas com um toque. A idéia básica é pegar grupos de três dígitos (novamente, na faixa de 0 a 5, como esses são os dígitos para os quais podemos garantir que podemos recriar o código fonte original de sua saída), interpretá-los como um dígito de três dígitos número na base 6 e apenas o produza como um byte em binário (permitindo assim a saída dos caracteres multibyte na saída desejada simplesmente com a saída de vários bytes). A reviravolta, no entanto, vem do fato de haver apenas 216 números de três dígitos (com possíveis zeros à esquerda) na base 6, mas 256 bytes possíveis. 7 contorna isso ligando números de 332₆ = 128₁₀ para cima a dois bytes diferentes; 332pode gerar o byte 128 ou 192, 333o byte 129 ou 193 e assim por diante, até o 515qual gera o byte 191 ou 255.
Como o programa sabe qual das duas possibilidades gerar? É possível usar trigêmeos de dígitos para 520cima para controlar isso explicitamente, mas neste programa não precisamos: O padrão do 7 é escolher todos os bytes ambíguos de forma que a saída seja UTF-8 válida! Acontece que sempre há, no máximo, uma maneira de fazer isso, desde que seja UTF-8 que desejemos (e o fazemos neste caso), podemos apenas deixá-lo ambíguo e o programa funciona de qualquer maneira.
O final de cada uma das 3…seções é 525, que redefine o formato de saída, voltando à 551próxima seção.
São 410 bytes + 0 letras na representação descompactada ou 154 bytes + muitas letras na representação compactada. Contar os bytes em um e as letras no outro parece barato.
@ Grimy: Você está confundindo bytes com caracteres. A representação compactada consiste em 154 bytes na codificação 7, que codificam 410 dígitos octais, cada um dos quais é um dígito, não uma letra. Seu raciocínio implica que, digamos, ɓem Jelly não seja uma letra (porque sua codificação na codificação de Jelly corresponde ao código de controle "CSI" se interpretado em um conjunto de caracteres típico de 8 bits, e não em uma letra). Assim como o Jelly, o 7 também usa uma codificação personalizada; mas como 7 não usa letras, a codificação não precisa codificar letras e, portanto, não pode.
Haskell, 0 letras, 423 bytes = pontuação 423
Gelatina , 274 260 212 bytes + 2 letras = 314 300 252
-48 bytes graças a Nick Kennedy
(Usos !"#$%&'()*+,-./0123456789:;<=>?@V\_¤×Ọ'""de que Ve Ọsão letras Unicode e são usados uma vez cada)
212 bytes mais duas letras
@NickKennedy Eu brinquei com o número do golfe, mas não dei um passo atrás e olhei para compensar os ordinais, coisas boas - obrigado!
PowerShell , pontuação 601 546
Abordagem ingênua; Eu apenas peguei os pontos do código e os converti em decimal, subtraídos 32, então esse código os trata como um charantes de -joinreuni-los novamente em uma única string.
901, ai
686: /
Gelatina , 321 bytes + 2 letras = pontuação 361
Isso é hediondo e alguém pode definitivamente fazer melhor.
Verificar pontuação .
na verdade, menos mau do que parece
Python 3 , 380 bytes + 5 letras = 480
Retina , 140 caracteres, 159 bytes, 14 letras = pontuação 439
Experimente online! Editar: Salva 1 letra mudando de K`para uma nova linha. Agora também funciona no Retina 0.8.2 (mas o título seria muito longo).
Japt -S , 304 286 bytes + 2 1 letra s = 344 306
Bem, isso é horrível!
PHP -a, 402 bytes + 200 de penalidade = pontuação de 602
Resposta do porto de Artermis Fowl e minha primeira entrada no codegolf!
Deixa-me desejando que chr()apenas pudesse suportar UTF-8; esses 3 bytes extras + 40 caracteres dói!
05AB1E , pontuação 209 (189 bytes + 20 de penalidade por uma letra)
A única carta é ç. Os símbolos de moeda €£¢não são considerados letras em Unicode.
Python 3 , 397 bytes + 19 letras = 777 pontos
Resposta do porto de AdmBorkBork .
— Artemis ainda não confia em SE
1 letra a menos?
562 , -2 se estiver usando python 2
O TIO não funciona na minha organização, então terei que esperar para chegar em casa e adicioná-los.
R , 384 bytes + 12 letras * 20 pontos = pontuação 684
05AB1E , pontuação 383 365 (325 bytes + 2 letras * 20 de penalidade)
Porto da resposta da geléia de @HyperNeutrino .
Vai tentar melhorar aqui em diante. O número é divisível por vários números , mas nenhum deles salvaria bytes, infelizmente, e os divisores maiores compactados contêm pelo menos 1 letra.
-18 (+2 bytes e -20 de penalidade) graças a @Grimy , substituindo a letra J(ingressar) por .««(reduzir concatenando).