Sortez la chanson de l'alphabet ŋarâþ crîþ sans utiliser (m) de lettres


12

Votre objectif est d'écrire un programme qui ne prend aucune entrée et génère le texte suivant:

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.

Mais il y a un hic: pour chaque lettre (n'importe quel caractère dont la catégorie générale en Unicode commence par L) dans votre source, vous obtenez une pénalité de 20 caractères! (Pour référence, le texte à imprimer comporte 81 lettres.)

Le code Perl 6 ci-dessous a 145 octets et 84 lettres, il obtient donc un score de 1845:

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

Le code ci-dessous a 152 octets et 70 lettres, il obtient donc un score de 1552:

$_="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

Les failles standard sont interdites.

À l'origine, je pensais à interdire complètement les lettres, mais je ne pense pas qu'il existe de nombreuses langues qui rendent cela possible. Vous êtes plus que les bienvenus pour essayer.

(ŋarâþ crîþ [ˈŋaɹa̰θ kɹḭθ] est l'un de mes conlangs. Je voulais mettre en majuscule son nom ici, mais j'obtiens le vilain gros eng ici. Oh bien, la langue n'utilise pas de majuscules dans sa romanisation de toute façon.)

Edit: réalisé que l'une des lignes est erronée, mais je vais la garder car il y a déjà des réponses. La version correcte de la troisième ligne est ma a fa ga pa ta ča; à votre choix, vous pouvez choisir de produire le texte corrigé à la place.


11
La complexité de kolmogorov , la source restreinte et la notation spéciale sont toutes sortes de choses qui bénéficient grandement d'un examen attentif dans le bac à sable. Actuellement, il semble que la meilleure approche pour relever ce défi serait de simplement écrire tous les points de code en décimal, puis de les transformer en texte avec une fonction intégrée, avec un raccourci pour coder tous les as - ou non, selon le nombre il faudrait des lettres, car 20 caractères est une très grosse pénalité (même si tout le reste est marqué par octets, ce n'est pas tout à fait bien défini ...)!
Unrelated String

4
Et compte tenu de l'invocation d'Unicode, certaines règles explicites régissant les pages de codes spéciales utilisées par la plupart des golflangs sont probablement nécessaires (à côté peut-être d'un lien vers un script pour valider la notation).
Chaîne indépendante

Réponses:


21

7 , 410 caractères, 154 octets en codage 7, 0 lettres = score 154

55104010504200144434451510201304004220120504005434473340353241135014335450302052254241052253052244241052335452241114014241310052340435303052335442302052335500302052335430302052313340435303135014243241310335514052312241341351052302245341351525755102440304030434030421030442030424030455733413512410523142410523030523112411350143355142410523414252410523102410523002410523413342411145257551220304010420030455741403

Essayez-le en ligne!

Dans un défi qui n'aime pas utiliser des lettres, quelle meilleure langue à utiliser qu'une langue composée uniquement de chiffres?

Il s'agit d'un programme complet qui se termine par un plantage, il y a donc une sortie étrangère vers stderr, mais stdout est correct.

Explication

Un programme 7, lors de sa première itération, pousse simplement un certain nombre d'éléments dans la pile (car sur les 12 commandes qui existent dans 7, seulement 8 d'entre elles peuvent être représentées dans un programme source, et ces 8 sont spécialisés pour écrire du code pour pousser des structures de données particulières vers la pile). Ce programme n'utilise pas la 6commande (qui est le moyen le plus simple de créer des structures imbriquées, mais a tendance à ne pas apparaître littéralement dans un programme source), donc ce ne sont que les 7commandes qui déterminent la structure; 7pousse un nouvel élément vide en haut de la pile (alors que les commandes 05s'ajoutent simplement en haut de la pile). On peut donc ajouter des espaces au programme pour montrer sa structure:

551040105042001444344515102013040042201205040054344 7

33403532411350143354503020522542410522530522442410523354522411140142413100523
40435303052335442302052335500302052335430302052313340435303135014243241310335
514052312241341351052302245341351525 7

55102440304030434030421030442030424030455 7

33413512410523142410523030523112411350143355142410523414252410523102410523002
41052341334241114525 7

551220304010420030455 7

41403

Les éléments proches de la fin du programme sont poussés en dernier, ils sont donc en haut de la pile au début de la deuxième itération. Sur cette itération, et toutes les itérations futures, l'interpréteur 7 fait automatiquement une copie du haut de la pile et l'interprète comme un programme. Le littéral 41403pousse le (non littéral, code en direct) 47463(7 ont 12 commandes mais seulement 8 d'entre elles ont des noms; en tant que tel, j'utilise gras pour afficher le code et non gras pour montrer le littéral qui génère ce code, ce qui signifie c'est-à- 4dire la commande qui s'ajoute 4à l'élément de pile supérieur). Donc, le programme qui s'exécute sur la deuxième itération est 47463. Voici ce que cela fait:

47463 
4 Permutez        les deux éléments de pile supérieurs, ajoutez un élément vide entre
  7       Ajoutez un élément de pile vide en haut de la pile
   4      Permutez les deux éléments supérieurs de pile, ajoutez un élément vide entre
    6     Déterminez quelles commandes généreraient l'élément de pile supérieur;
        ajoutez cela à l'élément ci-dessous (et ouvrez l'ancien haut de la pile)
    3    Sortez l'élément de pile supérieur, éclatez l'élément ci-dessous

C'est plus facile à comprendre si nous regardons ce qui arrive à la pile:

  • ... d c sur b un 47463 (code à exécuter: 47463)
  • ... d c b vider un (code à exécuter: )47463 7463
  • ... d c b vider un vide (code à exécuter: )47463 463
  • ... d c b vide vide vide un (code à exécuter: )47463 63
  • ... d c b vide vide " a " (code à exécuter: )47463 3
  • D c b vide (code à exécuter: vide )47463

En d'autres termes, nous prenons le haut de la pile a , déterminons quel code est le plus susceptible de l'avoir produit et éditons ce code. L'interpréteur 7 dépose automatiquement les éléments vides du haut de la pile à la fin d'une itération, nous nous retrouvons donc avec le 47463dos au sommet de la pile, tout comme dans le programme d'origine. Il devrait être facile de voir ce qui se passe ensuite: nous finissons par parcourir chaque élément de la pile les uns après les autres, en les sortant tous, jusqu'à ce que la pile déborde et que le programme plante. Nous avons donc essentiellement créé une boucle de sortie simple qui examine le code source du programme pour déterminer ce qu'il faut sortir (nous ne sortons pas les structures de données qui ont été poussées vers la pile par notre 05commandes, nous recréons plutôt les commandes qui ont été utilisées en regardant quelles structures ont été créées et en les éditant). Ainsi, le premier élément de sortie de données est 551220304010420030455(le code source qui génère l'élément de pile deuxième à partir du haut), le second est 3341351…114525(le code source qui génère l'élément troisième pile à partir du haut), etc.

De toute évidence, cependant, ces morceaux de code source ne sont pas sortis non codés. 7 contient plusieurs langages spécifiques au domaine pour le codage de la sortie; une fois qu'une langue spécifique au domaine est choisie, elle reste utilisée jusqu'à ce qu'elle soit explicitement effacée, mais si aucune des langues n'a encore été choisie, le premier chiffre du code en sortie détermine laquelle des langues utiliser. Dans ce programme, seules deux langues sont utilisées: 551et 3.

551est assez simple: il s'agit essentiellement de l'ancien code Baudot / télétype utilisé pour transmettre des lettres sur des télétypes, sous forme de jeu de caractères à 5 bits, mais modifié pour rendre toutes les lettres en minuscules. Ainsi, le premier morceau de code à sortir décode comme ceci:

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

Comme on peut le voir, nous ajustons chaque caractère en deux chiffres octaux, ce qui est un taux de compression assez décent. Des paires de chiffres dans la plage 0-5 nous offrent 36 possibilités, par opposition aux 32 possibilités dont Baudot a besoin, donc les quatre autres sont utilisés pour des commandes spéciales; dans ce cas, la 55fin efface le format de sortie mémorisé, nous permettant d'utiliser un format différent pour la prochaine sortie que nous produisons.

3est conceptuellement encore plus simple, mais avec une touche. L'idée de base est de prendre des groupes de trois chiffres (encore une fois, dans la plage 0-5, car ce sont les chiffres pour lesquels nous pouvons garantir que nous pouvons recréer le code source d'origine à partir de sa sortie), de les interpréter comme trois chiffres nombre en base 6, et juste le sortir comme un octet en binaire (nous permettant ainsi de sortir les caractères multi-octets dans la sortie souhaitée simplement en sortant plusieurs octets). La torsion, cependant, vient du fait qu'il n'y a que 216 nombres à trois chiffres (avec des zéros de tête possibles) dans la base 6, mais 256 octets possibles. 7 contourne cela en reliant des nombres de 332₆ = 128₁₀ à deux octets différents; 332peut produire soit l'octet 128 ou 192, 333soit l'octet 129 ou 193, et ainsi de suite, jusqu'à 515ce que les sorties soit l'octet 191 ou 255.

Comment le programme sait-il laquelle des deux possibilités de sortie? Il est possible d'utiliser des triplets de chiffres de 520haut en bas pour contrôler cela explicitement, mais dans ce programme, nous n'avons pas à: la valeur par défaut de 7 est de choisir tous les octets ambigus de telle sorte que la sortie soit valide UTF-8! Il s'avère qu'il y a toujours au plus une façon de le faire, donc tant que c'est UTF-8 que nous voulons (et nous le faisons dans ce cas), nous pouvons simplement le laisser ambigu et le programme fonctionne de toute façon.

La fin de chacune des 3…sections est 525, ce qui réinitialise le format de sortie, nous permettant de revenir à 551la section suivante.


Il s'agit soit de 410 octets + 0 lettres dans la représentation non empaquetée, soit de 154 octets + beaucoup de lettres dans la représentation empaquetée. Compter les octets dans l'un et les lettres dans l'autre semble compliqué.
Grimmy

1
@Grimy: vous confondez les octets avec les caractères. La représentation empaquetée se compose de 154 octets dans le codage 7 qui codent 410 chiffres octaux, chacun étant un chiffre et non une lettre. Votre raisonnement implique que, par exemple, ɓdans Jelly n'est pas une lettre (parce que son encodage dans l'encodage de Jelly correspond au code de contrôle "CSI" s'il est interprété dans un jeu de caractères typique de 8 bits, plutôt qu'une lettre). Tout comme Jelly, 7 utilise également un encodage personnalisé; mais comme 7 n'utilise pas de lettres, le codage n'a pas besoin de coder les lettres et ne peut donc pas.
ais523

10

Haskell, 0 lettres, 423 octets = score 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]

Essayez-le en ligne!


6

Gelée ,  274 260  212 octets + 2 lettres =  314 300  252

-48 octets grâce à 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

(Utilisations !"#$%&'()*+,-./0123456789:;<=>?@V\_¤×Ọ‘“”dont Vet sont des lettres Unicode et sont utilisées une fois chacune)

Essayez-le en ligne!




@NickKennedy J'avais joué avec le golf sur le numéro, mais je n'ai pas pris de recul et je ne cherchais qu'à compenser les ordinaux, bonnes choses - merci!
Jonathan Allan

3

PowerShell , les scores 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)})

Essayez-le en ligne!

Approche naïve; Je viens de prendre les points de code et de les convertir en décimal, soustrait 32, puis ce code les traite comme un charavant de -joinles réintégrer ensemble dans une seule chaîne.




3

Gelée , 321 octets + 2 lettres = score 361

3343781777797791350694255572961968519437585132057650209974147122192542459108221624793330048943528237823681411832154316740173721249435700067706302064570847610741421342406380917446310820012503592770000532190167243585300911078873144513786923305473352724133578818457026824110152529235136461572588027747840738399150398304b354Ọ

Essayez-le en ligne!

C'est hideux et quelqu'un peut certainement faire mieux.

Vérifiez le score .


1
en fait moins mauvais qu'il n'y paraît
ASCII uniquement

2

Python 3 , 380 octets + 5 lettres = 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.""")

Essayez-le en ligne!


1

Rétine , 140 caractères, 159 octets, 14 lettres = score 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`ŋ\`-{

Essayez-le en ligne! Modifier: 1 lettre enregistrée en passant d' K`une nouvelle ligne. Fonctionne désormais également dans Retina 0.8.2 (mais le titre serait trop long).


1

Japt -S , 304 286 octets + 2 1 lettre s = 344 306

Eh bien, c'est tout simplement horrible!

"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} ¬

Essayez-le


1

PHP -a, 402 octets + 200 pénalités = 602 score

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);}

Port of Artermis Fowl's answer , and my first codegolf entry!

Me laisse souhaiter que cela chr()pourrait simplement prendre en charge UTF-8; ces 3 octets supplémentaires + 40 caractères font mal!


Bienvenue à PPCG :)
Shaggy

1

05AB1E , score 209 (189 octets + 20 pénalités pour 1 lettre)

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

Essayez-le en ligne!

La seule lettre est ç. Les symboles monétaires €£¢ne sont pas considérés comme des lettres en Unicode.


0

Python 3 , 397 octets + 19 lettres = 777 score

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

Essayez-le en ligne!

Port de la réponse d' AdmBorkBork .




562 , -2 si vous utilisez python 2
ASCII uniquement

TIO ne fonctionne pas dans mon organisation, donc je vais devoir attendre pour rentrer chez moi pour les ajouter.
Artemis ne fait toujours pas confiance au SE

0

R , 384 octets + 12 lettres * 20 points = score 684

Pas terriblement 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))

Essayez-le en ligne!


0

05AB1E , le score 383 365 (325 octets + 2 lettres * 20 pénalité)

3343781777797791350694255572961968519437585132057650209974147122192542459108221624793330048943528237823681411832154316740173721249435700067706302064570847610741421342406380917446310820012503592770000532190167243585300911078873144513786923305473352724133578818457026824110152529235136461572588027747840738399150398304 354вç.««

Port de @HyperNeutrino 's Jelly answer .

Je vais essayer de m'améliorer ici. Le nombre est divisible par un tas de nombres , mais aucun d'entre eux ne sauverait malheureusement aucun octet, et les plus grands diviseurs compressés contiennent au moins 1 lettre.

-18 (+2 octets et -20 de pénalité) grâce à @Grimy , en remplaçant la lettre J(join) par.«« (réduire en concaténant).

Essayez-le en ligne.


1
Jpeut être .««pour -18. Ou pour une approche complètement différente, voir ma réponse .
Grimmy

@Grimy Merci! :) Et belle réponse!
Kevin Cruijssen
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.