C'est très simple: votre programme ou fonction doit générer le texte suivant:
Elizabeth obnoxiously quoted (just too rowdy for my peace): "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG," giving me a look.
Petits caractères
Vous pouvez écrire un programme ou une fonction , qui renvoie la sortie sous forme de chaîne ou l'imprime dans STDOUT (ou l'alternative la plus proche). Vous pouvez éventuellement inclure une seule nouvelle ligne de fin dans la sortie.
Notation
Le nombre d'octets dans votre code multiplié par le nombre d'octets uniques dans votre code
Le score le plus bas l'emporte.
Par exemple, un brainfuck ou une réponse d'espaces blancs aurait un énorme avantage ici, car le multiplicateur serait très faible (8 et 3 respectivement). Cependant, généralement, l'écriture de programmes dans ces langues produit un code beaucoup plus long qui peut annuler cet avantage.
Les failles standard qui ne sont plus drôles sont interdites .
la source
bytecount~Log(X,unique)
, avec X une constante pour ce problème. Donc unique ^ bytecount ~ constant. Le calcul de ce score (log2) donnepython2_mbomb007 728, python2_carpetpython 744, ruby 756, Fish 825, Insomnia 1148, cjam 1277, whitespace 1484, brainfuck 3546
. Donc, sauf pour la réponse de brainfuck, elle est relativement constante ...Réponses:
Insomnie , 575 octets * 4 = 2300
Utilise 4 caractères
dye=
.Solution 1b (non publiée): 783 octets * 3 = 2349
N'utilise que 3 caractères
ey=
.Solution 1: 826 octets * 3 = 2478
Utilise seulement 3 caractères:
yo~
. Un programme est utilisé pour générer cela.Actuellement, tous les programmes utilisent uniquement les instructions 0, 1, 2, 6. En d'autres termes, ils manipulent les bits dans un seul octet et impriment le résultat.
la source
CJam,
266281456 octets *14127 unique =372433723192Essayez-le en ligne.
Explication
La stratégie que j'ai utilisée consiste à traiter chaque caractère de la chaîne comme un chiffre de base 123 et à le coder comme un nombre décimal dans le programme. Le programme reconvertit ensuite ce nombre en base 123 et mappe chaque chiffre de base 123 en un caractère. Parce qu'il est difficile d'expliquer pourquoi le programme est dans son état actuel, j'expliquerai chaque version de celui-ci.
Voici à quoi ressemblait la fin du programme dans la première version:
Cela met en œuvre la stratégie de la manière la plus simple possible. Le nombre, codé normalement en base 10, est reconverti en base 123 et chaque chiffre de base 123 est mappé en retour à un caractère. Mais cela utilise 4 caractères non numériques uniques, et être en mesure de se débarrasser de l'un d'entre eux vaut probablement la taille atteinte car il faut utiliser un code moins simple.
Tout d' abord, je me suis aperçu que je pouvais me débarrasser des
b
et les:
opérateurs en les créant à l' exécution comme leurs valeurs de caractères ASCII reconvertis en un caractère (avec le déjàc
opérateur) et de les évaluer avec l'~
opérateur. Il s'est avéré être un peu délicat de le faire avec l':
opérateur, car il doit être analysé avec l'c
opérateur suivant . J'ai résolu ce problème en produisant les caractères:
,c
puis en produisant et en évaluant le caractère+
, qui concatène les deux anciens caractères dans la chaîne:c
qui peut ensuite être évaluée correctement.Deuxièmement, je me suis rendu compte que l'
~
opérateur que je venais d'introduire avait une nouvelle variante pratique surchargée: quand on lui donne un nombre, il produit le complément au niveau du bit. En l'utilisant deux fois de suite après un nombre, je pouvais introduire une rupture de jeton dans la source sans effet de calcul résultant, me permettant de remplacer les espaces utilisés pour séparer les nombres par~~
.Le résultat final est 15 octets de code supplémentaires à la fin, mais ce coût est largement compensé par l'avantage d'éliminer 2 caractères uniques sur 14. Voici une comparaison de la fin de la première version avec la fin de la deuxième version:
Utiliser moins que les 2 opérateurs que j'utilisais serait impossible, mais je voulais toujours moins de caractères uniques. La prochaine étape consistait donc à éliminer les chiffres. En changeant l'encodage du nombre afin que chaque chiffre décimal soit vraiment un chiffre de base 5, je pourrais potentiellement éliminer les chiffres 6-9. Avant d'éliminer quoi que ce soit de la fin du programme, cela ressemblait à ceci:
Comme mentionné précédemment, l'élimination de l'espace est facile. Mais
b
,:
etc
ne serait pas si facile, car leurs codes de caractères sont98
,58
et99
, respectivement. Tous contenaient des chiffres marqués pour élimination, j'ai donc dû trouver des moyens de les dériver tous. Et les seuls opérateurs numériques utiles avec des valeurs de caractères ne contenant pas 5-9 étaient décrémenter, incrémenter, multiplier et ajouter.Pour
98
, j'ai d'abord utilisé100~~40c~40c~
, qui décrémente100
deux fois. Mais j'ai réalisé que je pouvais encore utiliser l'~
opérateur, car le complément au niveau du bit me permet d'obtenir des nombres négatifs qui, une fois ajoutés, me permettent d'émuler la soustraction. J'ai donc utilisé100~~1~43c~
, ce qui ajoute100
et-2
et est 2 octets plus petit. Pour58
, j'ai utilisé44~~14~~43c~
, qui ajoute44
et14
. Et pour99
, j'ai utilisé100~~40c~
, qui diminue100
.Le résultat final est assez grand et obscur, mais le coût du nombre et du code de traitement beaucoup plus importants a été légèrement dépassé par le gros avantage d'éliminer 5 caractères uniques sur 12. Voici une comparaison de la fin finale du programme avant les éliminations et après éliminations:
la source
98
,58
et99
) sont encore hors de portée. Et l'augmentation de la base ne fait que diminuer la taille totale du programme de 8 à 10%, ce qui n'est pas suffisant pour compenser le score de 10 à 15% obtenu en ayant un nouveau caractère unique. De même, la réintégration de l'b
opérateur n'en vaut pas la peine.floor(log_b(x)+1)
et il contiendrab
différents symboles. Le score est doncb*floor(log_b(x)+1)
. x est un grand nombre donné, et si vous tracez ceci pour b, vous constaterez que le minimum est à peu près à b = 3. C'est-à-dire que la longueur diminue légèrement lorsque vous utilisez des bases plus élevées (log), mais la taille du jeu de caractères augmente linéairement, donc cela n'en vaut pas la peine. A fait un simple programme d'espaces blancs, mais il n'obtient qu'un score de 4134.Espace,
1157937 octets * 3 unique =34712811Par demande populaire (?), Je publie ma solution d'espace blanc.
Afin de réduire le code nécessaire, j'ai codé en dur la chaîne entière en un seul nombre binaire (7 bits pour chaque octet). Une simple boucle extrait les caractères et les imprime.
Code source sur filebin.ca.
REMARQUE: les spécifications permettent des entiers arbitraires de grande taille , mais l' interpréteur Haskell sur la page officielle est limité à 20 bits. Utilisez, par exemple, cet interpréteur ruby sur github / hostilefork / whitespaces.
Le script ruby pour créer le programme d'espaces (l = WHITESPACE, t = TAB, u = NEWLINE, tout ce qui après // est ignoré, écrit dans un fichier
prog.h
):À titre d'illustration, le programme d'espaces sous forme lisible par l'homme. Voir ci-dessous pour un script simple pour le convertir en un véritable programme d'espaces blancs.
Fondamentalement, la chaîne à afficher est un entier long et vous devez réduire son score.
J'ai donc cherché une langue avec seulement 0/1, mais je n'en ai pas trouvé, puis je me suis souvenu qu'il y avait des espaces et je l'ai essayé. Dans les espaces, vous pouvez saisir directement des nombres binaires avec des 0 et des 1.
Ancien code, score moins bon mais plus intéressant
Ancien code sur filebin .
Le script ruby que j'ai utilisé pour créer le programme (l = WHITESPACE, t = TAB, u = NEWLINE, tout après
//
ignoré, écrit dans un fichierprog.h
):À titre d'illustration, le programme d'espaces sous forme lisible par l'homme. Voir ci-dessous pour un script simple pour le convertir en un véritable programme d'espaces blancs.
Ce programme d'espaces en lui-même est assez simple, mais il existe trois optimisations de golf:
lul
pour cloner la pile quand il y a un personnage en doubleltl
pour cloner la nième entrée de la pile si elle est plus courte que de pousser directement le caractèreUn script ruby simple pour convertir mon code d'espaces lisible par l'homme en un véritable programme d'espaces (lire un fichier
prog.h
et écrire dans un fichierprog.ws
):la source
Ruby 144 octets * 39 Unique = 5616
Parfois, le plus simple est le meilleur.
la source
Brainfuck, 1264 octets * 7 unique = 8848
Oui, c'est un score terrible.
la source
+.
pas sûr qu'il serait plus petit cependant.+
et.
j'obtiens 15018 * 2 =30,036
.> <> (Poisson) - 578 octets * 8 unique = 4624
Mon score n'est pas aussi compétitif que je l'espérais, mais je pensais que cette solution était encore suffisamment intéressante pour être publiée.
Explication
La première section de code est une longue chaîne de chiffres 0-4 qui représente une représentation de base à 5 chiffres pour chaque caractère de la chaîne. Le code restant profite de l'
p
opérateur de Fish qui vous permet de modifier le code source du programme pendant son exécution. En utilisant cet opérateur, j'ai pu générer le code Fish nécessaire pour reconvertir les caractères de base 5 en base 10 et les sortir, puis remettre ce code dans le code source au début du fichier avant que l'interprète n'atteigne la fin de la ligne et enroulé autour. Lorsque l'interpréteur atteint la fin de la ligne, le code a été modifié pour ressembler à ceci:Lorsque le code s'enroule autour et frappe l'
v
opérateur, il descend à la deuxième ligne, frappe l'>
opérateur et passe en boucle, convertissant à chaque fois le codage de base 5 en une valeur ascii de base 10, puis émettant cette valeur. Lorsqu'il n'y a plus de valeurs sur la pile, l'?
opérateur passera à;
et le programme se terminera.la source
7 , 273 octets × 7 octets uniques = 1911, non concurrentiels (défi de postdates de langue)
Essayez-le en ligne!
Malheureusement, c'est un vieux défi, ce qui signifie que je ne gagne pas avec l'une de mes langues les plus récentes. Cependant, le langage a été créé sans aucune connaissance du défi (je suis juste tombé au hasard sur lui dans des "questions connexes"), mais il s'est néanmoins avéré être parfaitement adapté.
7 programmes sur PPCG sont normalement soumis dans un format compressé, regroupant huit commandes en trois octets (la langue a douze commandes, mais seulement huit peuvent apparaître dans un fichier source, ce qui signifie que trois bits suffisent). Cependant, le langage prend également en charge un format octal dans lequel chaque commande est écrite sous la forme d'un chiffre ASCII, et c'est ce que j'ai utilisé ici, ce qui signifie que seuls sept octets distincts sont utilisés (la
6
commande n'est pas nécessaire dans un programme qui imprime simplement une chaîne simple).Le programme est très simple; il se compose de deux éléments de pile, une longue chaîne qui est simplement imprimée textuellement, a
7
pour séparer les éléments (malheureusement inévitable), et403
qui est un moyen simple d'imprimer une chaîne constante en 7 (40
échappe le deuxième élément de pile, tout en le déplaçant vers le haut de la pile, puis l'3
imprime et jette l'ancien premier élément de pile, c'est-à403
- dire lui - même).Alors, comment ai-je obtenu la chaîne aussi courte que 269 octets? 7 prend en charge plusieurs formats d'E / S, et l'un de ses formats est US-TTY , un jeu de caractères (en particulier, une variante de Baudot) qui était largement utilisé avant l'invention de l'ASCII. (Le
5
début du deuxième élément de pile, c'est-à-dire le début du programme, spécifie le codage de la chaîne; le reste est le contenu de la chaîne lui-même.) Il s'agit d'un jeu de caractères à cinq bits et les commandes0
à5
peut être stocké en toute sécurité dans des chaînes tout en étant échappé de manière cohérente (de sorte que l'échapper une fois reproduira exactement l'original), de sorte que le langage utilise des paires de commandes (36 options) pour coder les caractères de US-TTY (32 options, dont 4 pour directives à l'interprète lui-même). Bien sûr, il y a plus de 32 caractères uniques que les gens pourraient vouloir sortir (et plus de 32 caractères apparaissent dans la chaîne), donc deux des caractères sont des "codes de décalage" qui basculent entre quatre jeux de caractères (lettres majuscules, lettres minuscules) , des chiffres et une "extension de chiffres" définie par l'utilisateur que 7 utilise pour les caractères ASCII restants qui ne figurent pas dans les autres jeux de caractères; cependant, tous les caractères de la chaîne sont "nativement" dans US-TTY donc les détails de l'extension n'a pas d'importance). Ici'Je compte dix décalages ajoutés à 124 caractères d'entrée, un ratio assez négligeable. En tant que tel, la possibilité d'utiliser seulement un peu plus de deux octets d'entrée par caractère d'entrée, multiplié par 7 octets uniques, signifie que le score de ce défi est incroyablement bon. (Je suppose qu'un langage spécialement conçu pour ce défi utiliserait une sorte de compression de chaîne, plutôt qu'un jeu de caractères préexistant, mais même si Baudot et US-TTY n'étaient pas conçus pour le golf, ils sont toujours assez concis .)
la source
Python 2,
163147145143 octets *353635 uniques =5705529252205005C'est probablement aussi bon que je vais l'obtenir.
Modifications:
.capitalize()
en faveur de l'utilisationE
.'
place des guillemets d'échappement de barre oblique inverse.+
et certains espaces pour utiliser des virgules dans l'print
instruction.la source
Python 2,
14508 11700 11088 10164 9486 9746 7860145octets * 36 unique = 5220J'ai vu le titre et j'ai pensé que c'était un défi intéressant pour le Python plutôt verbeux. Ce sont mes notes lorsque j'ai abordé ce problème.
Mon premier essai a réduit les uniques à 31:
Je pensais que je pouvais faire mieux. En utilisant
map
, les uniques se résumaient à 26:À peu près à cette époque, j'ai remarqué dans le texte de la question que le score était
uniques * bytes
, pas seulement unique! Cela signifiait que mes scores pour ce qui précède étaient 14508 et 11700. Pas très compétitif. Donc, je réduit maintenant les octets en stockant le texte sous forme de chaîne hexadécimale:La taille a été réduite mais les caractères plus uniques. Mais si j'utilisais une chaîne décimale à 2 chiffres avec un décalage de 32:
Cela a le même nombre d'octets mais enregistre 3 uniques.
Je fais éclore un nouveau plan. Si j'emballe un entier long Python avec des caractères 7 bits, je pourrais extraire chacun en décalant:
Eh bien, cela a réduit le score à 9486. Une expérience intéressante, mais loin d'être suffisante. Maintenant, que se passe-t-il si je me débarrasse des noms de fonction et que je me fie au formatage des chaînes?
Je n'ai plus que 22 uniques, mais le score ne s'améliore pas.
Ok, que se passe-t-il si je prends la voie évidente et que j'imprime la chaîne:
Score de 7860. J'aurais dû le faire en premier. Mais je n'aurais pas autant appris.
Je suppose que je pourrais réduire les uniques de 26 si je produisais dynamiquement les parties majuscules, donc:
Je pense que Python ne sera pas beaucoup mieux que 5220. La tâche de minimiser les caractères uniques en Python était certes instructive.
Mise à jour: mbomb007 a une meilleure solution Python avec un score de 5005. Beau travail.
la source
> <> (Poisson) - 138 octets * 65 Unique = 8970
L'itinéraire simple, c'est-à-dire Hello World:
Eh bien, pour ma première incursion dans> <>, c'était un défi. Je pense que je vois des améliorations, mais c'était amusant de l'apprendre :)
Ou pour le rendre trop compliqué - 1567 octets * 27 Unique = 42309
la source
r
pile en inversant :) Vous pouvez également déplacer la finaleo
vers l'espace vide au début de la deuxième ligne.f f + 2 + o
autant de fois dans le compliqué?05AB1E , 380 octets * 11 caractères = 4180 score
Ceci est potentiellement non concurrentiel
Essayez-le en ligne!
Pousse la représentation en base 5 des caractères ASCII réunis.
Se divise en morceaux de 3, reconvertit en décimal.
Convertit un entier ASCII en caractère.
Rejoint ensemble.
la source
Perl 6, 139 octets * 36 unique = 5004
la source
Java 8, 141 octets * 64 caractères uniques = 9 024
141 octets, 64 caractères uniques. Les approches autres que le simple "retour de la chaîne" augmentent le nombre d'octets sans économiser beaucoup sur les caractères utilisés.
la source
Perl 5 , 137 octets * 35 unique = 4795
Essayez-le en ligne!
la source
Tcl , 345 octets, 345 x 13 = 4485
Essayez-le en ligne!
Tcl , 337 octets, 337 x 15 = 5055
Essayez-le en ligne!
Tcl , 329 octets, 329 x 16 = 5264
Essayez-le en ligne!
Tcl , 333 octets, 333 x 16 = 5328
Essayez-le en ligne!
Tcl , 148 octets, 148 x 37 = 5476
Essayez-le en ligne!
Tcl , 277 octets, 277 x 21 = 5817
Essayez-le en ligne!
Tcl , 371 octets, 371 x 16 = 5936
Essayez-le en ligne!
Tcl , 401 octets, 401 x 16 = 6416
Essayez-le en ligne!
Tcl , 403 octets, 403 x 16 = 6448
Essayez-le en ligne!
Tcl , 433 octets, 433 x 15 = 6495
Essayez-le en ligne!
Tcl , 473 octets, 473 x 14 = 6622
Essayez-le en ligne!
Tcl , 133 octets, 133 x 60 = 7980
Essayez-le en ligne!
la source