Mises à jour: délai supprimé. Vous devez pouvoir décrire la sortie - voir la nouvelle règle.
Un pangram est une phrase qui utilise au moins une fois chaque lettre de l'alphabet, comme:
Un pangram parfait utilise chaque lettre exactement une fois.
Envisagez d'écrire un programme qui est un pangram parfait, en utilisant les 95 caractères ASCII imprimables (codes hexadécimaux 20 à 7E) comme alphabet:
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
Un tel programme doit contenir exactement 95 caractères, chaque caractère ASCII imprimable apparaissant exactement une fois, mais dans n'importe quel ordre. (Il y a donc 95! = 1,03 × 10 148 possibilités.)
Votre tâche consiste à écrire ce programme de sorte que le nombre de caractères ASCII imprimables imprimés sur stdout soit aussi élevé que possible (c'est-à-dire prolifique).
Votre score est le nombre de caractères ASCII imprimables générés par votre programme (le montant total , pas le montant distinct : AABC
scores 4 tandis que ABC
scores 3) . Le score le plus élevé l'emporte.
Détails
- La sortie peut contenir n'importe quel caractère (y compris les doublons) mais seules les instances des 95 caractères ASCII imprimables comptent pour votre score.
- Vous pouvez utiliser ce JSFiddle pour compter le nombre de caractères ASCII imprimables dans n'importe quelle chaîne.
- Si votre langue n'a pas stdout, utilisez l'alternative la plus appropriée.
- Votre programme ...
- doit avoir un temps d'exécution fini (le délai a été supprimé)
- doit avoir une sortie finie
- peut contenir des commentaires
- doit compiler et s'exécuter sans erreur (non interceptée)
- ne doit pas demander ou exiger d'entrée
- doit être invariant dans le temps et déterministe
- ne doit pas utiliser de bibliothèques externes
- ne doit pas nécessiter de connexion réseau
- ne doit pas utiliser de fichiers externes
- (vous pouvez utiliser le fichier programme lui-même tant que la modification du nom du fichier ne modifie pas le comportement du programme)
- Si cette tâche est impossible, c'est un langage qui est tout simplement trop mauvais.
- Vous devez donner votre sortie exacte ou la décrire précisément si elle est trop grande pour tenir dans un message . Vous n'avez pas réellement besoin d'exécuter votre programme. Tant qu'il serait exécuté dans un laps de temps fini sur un ordinateur avec une quantité illimitée de la mémoire est valide.
Exemple
Ce programme simpliste Python 2 est une solution possible:
print 9876543210#!"$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjklmoqsuvwxyz{|}~
Il génère 9876543210
10 caractères ASCII imprimables, soit 10.
la source
a
six quadrillions de fois, où il n'est même pas possible d'obtenir une limite supérieure précise sur nombre de caractères. Quoi qu'il en soit, je suis toujours fier de mon 95, même s'il est un peu petit. La taille n'est pas tout, vous savez.Réponses:
GolfScript, plus de 2 ↑↑↑ (9871 ↑↑ 2) caractères
Imprime un entier. Profitez de la taille illimitée du registre CPU (qui détermine la longueur de chaîne maximale dans Ruby), de la mémoire et de la durée d'exécution. Le saut de ligne est uniquement destiné à la lisibilité.
Le code
Le score
Définissez b = 9871 ↑↑ 2 (voir la notation de la flèche vers le haut de Knuth ).
.? exécute f: x ↦ x ↑ x .
Le bloc interne exécute g: x ↦ f x (x) .
Puisque f (x) = x ↑ x = x ↑↑ 2 , f 2 (x) = (x ↑ x) ↑ (x ↑ x)> x ↑ x ↑ x = x ↑↑ 3 ,
f 3 (x) = ((x ↑ x) ↑ (x ↑ x)) ↑ ((x ↑ x) ↑ (x ↑ x))> (x ↑ x ↑ x) ↑ (x ↑ x ↑ x)> x ↑ x ↑ x ↑ x = x ↑↑ 4 et ainsi de suite, nous avons
g (x)> x ↑↑ (x + 1)> x ↑↑ x .
Le bloc externe exécute h: x ↦ g b (x) .
Puisque g (x) = x ↑↑ x = x ↑↑↑ 2 , g 2 (x) = (x ↑↑ x) ↑↑ (x ↑↑ x)> x ↑↑ x ↑↑ x = x ↑↑↑ 3 ,
g 3 (x) = ((x ↑↑ x) ↑↑ (x ↑↑ x)) ↑↑ ((x ↑↑ x) ↑↑ (x ↑↑ x))> (x ↑↑ x ↑↑ x) ↑ (x ↑↑ x ↑↑ x)> x ↑↑ x ↑↑ x ↑↑ x = x ↑↑↑ 4 et ainsi de suite, nous avons h (x)> x ↑↑↑ (b + 1) .
Nous commençons par l'entier 2 sur la pile, donc le code calcule h (2)> 2 ↑↑↑ (b + 1).
Le score est le nombre de chiffres décimaux de h (2) , qui est log (h (2)) + 1> log (2 ↑↑↑ (b + 1))> 2 ↑↑↑ b .
Ainsi, le score est supérieur à 2 ↑↑↑ (9871 ↑↑ 2) .
2 ↑↑↑ n croît à un rythme ridicule à mesure que n grandit. 2 ↑↑↑ 4: = 2 ↑↑ 2 ↑↑ 2 ↑↑ 2 = 2 ↑↑ 2 ↑↑ 4 = 2 ↑↑ 65536 , qui est une tour de puissance associative droite de 65536 copies de 2 :
De même, 2 ↑↑↑ 5: = 2 ↑↑ (2 ↑↑↑ 4) , qui est une tour de puissance de 2 ↑↑↑ 4 exemplaires de 2 .
Maintenant, le score n'est pas 2 ↑↑↑ 4 ou 2 ↑↑↑ 5 , il est supérieur à 2 ↑↑↑ b , où b> 2 × 10 39 428 . C'est un gros chiffre ...
la source
in `*': bignum too big to convert into `long' (RangeError)
.Perl, 70 * 18446744073709551615 * 10 ^ 987654320
Sortie:
répété 18446744073709551615 * 10 ^ 987654320 fois.
$[
est par défaut0
,~$[
est donc équivalent à18446744073709551615
.En remarque, j'ai manqué de mémoire en essayant de créer le numéro
10^987654320
.Ancienne réponse (7703703696):
La sortie est:
répété 98765432 fois.
Remarque: exécutez tous les échantillons avec
perl -Mbignum -E
la source
perl -E'say qw{m}x(9876543210*ord$")'
Bash + coreutils, 151 888 888 888 888 905 (1,5 * 10 ^ 17)
Produit des entiers de 1 à 9 x 10 15 , un par ligne. Prend beaucoup de temps.
Pourquoi
9E15
? Il s'avère que GNUseq
semble utiliser des flottants 64 bits (double) en interne. Le plus grand nombre entier que nous pouvons représenter avec ce type, avant que l'incrémentation ne cesse de fonctionner en raison d'un manque de précision, est 2 53 ou 9007199254740992. Le plus proche que nous pouvons obtenir avec la notation exponentielle est 9E15 ou 9000000000000000.Pour calculer le score, j'utilise en additionnant tous les nombres avec un nombre donné de chiffres et en ajoutant 9E15, car il y a une nouvelle ligne entre chaque nombre:
Je pourrais diriger cette sortie
od
pour un ordre de grandeur supplémentaire, mais cela rend le calcul du score beaucoup plus difficile.Réponse au changement de pré-règle:
Bash + coreutils, 18 926 221 380
Sorties 1 à 1592346780. Sur mon macbook mi-2012 (qui n'est pas si loin du benchmark lié), cela prend environ 9m45s.
Je n'ai pas pu résister à l'optimiser un peu plus, même si cela n'a probablement aucun sens.
Sortie:
la source
seq 9876543210;
?9876543210
. Vous voudrez peut-être lire la nouvelle dernière règle.GolfScript, ≈ 3 * 10 ^ (2 * 10 ^ 7) soit ≈ 3x10 20000000
Comment ça marche
Voici
X
le nombre de caractères (longueur) de la représentation sous forme de chaîne du tableau[0, 1, 2..,(87^9654321) - 1]
qui sera comme[0 1 2 3 4 ... (87^9654321) - 1]
J'essaie de calculerX
ici pour trouver mon score.(87^9654321) - 1
est à peu près10^(10^7.272415829713899)
avec18724742
des chiffres décimaux.X
est à peu près3*10^(2*10^7)
ainsiX*X
est également le même. Notez que ces valeurs sont sur un côté très inférieur car en raison des limitations de calcul de (même) wolframa , je n'ai pas pu calculersum (floor(log10(x)) + 1) for x = 1 to (87^9654321 - 1)
quelle est la vraie valeur deX
la source
87 9654321?
est justeInfinity
.2**(2**64)-1
pour Ruby 64 bits.MATLAB, 95
Code
Sortie
La sortie contient tous les caractères ASCII spécifiés, chacun exactement une fois, et dans l'ordre.
la source
Rubis, 89
Sortie:
Contient tous les caractères ASCII à l' exception,
p
,,
%
,q
,{
et}
.la source
GolfScript, 93
Sortie:
Contient tous les caractères ASCII sauf
"
et'
.la source
"
ni l''
un ni l' autre.#
de sa position actuelle et de l'ajouter#"'
à la fin. Le score baissera cependant de un.Golfscript - 27 * 2 6543 9870
C'est ma première soumission Golfscript! :)
Explication:
La sortie est une charge de listes de nombres. Considérez le code suivant:
Avec
12,
elle produit le tableau suivant:Le backtick transforme cela en chaîne, en le passant au bloc
{.+}
. Cela duplique la chaîne, puis concatène les deux, produisant:Le
1*
dit à l'interpréteur d'exécuter le bloc précédent une fois (2 1 = 2).Donc, sur cette base:
Sort la sortie de
12,`
2 n fois.la source