De nombreux langages de programmation sont écrits en utilisant uniquement ASCII imprimable, des onglets et des nouvelles lignes. Ces 97 caractères sont ensuite stockés dans des octets de 8 bits (qui sont en fait capables de contenir 256 caractères différents!), Ce qui est terriblement inefficace - en particulier dans le code-golf, où chaque octet compte! Dans ce défi, vous pourrez réduire votre score en utilisant la conversion de base.
Défi
Votre programme / fonction prend une chaîne ou un tableau de caractères en entrée, qu'il interprète ensuite comme un nombre en base 97 . Il convertit ensuite cela en un nombre de base 256 et compte le nombre de symboles (c'est-à-dire d'octets) nécessaires pour représenter ce nombre. Ce nombre sera la valeur de sortie / retour de votre programme / fonction.
Un exemple simple utilisant base-2 et base-10 (binaire et décimal): si l'entrée est 10110
, la sortie serait 2, puisque 10110 2 = 22 10 (deux chiffres nécessaires pour représenter la sortie). De même, 1101 2 devient 13 10 , ce qui donne également une sortie de 2, et 110 2 devient 6 10 , donc la sortie serait 1.
La chaîne d'entrée peut contenir les 95 caractères ASCII imprimables, ainsi que la nouvelle ligne \n
et l'onglet littéral \t
, ce qui crée un alphabet source de 97 symboles pour votre conversion de base. L'alphabet exact sera donc (en remplaçant le \t
et \n
par l'onglet littéral réel et la nouvelle ligne; notez l'espace littéral suivant la nouvelle ligne) :
\t\n !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
Notez que l'ordre de cet alphabet est important: par exemple, la base-97 \t
correspond à la décimale 0
et !
correspond à la décimale 3
.
Quelques tests: (vous n'avez pas besoin de gérer une chaîne vide)
Input Output
'[email protected]' 15
'All your base are belong to us!' 26
' abcd' 9
'~ abcd' 10
'ABCDEFGHIJK' 9
'zyxwvutsrpq' 10
'{".~"}.~' 7
'\t\t\t\t\t\t\t\t' 1 (with \t a literal tab; the result is 0, which can be represented with 1 byte)
'!\t\t\t\t\t\t\t\t' 7 (with \t a literal tab)
Notation
Si votre entrée utilise uniquement ASCII imprimable, nouvelle ligne et / ou onglet: Le score de votre programme sera la sortie de votre programme, lorsqu'il recevra son propre code source en entrée.
Si votre entrée utilise des caractères non imprimables ASCII, saut de ligne ou tabulation: le score de votre programme est simplement le nombre d'octets, comme dans code-golf .
la source
Réponses:
Python 2 , score
737271Edit: -1 grâce à @Jonathan Allan
Essayez-le en ligne!
la source
/
devrait être OK je penseor 1
peut être remplacé par|1
dans ce cas.Japt , score 19 (23 octets)
Testez-le en ligne!
Par coïncidence, je ne pense pas que cela puisse être joué beaucoup, même avec des caractères non ASCII ...
Explication
la source
Gelée ,
1817 octets - score1817-1 octet grâce à Erik le Outgolfer (pas besoin de liste de listes pour la traduction)
Essayez-le en ligne!
Comment?
--Le meilleur que j'ai obtenu avec ASCII seulement est un score de 29 :
- c'est aussi extrêmement inefficace. Il traduit les ordinaux comme ci-dessus, mais la conversion à partir de la base 97 est obtenue en répétant les valeurs et en sommant, plutôt qu'en utilisant la multiplication directe - c'est-à-dire que pour convertir,
{".~"}.~
il obtient les index ajustés[93,4,16,96,4,95,16,96]
puis inverse (U
) et les répète pour faire[[96,96,..., 97⁷ times ...,96],[16,16,... 97⁶ times ...16],[95,95,... 97⁵ times ...95],[4,4,... 97⁴ times ...4],[96,96,... 97³ times ...96],,[16,16,... 97² times ...,16],[4,4,... 97 times ...4],[93]]
puis additionner, convertit en base 256 et obtient la longueur (s'il n'a pas manqué de mémoire: p).la source
J , 36 octets, score = 30
Essayez-le en ligne!
J utilise uniquement les caractères ASCII 7 bits pour ses primitives.
Explication
la source
Gaia , 14 octets, score 14
Essayez-le en ligne!
Explication
ASCII uniquement
C'est le meilleur que j'ai pu trouver en utilisant uniquement ASCII, ce qui donne un score de 19:
La difficulté réside dans la conversion des entrées. La seule façon raisonnable de convertir à partir du système base-97 est d'utiliser
B
, car le mappage nécessite le non-ASCII¦
. De plus, il n'existe actuellement aucun moyen de créer une plage de caractères sans mapperc
sur une plage de nombres, ce qui pose le même problème. La meilleure solution que j'ai pu voir était de construire la chaîne₵R
et de l'évaluer.la source
₵R
et₵r
n'est pas facile à remplacer, bien que ce soit₸
évidemment le cas), mais il peut être intéressant de voir comment il se compare.₵
c'est le point de code 8373 et je ne peux pas non plus faire de plages de caractères en ASCII seulement, ce qui est un peu frustrant car la plupart de ce programme est ASCII.c
mais appliqué à chaque personnage,$
montre juste tous les nombres)c
la liste, ce qui seraitc¦
₵r
est facile de remplacer car je pourrais simplement l'utiliser à la256
place, je ne l'ai utilisé que parce qu'il est plus court d'un octet et que le programme n'était pas ASCII de toute façon.Python 2 , score 60
Essayez-le en ligne!
Correspondance avec la base 97
La valeur d'un caractère est obtenue par
ord(c)-[30,9][c<' ']
: son code ASCII, moins 9 pour les tabulations et les retours à la ligne (qui précèdent' '
lexicographiquement), ou moins 30 pour tout le reste.Conversion en un nombre
Nous utilisons
reduce
pour convertir la chaîne en nombre. C'est équivalent à l'informatiqueLongueur de base 256 de calcul
La valeur de retour de
bin
est une chaîne qui ressemble un peu à ceci:Appelez sa longueur
L
. Une valeur avec unen
représentation binaire -bit a une représentation enceil(n/8)
base-256 bits. Nous pouvons calculern
commeL-2
; aussi,ceil(n/8)
peut être écrit commefloor((n+7)/8)
=n+7>>3
, notre réponse estL-2+7>>3
=L+5>>3
.Le cas où la chaîne d'entrée a la valeur 0 est traité correctement, comme des
bin
retours"0b0"
, donc nous retournons3+5>>3
= 1.la source
c>=' '
ou vous mappez l' espace à 23 au lieu de 2. Dans le code ordinaire, le golfc>'\x1f'
(un octet brut) m'aurait aidé, mais ce n'est pas ASCII imprimable…APL, score 24 (octets *)
Suppose la valeur par défaut
⎕IO←1
, sinon changez simplement ¯31 en ¯30.Explication:
Exemples:
________________
*: APL peut être écrit dans son propre jeu de caractères hérité (défini par
⎕AV
) au lieu d'Unicode; par conséquent, un programme APL qui utilise uniquement des caractères ASCII et des symboles APL peut être noté comme 1 caractère = 1 octet.la source
⎕AV
(au moins pour Dyalog), tels que⍸
. Cependant, tous vos symboles comptent pour un octet chacun. Donc, pas tous les symboles APL = 1 octet comme vous le dites dans la note de bas de page. (Je pensais juste que je vous le ferais savoir.) De plus, quel dialecte APL utilisez-vous?Perl 5 , 76 + 1 (-F) = 77 octets
Essayez-le en ligne!
Comment?
Implicitement, séparez les caractères de l'entrée (
-F
), en stockant tout cela dans @F. Fermez lawhile
boucle implicite et démarrez un nouveau bloc (}{
) ( Merci, @Dom Hastings! ). Pour chaque personnage, multipliez sa valeur par 97 à la puissance appropriée. Calculez le nombre de caractères en trouvant la taille de la somme en base 256 à l'aide de logarithmes.la source
Jelly , score: 18 (octets)
Essayez-le en ligne!
la source
Rubis , 70 octets, score 58
Essayez-le en ligne!
la source
MATL (19 octets), score 16
Les caractères non imprimables (tabulation, nouvelle ligne) dans la chaîne d'entrée sont entrés en contaténant leurs codes ASCII (
9
,10
) avec le reste de la chaîne.La partie initiale
9=?1}G
n'est nécessaire qu'en raison d'un bogue dans la fonctionZa
(conversion de base), ce qui provoque son échec lorsque l'entrée se compose uniquement de "zéros" (onglets ici). Il sera corrigé dans la prochaine version de la langue.Explication
la source
Befunge-93,
8379 octets, score7465Essayez-le ici!
Le programme convertit d'abord l'entrée en un nombre en base 97, puis compte le nombre de chiffres requis pour un nombre en base 256. En tant que tel, le nombre de base 97 est énorme, si grand que TIO produira une valeur maximale de 8 pour les grandes valeurs; cependant, l'interpréteur JS s'en fiche et affichera la valeur correcte.
la source