Dans un langage de programmation de votre choix, écrivez 95 programmes, dont chacun génère un des 95 caractères ASCII imprimables différent, sans que ce caractère ne se trouve ailleurs dans le programme .
Par exemple, si votre langage était Python , votre programme qui sort le caractère P
peut être
print(chr(80))
car P
a le code ASCII 80. Ce programme est valide car P
n'apparaît jamais dans le code source. Cependant, pour le programme qui génère des minuscules p
, quelque chose comme
print(chr(112))
serait invalide car, même s’il est imprimé p
, il p
est présent dans le code. Un programme valide pourrait être
exec(chr(112)+'rint(chr(112))')
qui imprime p
mais ne contient pas p
.
Votre objectif est de faire en sorte que chacun de vos 95 programmes soit le plus court possible. Votre score est la somme des longueurs de caractères de tous vos programmes.
Si, pour une raison quelconque, vous ne parvenez pas à écrire des programmes valides pour certains caractères, vous pouvez les marquer comme "n’a pas programmé" ou DNP et omettre totalement les programmes correspondants. De cette façon, les langages syntaxiquement stricts pourront se faire concurrence.
La réponse gagnante est la réponse qui a le score le plus bas de l'ensemble des réponses ayant le moins de DNP.
Règles
Le code source de tous vos programmes ne peut contenir que des onglets ASCII plus imprimables et des nouvelles lignes, qui sont tous comptés comme un seul caractère. (Parce que dans un encodage différent, il serait facile d'omettre des caractères qui n'existent pas!)
- Remarque: cette règle semble nécessaire, mais il existe de nombreuses langues avec différents encodages et je suis sûr que ce serait bien de voir les réponses à leurs questions. Par conséquent, vous pouvez enfreindre cette règle , utiliser les caractères de votre choix, mais si votre réponse devient non compétitive , elle ne peut gagner.
Les programmes doivent être réels, pleins programmes , selon les conventions standard de votre langue. Les extraits de fonction et les extraits REPL ne sont pas autorisés.
La sortie de chaque programme doit aller sur stdout ou l'alternative acceptée par votre langue.
Les programmes ne doivent pas demander ni avoir besoin d'une contribution. (Si l'invitation à entrer est inhérente à votre langue, c'est bon.)
Les programmes doivent être déterministes, limités dans le temps d'exécution et indépendants. Par exemple, il ne devrait pas avoir d'importance si l'un est exécuté dans un dossier séparé des autres programmes.
La sortie d'un programme doit être le caractère ASCII imprimable précis auquel il correspond, suivi facultativement par un retour à la ligne simple, rien de plus, rien de moins.
Veillez à inclure des informations sur les 95 programmes (idéalement) dans votre réponse, ainsi que votre score et tout DNP. Vous ne devez pas énumérer tous les programmes qui suivent un modèle simple comme « , ... » mais assurez - vous que vous êtes sûr tous ne fonctionne et que votre score est ajouté correctement.print(chr(80))
print(chr(81))
print(chr(82))
Pour référence, voici les 95 fichiers ASCII imprimables que vos programmes doivent générer:
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
la source
0
Réponses:
Python 2,
10751065104310401039 octetsChaque programme a la forme
print'\<octal char code>'
, sauf:'
→print"\47"
0
à travers8
→print~-<N+1>
9
→print-~8
\
→print'%c'%92
i
→exec'pr\151nt"\151"'
n
→exec'pri\156t"\156"'
p
→exec'\160rint"\160"'
r
→exec'p\162int"\162"'
t
→exec'prin\164"\164"'
Pour référence et facilité de test, voici la liste complète des programmes, séparés par une nouvelle ligne.
Tester:
-1 octet grâce à @ Sp3000!
la source
print~-<N+1>
ne fonctionne pas pour1
. Vous avez dit qu'il travaille pour0
à8
.<angle brackets>
n'est pas un code littéral. Remplacez<N+1>
par la valeur littérale deN+1
; dans ce cas, le programme1
seraitprint~-2
. Voir la liste complète des programmes.CJam, 269 octets
Chacun des programmes est sous la forme
'<char - 1>)
sauf:S
, 1 octet'
=>39c
, 3 octets)
=>'*(
, 3 octets0
=>T
, 1 octet1
=>X
, 1 octet2
=>Y
, 1 octet3
=>Z
, 1 octet4
-9
=><num-1>)
, 2 octetsLe score est:
3 * 82 + 1 + 3 + 3 + 4 * 1 + 6 * 2 = 269
la source
39c
pour'
? En outre, vous oubliez qu'un seul chiffre peut être juste ce nombre1)
for2
pour sauvegarder un octet1)
c'était ce que je voulais dire ouiTXYZ
Code machine x86 sous contrainte ASCII pour DOS,
310431012913 octetsEh bien ... c'est plus court que Java, je suppose ...
3230 octets pour presque tous les caractères, voir les exceptions ci-dessous.La plupart du temps, il ne fait que suivre le modèle:
xor
pour obtenir un pointeur vers la fin.sub
à partir des 2 derniers mots car l'opcode forint
n'est pas en ASCII.AH
et le personnage dansDL
. Les deux sontxor
édités parce que le caractère lui-même ne peut pas apparaître dans le programme et 2 n'est pas un caractère ASCII imprimable.int 21h
int 20h
La plupart du temps, si un caractère n'est pas autorisé, il peut être remplacé en twiddling un peu avec les données ou en passant à un autre registre.
Cela devient un peu plus intéressant quand vous vous trouvez soudainement incapable de soustraire ou incapable de pousser ou d'ouvrir le seul registre utilisable pour les calculs ...
la source
Brainfuck,
1770171017031686 octets60 octets enregistrés par Dennis
17 octets enregistrés par Sp3000
DNP: 46 (
.
)Tous sauf 43, 45, 60, 62, 91 et 93 sont volés sans vergogne à Esolangs.org
la source
--[>-<---]>[<->--]<[->-<]>.
travaille pour la sortie+
.-----[[----<]>>-]<.
+[+[+>]<<++++]>.
MATL,
305, 302, 300297 octetsChaque programme ressemble à ceci:
À l'exception de
Chiffres. Voici les programmes pour 0-9:
'c' Ce programme est
espace. C'est
Depuis aujourd'hui, j'ai appris que MATL traitait le caractère 0 comme un espace. Merci @LuisMendo!
Vous pouvez utiliser matl.tio pour vérifier l'un d'entre eux.
Pour référence, voici chacun d'eux:
la source
Java 8,
679865826577 octetssoupir
C’est fondamentalement un port de ma réponse Python 2 , mais avec tout ce qui se passe avec l’écriture d’un programme complet en Java.
Maintenant sans aucun DNP du tout! Merci, Kevin Cruijssen!
La plupart des programmes ont la forme
interface A{static void main(String[]a){System.out.print("\<octal char code>");}}
, sauf:interface\tA{static\tvoid\tmain(String[]a){System.out.print("\40");}}
(mais avec le\t
s remplacé par des onglets bruts)"
→interface A{static void main(String[]a){System.out.print('\42');}}
(
→interface A{static void main\u0028String[]a){System.out.print\u0028"\50");}}
)
→interface A{static void main(String[]a\u0029{System.out.print("\51"\u0029;}}
.
→interface A{static void main(String[]a){System\u002Eout\u002Eprint("\56");}}
0
→interface A{static void main(String[]a){System.out.print(1-1);}}
1
→interface A{static void main(String[]a){System.out.print(3-2);}}
2
→interface A{static void main(String[]a){System.out.print(3-1);}}
3
→interface A{static void main(String[]a){System.out.print(4-1);}}
4
→interface A{static void main(String[]a){System.out.print(5-1);}}
5
→interface A{static void main(String[]a){System.out.print(6-1);}}
6
→interface A{static void main(String[]a){System.out.print(7-1);}}
7
→interface A{static void main(String[]a){System.out.print(8-1);}}
8
→interface A{static void main(String[]a){System.out.print(9-1);}}
9
→interface A{static void main(String[]a){System.out.print(8+1);}}
;
→interface A{static void main(String[]a){System.out.print("\73")\u003B}}
A
→interface B{static void main(String[]a){System.out.print("\101");}}
S
→interface A{static void main(\u0053tring[]a){\u0053ystem.out.print("\123");}}
[
→interface A{static void main(String...a){System.out.print("\133");}}
\
→interface A{static void main(String[]a){System.out.print((char)92);}}
]
→interface A{static void main(String...a){System.out.print("\135");}}
a
→interf\u0061ce A{st\u0061tic void m\u0061in(String[]b){System.out.print("\141");}}
c
→interfa\u0063e A{stati\u0063 void main(String[]a){System.out.print("\143");}}
d
→interface A{static voi\u0064 main(String[]a){System.out.print("\144");}}
e
→class A{public static void main(String[]a){Syst\u0065m.out.print("\145");}}
f
→class A{public static void main(String[]a){System.out.print("\146");}}
g
→interface A{static void main(Strin\u0067[]a){System.out.print("\147");}}// \u0067
i
→\u0069nterface A{stat\u0069c vo\u0069d ma\u0069n(Str\u0069ng[]a){System.out.pr\u0069nt("\151");}}
m
→interface A{static void \u006Dain(String[]a){Syste\u006D.out.print("\155");}}
n
→class A{public static void mai\u006E(Stri\u006Eg[]a){System.out.pri\u006Et("\156");}}
o
→interface A{static v\u006Fid main(String[]a){System.\u006Fut.print("\157");}}
p
→interface A{static void main(String[]a){System.out.\u0070rint("\160");}}
r
→class A{public static void main(St\u0072ing[]a){System.out.p\u0072int("\162");}}
s
→interface A{\u0073tatic void main(String[]a){Sy\u0073tem.out.print("\163");}}
t
→class A{public s\u0074a\u0074ic void main(S\u0074ring[]a){Sys\u0074em.ou\u0074.prin\u0074("\164");}}
u
→interface A{static void main(String[]a){System.console().printf("%c",117);}}
v
→interface A{static \u0076oid main(String[]a){System.out.print("\166");}}
y
→interface A{static void main(String[]a){S\u0079stem.out.print("\171");}}
{
→interface A\u007Bstatic void main(String[]a)\u007BSystem.out.print("\173");}}
}
→interface A{static void main(String[]a){System.out.print("\175");\u007D\u007D
phew
Le compilateur Java traite les échappements Unicode comme
\u007B
avant tout autre traitement, ce qui permet d'écrire du code utilisant des échappements Unicode dans des identifiants et même des mots-clés. Donc, pour écrire un programme qui n’utilise pas un caractère présent dans le passe-partout, nous le substituons simplement avec lui un échappement Unicode.Pour la référence et la facilité de test, voici la liste complète des programmes, séparés par une nouvelle ligne et avec les onglets bruts remplacés par quatre espaces:
Notez que le programme
u
utiliseSystem.console()
, qui retournera null (et causera donc le code de jeter unNullPointerException
) si vous l'appelez depuis autre chose que le terminal natif de votre système d'exploitation (cmd
sous Windows, et, je suppose,bash
sous Linux / OSX) .Pour tester, créez un nouveau répertoire et placez le code ci-dessus dans un fichier nommé
printables
dans ce répertoire. Ensuite, exécutez le script Bash suivant:Le script ci-dessus mettra chaque ligne de
printables
dans son propre répertoire, les nommera tousA.java
(à l'exception du fichier qui sera impriméA
, renomméB.java
), compilera chaque fichier, exécutez-les, puis supprimez la preuve. Il faut environ dix secondes pour que les caractères ASCII imprimables apparaissent dans votre shell.Si vous utilisez Windows, exécutez à la place le fichier batch suivant:
Ce fichier de commandes adopte une approche légèrement différente. au lieu de pré-scinder les lignes, il traite le fichier ligne par ligne, compile et exécute chaque programme à tour de rôle. Encore une fois, il supprime la preuve après son achèvement.
Sauvegardé d'innombrables octets + le 1 DNP grâce à Kevin Cruijssen!
la source
class B
pour l'impressionA
interface
au lieu de classe afin de pouvoir le supprimerpublic
) et si votre système d'exploitation possède une console intégrée, vous n'avez donc pas à utiliserSystem.out.print
:interface A{static void main(String[]a){System.console().printf("%1",(char)117);}}
Eclipse, IntelliJ et les compilateurs en ligne ne disposent pas de cette console, ce qui entraîne unNullPointerException
.print
> <> ,
443437 octetsLien interprète TIO . Il y a beaucoup de modèles ici:
[num][num]*o;
: Multiplication de deux nombres, puis sortie du résultat sous forme de caractère aveco
et arrêt avec;
. > <> chiffres vont jusqu'à 15, c'est à dire0123456789abcdef
.[num][num]-n;
, qui prend la différence de deux nombres et génère un nombre avec à lan
place.'-o[invalid char]
: > <> est toroïdal. Ainsi, lorsque le pointeur d'instruction atteint la fin d'une ligne, il revient au début. Dans ce cas, le code sera exécuté deux fois, c'est-à-dire'-o[char]'-o[char]
. La première'-o[char]'
partie pousse trois caractères dans la pile,-
calcule'o' - [char]
puiso
affiche le résultat sous forme de caractère. > <> puis des erreurs se produisent lorsqu'il atteint[char]
, soit en raison d'une commande non reconnue, soit en raison du vidage d'une pile vide.'-n[invalid char]
, qui sort sous forme de nombre.'[num][op]o[invalid char]
, qui s'applique[op]
à[num]
on[char]
, en erreur sur char. Par exemple, les'2+oJ
sortiesL
, qui sont deux de plus queJ
.'
Le code de, est"-oH
en utilisant"
.-
Le code de, est'%oB
en utilisant%
.ln;
: Poussez la longueur de la pile, affichez num puis arrêtez, donnant0
. De mêmelln;
pour1
et'ln;
pour3
.4|n+
: Appuyez sur 4, rebondissez sur le|
et appuyez sur un autre 4, ajoutez, puis sortez8
comme num. Rebondissez à|
nouveau et erreur en essayant d'exécuter àn
nouveau sur une pile vide.3|n*
pour9
.[num]|o*
pour@Qdy
.'1-:00p
: Le plus intéressant, pour leo
cas. Pour éviter d'utilisero
dans notre code, nous devons utiliserp
pour placer uno
dans la boîte à code, puis l'exécuter. L'initiale'1-:00p'
place la pile enp
haut et la1-
décrémente eno
.:
duplique cecio
et en00p
place uno
à (0, 0) en transformant la boîte de code eno1-:00p
. Le pointeur d'instruction retourne à nouveau et affiche l'autreo
. Le caractère (0, 0) est ensuite remplacé plusieurs fois avant que le programme ne finisse par obtenir une erreur.la source
Dyalog APL ,
527522 octets(non compétitif car APL ne peut pas vraiment être écrit en ASCII uniquement)
La plupart sont dans le format
nn⊃⎕AV
ounnn⊃⎕AV
, les exceptions étant:Voici la liste complète:
la source
⍨
est mon nouveau smiley préféréRuby, 869 octets
Pour les 63 caractères
@
par~
, nous avons une solution à 10 octets:Pour la plupart (21) des personnages de
space
travers?
, nous avons une solution de 9 octets:Il reste onze cas spéciaux:
Au total, le score est de 10 × 63 + 9 × 21 + 10 + 3 + 8 × 4 + 5 = 869.
la source
?\xxx
au lieu de"\xxx"
1 octet chacun.p 1+8
et pasp-~8
?-
, ou quelque chose comme ça. :(putc 65
=>A
WolframAlpha , 368 octets
Format général:
Exceptions:
Voici la liste complète:
la source
PHP (
891680674 octets,20 DNP)Edit: sauvé 203 octets grâce à jimmy23013 et implémenté les 2 DNP grâce à Mego
Cette réponse abuse fortement de la nature généreuse de PHP. La plupart des cas prennent l'une des formes suivantes (7 octets chacun):
PHP convertit les lettres de chaque côté de l'opérateur à cordes, puis effectue l'opération de conversion binaire approprié par chaque chaîne à sa valeur de caractères ASCII, et convertit enfin le résultat de retour à un personnage.
Dans le premier exemple ci-dessus,
Y^x
devient89^78
. Le résultat est ce33
qui est ensuite envoyé à STDOUT en tant que caractère!
.Un script a été écrit pour forcer toutes les combinaisons possibles: les résultats sont disponibles ici .
Exceptions:
;
is<?=Z^a?>
(8 bytes)|
est<?='9'^E;
(9 bytes)<
et?
devrait normalement être DNP en raison de la balise de début requise, mais en utilisant l'-r
indicateur, le code peut être exécuté sans eux:<
isecho Z^f;
(9 octets)?
estecho Z^e;
(9 octets)=
estecho Z^g;
(9 octets)But:
(7 * 90) + 8 + 9 + 9 + 9 + 9 = 674 octets
la source
&
|
^
entre deux lettres pour générer tous les caractères ascii imprimables, à l'exception de<?=|;
.~
au lieu de XOR, AND ou OR. PHP peut utiliser plus de caractères imprimables comme constantes que de simples lettres.Brachylog ,
546477 octetsCrédits à Fataliser pour le code pour
@
.Dans la liste ci-dessous, le premier caractère est le caractère à imprimer (pour faciliter la référence).
Ce sont tous des prédicats, il
Z
faut donc être l'argument pour recevoir le résultat: essayez-le en ligne!Explication
@P
est cette chaîne:qui contient tous les ASCII imprimables.
la source
"@"
ce moyen> <> , 531 octets
Les programmes prennent deux formes principales:
Le premier concerne les caractères avec des codes de caractère avec deux facteurs inférieurs à 16, l’autre pour les autres cas. La plupart des nombres pour lesquels j'utilise le second formulaire ont de nombreuses solutions de longueur égale, mais j'ai choisi celui-ci pour des raisons de lisibilité.
Exceptions:
Liste complète:
la source
;
utilisations;
. En outre, je suis à peu près sûr que la plupart d’entre elles peuvent être gâchées par une erreur, et qu’elleso
sont tout à fait possibles.o
etO
je ne vois pas commento
c'est possible. Et comment se terminer par une erreur serait-il plus court?o
peut être fait en utilisantp
. Je pourrais poster séparément pour erreur, car il y aura probablement beaucoup de modèles différents impliqués.;
programme. Merci d'avoir fait remarquer cela!Hexagony ,
376373 octets, 1 DNPMerci à FryAmTheEggman pour la sauvegarde de 3 octets.
Presque tous les programmes ont la même forme:
Il y a cependant quelques exceptions:
;
sans utiliser;
, d'où 1 DNP.@
, nous ne pouvons pas utiliser@
pour terminer le programme. Au lieu de cela, nous utilisons soitS2;:
ouS3;%
. Cela se termine par une erreur de division par zéro, mais cette erreur n'est pas visible sur STDOUT. Donc, cela reste quatre octets.U
qui nécessiteraitU3;@
. Il existe plusieurs façons de résoudre ce problème, notamment le passage en minuscule, c.-à-dn9;@
. Ou l'utilisation d'incrément ou de décrément, c.T);@
-à- d ouV(;@
. Dans tous les cas, il reste quatre octets.0
et!
impriment une valeur entière afin que nous puissions obtenir0
et1
avec!@
et)!@
, respectivement, économiser 3 octets.Quant au fonctionnement des
<letter><digit>;@
programmes: la disposition hexagonale d’un programme de la forme1234
est toujoursEtant donné qu'aucun programme ne contient de commande redirigeant le flux de contrôle, il s'agit simplement de programmes linéaires exécutés dans l'ordre.
Dans tous les cas, la lettre au début du code définit le bord de la mémoire en cours sur son code de caractère. Par exemple, dans le programme
P1;@
, leP
définit la valeur80
. Ensuite, le chiffre multiplie cette valeur par 10 et s’ajoute (c’est-à-dire que le chiffre est ajouté à la valeur actuelle). Cela donne801
dans l'exemple ci-dessus. Enfin,;
affiche cette valeur en le prenant modulo 256 et en l’utilisant comme valeur d’octet. Dans ce cas801 % 256 = 33
et a!
est imprimé.la source
Espace blanc , 1643 octets, 1 DNP
17 octets pour les caractères [33-63] et 18 octets pour les caractères [64-126]
Dans les espaces blancs, c'est simple, car les caractères imprimables (à l'exception de l'espace) n'ont de toute façon aucune signification:
Le programme ci-dessus affiche un "!" (100001b). Changez
[TAB][SPACE][SPACE][SPACE][SPACE][TAB]
dans la première ligne pour le personnage que vous aimez. Il n'est pas possible d'imprimer un espace sans utiliser d'espace, car l'impression commence toujours par[TAB][LF][SPACE]
la source
Rétine , 712 octets, 2 DNP
C'était un effort de collaboration avec FryAmTheEggman.
Il existe plusieurs classes de solutions. Pour la plupart des caractères de l'espace à
^
, nous utilisons un programme de la forme suivante:Le caractère de la deuxième ligne parcourt les plages
_0-9A-Za-z
tandis que le reste reste inchangé. Cela transforme l'entrée vide en ce caractère, puis le remplace par le caractère imprimable ASCII (représenté parp
) à la position correspondante. Chacun de ces programmes est long de 8 octets.Dans cette plage, il n’ya que quelques exceptions. Plus important encore, les chiffres peuvent être raccourcis:
x
(compte le nombre dex
s dans l'entrée vide)(weehoo, programme vide; compte le nombre de correspondances vides dans l'entrée vide)
2: maintenant nous transformons l'entrée en un seul caractère avant de compter les chaînes vides:
3: même chose mais nous transformons l’entrée en deux caractères:
4: vous avez l'idée ...
5 - 9: torsion de l'intrigue ... nous utilisons la répétition de caractères pour éviter que la deuxième ligne ne devienne plus longue:
...
L'autre exception est qu'il
T
s'agit d'un DNP: nous ne pensons pas qu'il soit possible de générer un caractère non numérique sans qu'il n'apparaisse dans le code source si les étapes de translittération ne peuvent pas être utilisées.Sur les personnages restants. Pour imprimer,
_
nous utilisons un programme similaire à la solution générale ci-dessus:Utiliser le fait qui
w
commence par_
.Vient ensuite
`
le deuxième DNP, car les étapes de translittération le nécessitent également.Ensuite, la plupart des lettres minuscules sont imprimées avec quelque chose comme ceci (qui imprime
a
):Encore une fois, le caractère de la deuxième ligne est incrémenté
_0-9A-O
. Ici, nous devons simplement surveillerl
etw
, que nous pouvons imprimer avec les programmes suivants, respectivement:Enfin, il ne
{|}~
reste que ceux qui nécessitent 9 octets chacun. Ici, nous utilisons l'étape de translittération pour incrémenter le caractère qui les précède. Par exemple,~
peut être imprimé avec:la source
Pyke,
364362355 octetsTous sous la forme
w<chr(charcode+32)>.C
(4 octets) à l'exception de:->
d
1 octet0
->Z
1 octet1
->~W
2 octetsa
->Gh
2 octetsz
->Ge
2 octetsa
) sous formeG<number>@
(3 octets)k
->GT@
3 octets>
->~Bh
3 octets]
->~Be
3 octetsZ
->~le
3 octets9
->~ue
3 octetsw
->G22@
4 octets.
->~B4@
4 octetsC
->~K38@
5 octetsInterprète Pyke en ligne
la source
JavaScript (ES6),
10831068 octetsForme générale:
Exceptions:
Edit: Sauvegardé 15 octets grâce à @ GOTO0.
la source
alert(atob`XA`)
pour "\" pour enregistrer quelques octets.x
.\u
échappées en code source? Cool05AB1E , 417 octets
Explication
La plupart sont 5 octets de la forme:
convert nr to base nr+1
.>
nécessite un octet supplémentaire car nous ne pouvons pas utiliser incrément pour cela.a,b,x,y,z,Y,Z
sont extraites deA
qui contient l'alphabet en minuscule.A,B,C,D,E,F
sont des nombres convertis en hexadécimal.0-9
sont des incréments / décréments simples ainsi que des variables prédéfinies.la source
Marbelous, 220 octets
Pour un caractère qui n'est pas un chiffre, il ne s'agit que des deux chiffres hexadécimaux majuscules du code de caractère. Par exemple, les sorties de programme suivantes
A
:Pour un chiffre qui ne l'est pas
3
, remplacez2F
le code suivant par les chiffres hexadécimaux majuscules du code de caractère - 1:Pour
3
:Note totale: 2 * 85 + 5 * 10 = 220.
Interprète.
Mon premier essai était Bubblegum et cela ne fonctionnait pas pour les personnages auparavant
?
...la source
Perl 6: 921 octets
Traduction de la solution Python.
Chaque programme a la forme
say "\x<hex escape code>"
, sauf:s
→put "\x73"
a
→put "\x61"
y
→put "\x79"
→
"\x20".say
"
→say chr 34
\
→say chr 92
x
→say chr 120
0
→say 1-1
1
→say 3-2
2
à9
→say <n minus one>+1
Pour référence et facilité de test, voici la liste complète des programmes, séparés par une nouvelle ligne.
Voici le code que j'ai utilisé pour tester la liste ci-dessus et compter le score:
la source
say
est requis et les séquences d'échappement octales sont écrites comme\o77
. N'hésitez pas à poster une solution Perl 5 séparée ... :)Haskell,
1874 1864 1856 1855 1795 17911589 octets, 7 DNPLa plupart des programmes sont
main=putChar '\xx'
oumain=putChar '\xxx'
oùxx
/xxx
est le code ASCII du caractère à imprimer. Cela fonctionne pour tous les caractères sauf 14:Cependant, pour les chiffres,
1 74 octets peuvent être sauvegardés (grâce à Christian Sievers!):Les 52 programmes jusqu’à
c
(code 99) prennent 18 octets, les 19 restants prennent 19 octets chacun.Partition partielle:
10*14 + 52*18 + 19*19 = 1437
Pour 7 des caractères restants, les programmes suivants fonctionnent:
Partition partielle:
18 + 22 + 18 + 21 + 19 + 27 + 27 = 152
Cela laisse 7 DNP:
=aimnrt
Chaque programme Haskell doit définir un main (
main=
), donc 5 DNP. Pour imprimer à StdOut,putChar
,putStr
ouinteract
peut être utilisé, ce qui donnet
etr
que d' autres PND. (Il y a aussiprint
, cependant, desprint 'a'
impressions'a'
et nona
- et contient égalementt
et der
toute façon.) Haskell a également unechr
fonction qui renvoie le caractère correspondant à un numéro, mais son utilisationimport Data.Char
est nécessaire.Score total:
1437 + 152 = 1589
7 DNPla source
main=print$1-1
etc.succ
)BBC Basic,
422413 octetsTéléchargez l'interprète gratuitement à l' adresse http://www.bbcbasic.co.uk/bbcwin/bbcwin.html
9 octets sauvés grâce à Leaky Nun.
Forme générale
32..99 hors 12 cas spéciaux: 56x4 = 224 octets
100..126 : 27x5 = 135 octets
12 cas spéciaux: 54 octets
La plupart des nombres suivent la forme générale, mais je les ai tous inclus ici pour montrer où se situe le problème.
Le premier caractère est le caractère à imprimer.
la source
V.48
pour0
?V.
etP.
ont toujours été là?.
se développeront en mot clé. Ce défi est strict quant à l’utilisation d’ASCII non imprimable, mais avec d’autres défis, vous pourriez dire que les mots-clés marqués (ascii 127-255) correspondaient à un octet. Cela dit, je n'ai jamais essayé cet argument et donne généralement les deux scores.Minkolang 0,15 , 604 octets
Pour la plupart des personnages, ce
"<char-1>"1+O.
serait un programme valide, peut-être l’un des plus courts. Cependant, étant donné que les caractères sont stockés en tant que points de code sur la pile, beaucoup d’entre eux peuvent être produits par multiplication et addition, sur cinq octets ou moins. Notez également quel, $1, $2, $3, $4, $5, $6, $l
sont10, 11, 12, 13, 14, 15, 16, 100
respectivement.Format:
<character>: <program>
Mentions spéciales:
(Essayez-le.) Minkolang a la capacité de modifier les caractères dans la boîte de code, donc ce programme fait qu'il remplace
-
à la fin.
ce qui est nécessaire pour arrêter le programme."N"1+d90pN.
pourO
fonctionne de la même manière.(Essayez-le.)
lZ
Pousse les alphabets majuscules et minuscules vers la pile etI
pousse la longueur de la pile, qui est 52, précisément le point de code de "4". La meilleure partie est que je pensais initialement à la solution de4$3*O.
, qui multiplie 4 et 13 pour obtenir 52, mais ne pouvait pas parce qu’elle comportait un 4, j’ai donc fini par trouver une solution plus complète!(Essayez-le.)
d
Duplique le haut de la pile, donc ce morceau de code fait qu'il pousse11
, duplique, puis se multiplie. Une autre façon d'écrire cela aurait été$12;O.
, qui a le même nombre d'octets.(Essayez-le.)
;
Est une exponentiation, donc cela fait 5 ^ 3 pour obtenir 125.la source
Groovy, 1019 octets
J'avais une solution Groovy différente écrite (voir ci-dessous), mais après l'avoir soumise, j'ai creusé un peu plus dans les échappements de caractères, dans l'espoir de trouver un moyen de raccourcir davantage le programme, et j'ai découvert que Groovy avait un caractère octal d'échappement que je ne savait pas de. Cela simplifie considérablement le code, au point qu'il supprime malheureusement la quasi-totalité des solutions de contournement originales que j'avais proposées.
Il semble également presque identique à la solution Python 2 de Copper , au point où il semble en fait que je plagie leur travail. Pouah.
Chaque programme a la forme
print'\<octal value>'
, sauf:p
,r
,i
,n
,t
→'print''\<octal value>'
(mais avec la lettre correspondante de « print » a également remplacé par la valeur octal)0
-9
→print~-<next int>
Voici la liste complète des programmes par personnage.
Groovy, 1130 octets
Mon programme précédent, avant que je découvre que des échappées octales existent. Beaucoup plus intéressant, IMO.
Chaque programme a la forme
print(--'<next char>')
, sauf:-
,[
,~
→print(++'<previous char>')
&
→print(--"'")
p
,r
,i
,n
→System.out<<--'<next char>'
t
→'prin\u0074'(--'u')
(
→print'\u0028'
)
→print'\u0029'
0
-9
→print~-<next int>
Voici la liste complète des programmes pour chaque personnage:
la source
En réalité ,
383382381 octets1 octet grâce à Mego.
Pour faciliter la recherche, la première colonne est le code du caractère, la deuxième colonne est le caractère et la troisième colonne est le code.
Le code pour
0
est un espace unique.Essayez-le en ligne!
Les suggestions de golf sont les bienvenues.
la source
:
dans 5:9P2*c
Fourier, 306 octets, 1 DNP
Pratiquement tous les programmes suivent le modèle
na
où n est le code de caractère de chacun des caractères. Par exemple:Essayez-le en ligne!
Je vais donc juste énumérer les exceptions:
0 (zéro)
Puisque l'accumulateur est préréglé à zéro, nous pouvons l'afficher en utilisant un seul caractère:
Essayez-le en ligne!
1
Semblable à zéro, cela incrémente l’accumulateur pour obtenir 1.
Essayez-le en ligne!
5
Le code ASCII pour 5 est 53, donc j'ai dû contourner ce problème:
Essayez-le en ligne!
une
Comme
a
il s'agit de la fonction de sortie de caractères, il n'y a pas d'autre moyen de produire le caractère a, c'est donc mon seul DID NOT PROGRAM. .Voir tous les programmes ici
la source
Matlab,
12381224 octets, 2 DNPLe motif principal est:
Pour les chiffres, c'est un peu plus court:
Pour les personnages
[]'
c'est:Les caractères
ds
dedisp
sont affichés en utilisantfprintf
( merci @Stewie Griffin );ip
Cependant, je dois aussi déplacer la chaîne et utilisereval
:Les deux caractères
()
sont cependant nécessaires pourdisp
oueval
, ils sont donc DNP.Pour référence la liste complète:
la source
[100 105 115 112]
(codes de caractères) fonctionnedisp
?disp([100 105 115 112])
ne produira pas de chaîne,eval([100 105 115 112])
non plus.fprintf
pour d ans s:fprintf([115,''])
. Enregistre 2x7 octets =) Je ne ferai pas une soumission gagnante, mais hé: 14 octets correspondent à 14 octets ,,,disp([0 ''])
contient un espace.disp([0,''])
ne le fait pasfprintf
.Gelée (non compétitive), 406 octets
Ceci imprime tous les caractères de 32 à 126. Le nombre d'octets est calculé avec https://mothereff.in/byte-counter .
Essayez-le en ligne!
la source
In a programming language of your choice, write 95 programs, each of which outputs a different one of the 95 printable ASCII characters without that character occurring anywhere in the program.
Befunge-93, 530 octets
Le moyen le plus simple de générer un caractère, sans utiliser ce dernier, consiste à calculer la valeur ASCII et à utiliser la commande
,
(sortie de caractère) pour le restituer. Par exemple,49*,@
affiche le caractère dollar (ASCII 36, 4 * 9). Ceci est rarement le plus optimal, car la plupart des valeurs nécessitent plus de 3 octets à calculer.Une autre façon de générer un nombre sur 3 octets consiste à tirer parti du fait que la
g
commande (get) située dans la première cellule du champ de lecture générera la valeur ASCII de g (une pile vide est supposée être remplie de zéros; lecture de la valeur de playfield à 0,0). Ainsi,g1+,@
vous obtenez h , etg1-,@
vous f . Cela fonctionne évidemment pour une gamme de compensations et d'opérations autres que+
et-
sont également possibles. Ainsi, par exemple,g3/,@
vous obtenez un devis double.Une variante de ceci consiste à faire précéder le
g
avec une autre commande qui laisse tous les zéros sur la pile. Donc, vous lisez toujours une valeur du champ de jeu à 0,0, mais le personnage en cours de lecture est maintenant différent. Cela coûte un octet de plus, mais vous donne accès à beaucoup plus de valeurs. Par exemple,0g1-,@
vous obtenez une barre oblique et:g1+,@
un point-virgule. D' autres préfixes viables comprennent*
,+
,-
,>
,\
et_
. Et notez encore que d’autres opérations sont possibles:>g2*,@
vous procurer une barre verticale.Une autre variante consiste à faire précéder le
g
avec un1
, de sorte que vous ne lisez plus maintenant à partir de 0,0, mais à partir de la cellule vide à 0,1. Dans Befunge, les cellules vides sont initialisées avec des espaces par défaut,1g,@
vous obtenez donc un espace, et1g1+,@
un point d'exclamation.Pour les caractères numériques, il y a une astuce plus douteuse que nous pouvons utiliser. Au lieu d'essayer de les sortir sous forme de caractères, nous les produisons sous forme de nombres (un petit nombre est plus facile à générer que son équivalent ASCII). Ainsi, par exemple,
11+.@
vous en donne 2 et notez en particulier les cas particuliers:.@
pour 0 et!.@
pour 1 . La partie douteuse de ceci est qu'une sortie numérique dans Befunge inclut un espace après le nombre, donc ce n'est pas une sortie de caractère pur.Une autre astuce douteuse que nous pouvons utiliser est une variante de la
g
technique ci-dessus. Au lieu de nous limiter aux commandes Befunge pour le préfixe, nous pouvons également utiliser techniquement tout caractère qui n'est pas une commande Befunge. Sur la plupart des interprètes, une commande non reconnue sera ignorée. Leg
lecteur lira alors la valeur ASCII du caractère précédent. Cela nous permet de générer la plupart des autres valeurs ASCII qui, autrement, ne pourraient pas être calculées sur 3 octets. A titre d'exemple:Qg1+,@
vous obtenez R .Enfin, il y a trois cas spéciaux. Un g ne peut pas être généré dans moins de 5 octets, nous devons donc recourir à
"f"1+,@
. Une virgule est le plus compliqué, ce qui nécessite une modification de la dynamique de la zone de jeu:0g4-:80p @
. Nous pourrions utiliser une technique similaire pour éviter le caractère différent, mais un hack plus efficace consiste à utiliser la%
commande (modulo) comme terminateur, c'est-à-dire88*,%
. Quand le%
atteinte est atteinte, il n'y a plus rien sur la pile. Le calcul modulo génère une division par zéro, ce qui met fin au programme sur l'interpréteur de référence.Vous trouverez ci-dessous la liste complète des programmes, un par ligne.
la source