Produza a música do alfabeto ŋarâþ crîþ sem usar (m) nenhuma letra


12

Seu objetivo é escrever um programa que não aceita e gera o seguinte texto:

ca e na ŋa va o sa;
þa ša ra la ła.
ma a pa fa ga ta ča;
în ja i da ða.
ar ħo ên ôn ân uħo;
carþ taŋ neŋ es nem.
elo cenvos.

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:

say "ca e na ŋa va o sa;
þa ša ra la ła.
ma a pa fa ga ta ča;
în ja i da ða.
ar ħo ên ôn ân uħo;
carþ taŋ neŋ es nem.
elo cenvos."

O código abaixo tem 152 bytes e 70 letras, portanto, obtém uma pontuação de 1.552:

$_="C e N ŋa V o S;
Þ Š R L Ł.
M a P F G T Č;
în J i D Ð.
ar ħo ên ôn ân uħo;
Crþ Tŋ neŋ es nem.
elo cenvos.";s:g/<:Lu>/{$/.lc~'a'}/;.say

As brechas padrão são proibidas.

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.


11
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 ...)!
String não relacionada

4
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).
String não relacionada

Respostas:


21

7 , 410 caracteres, 154 bytes na codificação 7, 0 letras = pontuação 154

55104010504200144434451510201304004220120504005434473340353241135014335450302052254241052253052244241052335452241114014241310052340435303052335442302052335500302052335430302052313340435303135014243241310335514052312241341351052302245341351525755102440304030434030421030442030424030455733413512410523142410523030523112411350143355142410523414252410523102410523002410523413342411145257551220304010420030455741403

Experimente online!

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.

Explicação

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 05são apenas anexados ao topo da pilha). Assim, podemos adicionar espaços em branco ao programa para mostrar sua estrutura:

551040105042001444344515102013040042201205040054344 7

33403532411350143354503020522542410522530522442410523354522411140142413100523
40435303052335442302052335500302052335430302052313340435303135014243241310335
514052312241341351052302245341351525 7

55102440304030434030421030442030424030455 7

33413512410523142410523030523112411350143355142410523414252410523102410523002
41052341334241114525 7

551220304010420030455 7

41403

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:

47463 
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 05comandos, 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:

551  22 03 04 01 04 20 03 04  55
     c  a  SP e  SP n  a  SP  reset output format

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.
Grimmy

1
@ 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.
precisa saber é

10

Haskell, 0 letras, 423 bytes = pontuação 423

(['\10'..]!!)<$>[89,87,22,91,22,100,87,22,321,87,22,108,87,22,101,22,105,87,49,0,244,87,22,343,87,22,104,87,22,98,87,22,312,87,36,0,99,87,22,87,22,102,87,22,92,87,22,93,87,22,106,87,22,259,87,49,0,228,100,22,96,87,22,95,22,90,87,22,230,87,36,0,87,104,22,285,101,22,224,100,22,234,100,22,216,100,22,107,285,101,49,0,89,87,104,244,22,106,87,321,22,100,91,321,22,91,105,22,100,91,99,36,0,91,98,101,22,89,91,100,108,101,105,36]

Experimente online!


6

Gelatina ,  274 260  212 bytes + 2 letras =  314 300  252

-48 bytes graças a Nick Kennedy

“19ב+49;7883,8220,8216,7884Ọ“19937801,1169680277365253“38“68112“;107¤+1+\“@“&%"("/%"@%"6%"0"3%$!<%" %"2%"-%"?%#!.%"%"1%")%"*%"4%"=%$!9/",%"+"'%":%#!%2">0"8/";/"7/"5>0$!&%2<"4%@"/(@"(3"/(.#!(-0"&(/603#“_32¤”;";/V

(Usos !"#$%&'()*+,-./0123456789:;<=>?@V\_¤×Ọ‘“”de que Ve são letras Unicode e são usados uma vez cada)

Experimente online!




@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!
Jonathan Allan

3

PowerShell , pontuação 601 546

-join(67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,78,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14|%{[char]($_+32)})

Experimente online!

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.




3

Gelatina , 321 bytes + 2 letras = pontuação 361

3343781777797791350694255572961968519437585132057650209974147122192542459108221624793330048943528237823681411832154316740173721249435700067706302064570847610741421342406380917446310820012503592770000532190167243585300911078873144513786923305473352724133578818457026824110152529235136461572588027747840738399150398304b354Ọ

Experimente online!

Isso é hediondo e alguém pode definitivamente fazer melhor.

Verificar pontuação .


1
na verdade, menos mau do que parece
ASCII-only

2

Python 3 , 380 bytes + 5 letras = 480

print("""\143\141 \145 \156\141 \513\141 \166\141 \157 \163\141;
\376\141 \541\141 \162\141 \154\141 \502\141.
\155\141 \141 \160\141 \146\141 \147\141 \164\141 \415\141;
\356\156 \152\141 \151 \144\141 \360\141.
\141\162 \447\157 \352\156 \364\156 \342\156 \165\447\157;
\143\141\162\376 \164\141\513 \156\145\513 \145\163 \156\145\155.
\145\154\157 \143\145\156\166\157\163.""")

Experimente online!


1

Retina , 140 caracteres, 159 bytes, 14 letras = pontuação 439


%# ' 1# !# 9# 2 6#;¶þ# š# 5# /# ł#.¶0# # 3# (# )# 7# č#;¶î1 ,# + &# ð#.¶#5 ħ2 ê1 ô1 â1 8ħ2;¶%#5þ 7#! 1'! '6 1'0.¶'/2 %'1926.
T`!--/-9`ŋ\`-{

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).


1

Japt -S , 304 286 bytes + 2 1 letra s = 344 306

Bem, isso é horrível!

"3 1
5
14 1
235 1
22 1
15
19 1 -37 -86 158 1
257 1
18 1
12 1
226 1 -50 -86 13 1
1
16 1
6 1
7 1
20 1
173 1 -37 -86 142 14
10 1
9
4 1
144 1 -50 -86 1 18
199 15
138 14
148 14
130 14
21 199 15 -37 -86 3 1 18 158
20 1 235
14 5 235
5 19
14 5 13 -50 -86 5 12 15
3 5 14 22 15 19 -50"·®¸®°d96} ¬

Tente


1

PHP -a, 402 bytes + 200 de penalidade = pontuação de 602

foreach([67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,8,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14] as $i){echo ''.mb_chr($i+32);}

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!


Bem-vindo ao PPCG :)
Shaggy

1

05AB1E , pontuação 209 (189 bytes + 20 de penalidade por uma letra)

•£?;\:'%¢;.'¡£/':¢?'¢°':¢°#@¢«>#%¡¤;®[¢:¥¢:©¢:¦¢;®¢>#¡£#¨¢#&¢+¢#,¢:§¡¤#¬¢#@¢#)¢#(¢#<¢#¢#/¡£#¯¢#.¢#>¢#±¢#«¡¤#?¢;¢#\¢#°¢#:¢'¢#%•[₅‰`©®_#∞158+902201401301670804020409010150250102709022¾¡.¥>:ç?

Experimente online!

A única carta é ç. Os símbolos de moeda €£¢não são considerados letras em Unicode.


0

Python 3 , 397 bytes + 19 letras = 777 pontos

print(''.join(chr(i+32)for i in[67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,78,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14]))

Experimente online!

Resposta do porto de AdmBorkBork .




562 , -2 se estiver usando python 2
somente ASCII

O TIO não funciona na minha organização, então terei que esperar para chegar em casa e adicioná-los.
Artemis ainda não confia em SE

0

R , 384 bytes + 12 letras * 20 pontos = pontuação 684

Não é muito original.

cat(intToUtf8(c(67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,78,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14)+32))

Experimente online!


0

05AB1E , pontuação 383 365 (325 bytes + 2 letras * 20 de penalidade)

3343781777797791350694255572961968519437585132057650209974147122192542459108221624793330048943528237823681411832154316740173721249435700067706302064570847610741421342406380917446310820012503592770000532190167243585300911078873144513786923305473352724133578818457026824110152529235136461572588027747840738399150398304 354вç.««

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).

Experimente online.


1
Jpode ser .««para -18. Ou para uma abordagem completamente diferente, veja minha resposta .
Grimmy

@ Grimy Thanks! :) E boa resposta!
Kevin Cruijssen 5/09/19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.