Imprimez la phrase en And she said, 'But that's his.'
utilisant uniquement les caractères suivants: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
Pas de ponctuation ni de caractères non alphabétiques. Vous pouvez utiliser le langage de programmation de votre choix. Les espaces sont complètement autorisés. Le programme le plus court gagne.
code-golf
kolmogorov-complexity
restricted-source
Faucon à crinière bleue
la source
la source
a-zA-Z
. En théorie, je pourrais utiliserw
rite etE
val pour créer les instructions nécessaires, mais aucune d'entre elles+-*,%'"
ne peut être construite sans utiliser (au moins) l'une d'entre elles+-*,%'"0-9
.(programmer-of (language 'lisp))
n'aime pas cela.Réponses:
Espace blanc ,
417414349265 octets265 octets grâce à Kevin Cruijssen
Essayez-le en ligne!
A expliqué:
la source
Whitespace is completely allowed.
Je vois que vous avez pris cela à la lettre.NNN
pour quitter, car il s'arrête déjà avec une erreur lorsque vous faites l'ajout avant le print_char, il ne viendra donc même pas après le Jump_to_Label. Aussi, pourquoi stocker le63
au début et le récupérer dans la boucle? Vous pouvez simplement le pousser avant d'ajouter à la place. Et pourquoi le Label-nrTTSSSSTN
? Une étiquette peut même être vide. Il suffit doncNSSN
de créer l'étiquette etNSNN
de passer directement à l'étiquette lorsque vous n'utilisez qu'une seule étiquette.63
? Je ne suis pas sûr à 100% que ce soit la constante la plus courte possible ici. Si c'est le cas, quelque chose ne va pas avec mon programme de génération constante que j'ai écrit pour un défi précédent. :)102
est la plus efficace: 281 octets (ou ici avec surlignage ). (REMARQUE: j'ai également utilisé une copie pour économiser 4 octets pour l'espace entreehs dnA
(copie de l'espace entredias ehs
).Perl 5 ,
13310295 octetsEssayez-le en ligne!
Explication:
Les expressions régulières, print et chop s'appliquent toutes à la variable
$_
par défaut.Remplace la chaîne vide par
And she saidZ ZBut thatZs hisZZGjGGf
.Remplace chacun
Z
par le résultat de l'évaluationchr oct oct oct ord chop
. Cela supprime le dernier caractère de$_
, prend son code clé, l’interprète comme une valeur octale trois fois et le reconvertit en un caractère. Par exemple,j
→ 106 → 70 → 56 → 46 →.
.En raison de la manière dont le remplacement fonctionne, les modifications apportées
$_
lors de l'évaluation du remplacement sont perdues, il en$_
est de même maintenantAnd she said, 'But that's his.'GjGGf
.Supprime tout
G
,j
etf
dans$_
.la source
print
parsay
-2 caractères. Le méta-consensus actuel indique que les indicateurs de ligne de commande, tels-M5.010
que ne comptent pas dans le nombre d'octets.> <> ,
916915903 octetsAu début, j’imaginais qu’une solution dans> <> était impossible, puis j’ai réalisé… qui a besoin de conditions ou d’un contrôle logique? :RÉ
Essayez-le en ligne
J'insère à plusieurs reprises des nombres (le nombre 15) sur la pile, puis pousse la longueur de la pile et imprime le caractère avec cette valeur ASCII. Si j'ai besoin de réduire la longueur de la pile, je réduis la pile trois valeurs à la fois en utilisant
p
, ou une à la fois en utilisantg
si je suis à moins de trois de la cible. Le programme se termine par un appeli
(entrée), qui appuie sur une touche-1
car il n'y a pas d'entrée, puis l'imprime pour provoquer une erreur.C’est le programme Python 3 que j’ai utilisé pour créer la solution une fois que j’avais réfléchi à la façon de le faire:
Essayez-le en ligne
la source
p
: créer un 59 sur la pile tout en déplaçant vers le haut de l'espace à l's
ensaid
, puis placez - le dans le code sur le chemin vers le bas ded
la,
. (Notez que (15,15) en a 15 à ce point.)l
etp
mettre plusieurs caractères utiles dans le rectangle (10,10) - (15,15), puis les récupérer avec l'g
endroit le plus pratique.8086 Assembly sur IBM PC,
1463845664 bytesPrécision: la source réelle du langage d'assemblage est l'entrée et non le code machine généré.
La difficulté est que la plupart des instructions x86 (telles que ADD, SUB, JMP, sauts conditionnels, accès mémoire) ont deux arguments et ont donc besoin d’une virgule ou d’une adresse mémoire. Donc, nous ne pouvons pas utiliser d'addition, de soustraction, de ifs ou de boucles!
Lors de ma première tentative, j'ai été capable de "construire" des nombres en combinant incrément, décrément, multiplication, division, tours d'octets et les instructions obscures de BCD (comme AAA, DAS). Après cela, j'ai réalisé que cette idée pouvait être utilisée pour créer du code auto-vérifiant et auto-modificateur.
Tentative 1. (1463 octets)
Utilisé les instructions disponibles pour construire des codes ASCII et l'adresse 0xb800 du tampon d'écran. Le calcul de chaque personnage de la séquence a été joué au golf à la main.
Tentative 2. (non complet)
Nous nous sommes rendus compte qu’il existe un opcode pour chaque entier compris dans la plage 0x40-0x5f. Cette gamme comprend AZ. Ainsi, par exemple, INC CX correspond à 0x41 = 'A'. (Cette table d'opcode est très pratique.)
J'ai essayé de construire 3 chaînes de "données" et de les superposer les unes sur les autres. Le premier tel quel (majuscule), le second "décalé" dans la zone 0x60-0x7f (minuscule) et le dernier "décalé" dans la zone 0x20-0x3f (ponctuation).
Un code auto-modifiable produirait une boucle ou trois pour parcourir les données.
Tentative 3. (845 octets)
Comme pour l'approche précédente, mais pour réduire les données, la chaîne ne serait encodée qu'une seule fois, avec des "caractères de contrôle" mélangés pour changer de jeu de caractères.
Tentative 4. (664 octets)
Comment se débarrasser des caractères de contrôle qui nécessitent de nombreuses instructions corrigées pour gérer les branches? Etant donné que seules deux lettres majuscules sont utilisées, je me suis demandé si je pouvais "retourner" la table d'opcode pour coder des lettres minuscules en utilisant la plage 0x40-0x4f et la ponctuation en utilisant la plage 0x90-0x9f (en soustrayant de 0xc0). Le "A" et le "B" pourraient être ajoutés séparément.
Cependant, seuls la moitié des opcodes de la gamme 0x90-0x9f sont utilisables et ils ne s'alignent pas avec ceux qui sont nécessaires. Ensuite, j'ai pensé que je pourrais peut-être les utiliser à l'aide d'un XOR et j'ai trouvé celui qui fonctionnait. Et le voici.
Golfé:
Assembler avec
et exécutez-le dans DOSBOX (exécutez d'abord CLS). Ressemble à ça:
Commenté:
la source
INC AX
alors que la non commentée estINC AL
.label1 db
une ligne distincte. Cela produira un avertissement, mais pas d'erreur.Perl 6 ,
1299127212201215 octetsMerci à Grimy pour -27 octets.
-52 octets parce que nous n'avions pas besoin des oreilles de lapin.
Merci à Jo King pour -5 octets.
Essayez-le en ligne!
Affiche la chaîne avec un retour à la ligne final. Si vous ne le souhaitez pas, remplacez le dernier
say
par unprint
. Vous pouvez également remplacer les nouvelles lignes de la source par des espaces.Explication
Ce code imprime la chaîne caractère par caractère. Chaque caractère est formé en introduisant le code de caractère approprié dans la
chr
fonction et en le mettant en minusculelc
si nécessaire.Actuellement, toutes les valeurs sont générées en générant une chaîne contenant le nombre correct de caractères. dans certains cas, le nombre de caractères est l'inverse du code de caractère cible. Il devrait être théoriquement possible d'utiliser des fonctions mathématiques telles que
log
etexp
directement, mais je n'ai pas trouvé très facile de les utiliser.Pour une utilisation en tant que chiffres, nous avons
e
,pi
ettau
; dans le côté droit dex
ouxx
, ils sont implicitement pavés. Ils ont tous 17 caractères dans leurs représentations en chaîne, nous utilisons donce
pour un nombre minimal de caractères. Nous avons égalementi
(4 caractères),False
(5 caractères) etNaN
(3 caractères). Nous pouvons multiplier les longueurs de chaîne avecx
;xx
multiplie un plus la longueur de la corde par le côté droit et en ajoute un.chop
supprime un caractère de la chaîne au cas où nous en aurions un de la cible.Les instructions d'impression sont enchaînées en utilisant
and
, ce qui a une priorité assez faible. C'est presque un miracle qu'il existe; sinon, nous devrions utiliser des points-virgules illégaux.J'ai trouvé les expressions pour les personnages à la main. Il pourrait être intéressant de les rechercher par programme pour trouver des expressions plus courtes.
la source
Largeur ,
6664 octetsEssayez-le en ligne!
Imprime à déboguer. Pour imprimer sur stdout, ajoutez
ww
à la fin du code ce qui apparaît et sort le haut de la pile.Explication
Dans Width, chaque lettre est corrélée à un nombre, en fonction de sa largeur, selon ce tableau . Cela attribue à chaque lettre un nombre compris entre 0 et 9. Ces chiffres sont ensuite utilisés pour exécuter le code.
En particulier, une lettre correspondant à une correspondance
7
démarrera un littéral de chaîne. Il lira des séries de deux lettres à la fois, jusqu'à ce qu'il lise à nouveau la lettre originale. Chaque ensemble de deux lettres sera converti en son nombre en largeur, lu comme un nombre décimal compris entre 0 et 99, et le caractère auquel elles correspondent sera son index dans la chaîne suivante:Par exemple, l'index
!
est égal à 1, ainsi01
seront les bons nombres de largeur. Ainsi,if
,iI
,jt
, etc seront tous corrélat à un littéral de chaîne de!
.Dans ce cas, j'ai traduit les 31 caractères de la sortie requise en lettres appropriées, en utilisant
Q
les guillemets. Le haut de la pile est imprimé pour déboguer à la fin du programme.la source
Code machine x86 (32 bits), 256 octets
Lorsque j'imprime mon code sur la console de la page de codes 437, les indications suivantes apparaissent:
Cela contient des caractères d'espacement, donc voici le même code lorsque je remplace tous les caractères de tabulation par
→
et tous les espaces insécables (avec le code 255) de*
:Hexdump:
Quelques explications sur son fonctionnement:
Les instructions utiles sont:
push imm8
,push imm16
etpush imm32
, suivi depop
générer des constantes. Cela peut également générer un zéro (inah
) lorsque vous appuyez sur un octet (imm8
).and [ecx+32], ah
- en supposant que ah = 0, ceci met l'octet à zéro. Il se trouve que la longueur de la chaîne de sortie est égale à 32, de sorte que le code remplit la mémoire tampon de bout en bout.or [ecx+32], edx
- en supposant que l'octet de sortie soit mis à zéro, cela copieedx
(4 octets) dans la sortie. J'utilise une variante avecdx
au lieu de seedx
rapprocher de la fin du tampon, car il ne devrait pas écrire au-delà du tampon de sortie. La restriction de code rend impossible l'écriture d'octets simples de cette façon!imul edx, [ecx+32], whatever
- C’est l’idée principale de brouillage. Avec assez d'entropie[ecx+32]
et peu importe le nombre, il peut générer n'importe quelle sortie. Je l'utilise pour générer 2 ou 3 octets de valeurs nécessaires. Une certaine complication est, lorsqu’il écrit dans la sortie, il doit faire logiqueOR
avec tout ce qui est déjà là. Cela rendait parfois nécessaire de remettre à zéro la mémoire.jmp
instruction est utilisée pour retourner. Je l'ai choisi parce que son codage0xff
correspond à un espace insécable dans la page de codes 437. Un peu exagéré, mais je pense que la tâche est impossible ...Le code source de l'assembly, ainsi qu'un programme C qui l'exécute (utilise la syntaxe Visual Studio):
la source
dec ecx
+and [ecx+32], ah
choses peuvent être refactorisée.0xff
viole- t-il pas "pas de ponctuation ni de caractères non alphabétiques"?PostScript,
889874837835 octetsEssayez-le en ligne!
Ceci utilise 32 copies des nombres entiers
89 25 20 6
. Tous les codes de caractères de la chaîne cible peuvent être obtenus avec des opérations sur ces entiers, dans l'ordre de la pile: par exemple, 'A' (ASCII 65) est égal à 89 - (25 & (20 + 6)). Beaucoup de 4-tuples d'entiers ont cette propriété; celui-ci a été choisi car ils sont particulièrement faciles à générer.Flat correspond par défaut à 1, ce qui crée une chaîne de longueur 1 (initialisée à
\0
).dup
n’est pas une copie profonde: il crée une deuxième référence à la même chaîne. rrand pousse la graine aléatoire, dont la valeur par défaut est 0. Stack is now["\0", "\0", 0]
.count
pousse le nombre d'éléments dans la pile, ceci calcule donc 3 ^ (3 * (5 * 6)) = 89.4 * 5 = 20, 5 * 5 = 25, 6 = 6. La pile est maintenant
["\0", "\0", 0, 89, 25, 20, 6]
.Dupliquer la pile entière cinq fois. Nous nous retrouvons donc avec 32 copies de notre pile initiale de 7 éléments. Nous n'avons besoin que de 31 copies, car la chaîne cible compte 31 caractères, mais la copie supplémentaire ne fait pas mal.
Calculez un charcode parmi les quatre premiers entiers, écrivez-le à l'index 0 de la chaîne, puis imprimez la chaîne.
Supprime l'invite par défaut.
la source
Ruby ,
420 354338 octetsEssayez-le en ligne!
Par ordre croissant de jankiness:
Les mots commençant par une lettre majuscule peuvent être imprimés en définissant une classe portant ce nom et en l'appelant
display
dans le corps de la définition de classe.D'autres mots peuvent être affichés en définissant des méthodes portant ce nom, qui retourne un symbole, puis en les transposant en chaîne pour supprimer les deux points.
D'autres caractères peuvent être affichés en appelant
putc
leur code ASCII. Nous pouvons générer les nombres appropriés en réutilisant l'String def
astuce pour obtenir une chaîne, puis en prenant la somme de ses octets en utilisant un module déterminé par sa taille. Malheureusement, nous n'avons aucun moyen d'appeler des méthodes sur un objet autre que dans la définition de classe de cet objet, ce qui rend difficile la transmission d'arguments. Le hack final consiste donc à redéfinirString#inspect
, ce qui est appelé implicitement lorsqu’on passe une chaîne à lap
méthode, de sorte qu’elle calcule et génère le caractère approprié en tant qu’effet secondaire, avant de générer une erreur afin que l’opérationp
ne puisse pas se terminer et imprimer. nouvelle ligne. Ensuite, nous devons récupérer l'erreur dans le code principal.Edit: Jordan a fait beaucoup moins compter les octets, ahem, haut avec quelques astuces de golf intelligentes, et j’ai coupé quelques octets supplémentaires en les remplaçant
raise
par un appel de méthode inexistant d’une lettre, ce qui déclenche un NameError.Edit 2: Remarqué qu'avec
print String
extrait dans une méthode, il est moins coûteux de simplement l'utiliser avec une définition de méthode que d'utiliser l'astuce de définition de classe, car les méthodes sont autorisées à être classées dans le titre.la source
sum size
obtient la somme modulo de sa taille, mais tout le reste vérifie!> <> ,
233122 octetsEssayez-le en ligne!
Cela a commencé comme une réponse de mbomb , mais j’ai découvert un changement fondamental qui économise un nombre considérable d’octets. Je le publie donc comme ma propre réponse.
La génération de caractères non alphabétiques à la sortie est effectuée en insérant de manière répétée des valeurs dans la pile, puis en utilisant
l
la longueur de la pile. Cependant, cela n'a pas besoin d'être affiché immédiatement: en utilisantp
, ce caractère peut être placé dans n'importe quelle cellule dont les coordonnées sont comprises entre 10 et 15 inclus, pour être récupérées ultérieurement avecg
. De même, les caractères alphabétiques peuvent être placés dans le code source initial et lus de la manière suivante: puisque le code de caractère non alphabétique le plus élevé dans l’entrée est 46 (.
), cela signifie que la pile n’a pas besoin d’être poussée plus haut que le nombre 62 nécessaire pour le stockage. tous les 31 caractères de la sortie.De plus, a
v
est placé dans le code de la colonne 7. Lorsque le pointeur d'instruction tourne autour de cela et le frappev
, la séquencego
est exécutée de manière répétée pour lire les coordonnées insérées et générer les caractères correspondants. Finalement, la pile devient vide etg
termine le programme avec une erreur.Les 7 premiers octets de code sont réutilisés en tant que coordonnées initiales 7 et 7 dernières. Placer le
v
in de la colonne 9 aurait théoriquement enregistré deux octets supplémentaires, mais aurait forcé les caractèresAinsv
dans un carré 2x2 du code, ce qui est impossible. Une version antérieure utilisait la colonne 15, mais cela nécessitait une ligne supplémentaire dans le code source et aboutissait à six octets de plus.la source
r
à déplacer l’alignement où je veux. Cependant, jouer au golf avec ce programme me fait un peu mal au cerveau.CJam , 262 octets
Essayez-le en ligne! Les nouvelles lignes ne sont montrées ici que par souci de clarté; chaque ligne représente un personnage.
Ouf, c'était amusant. Se limiter aux commandes alphabétiques pose des défis intéressants:
{
et}
, il n'y a pratiquement aucune possibilité de contrôle du flux (à l'exception def
ce que je n'ai pas trouvé l'occasion d'utiliser).\
,_
,;
ou$
, nous avons aucun moyen pour la manipulation de la pile.Cela signifie que l'objectif principal consiste à obtenir les points de code appropriés sur la pile, puis à les convertir en caractères avec
c
.Le problème est que nous manquons également de la plupart des commandes arithmétiques de base, ainsi que des littéraux entiers. Cela convient cependant, car l'
m
espace de noms contient de nombreuses opérations mathématiques avancées et de nombreuses variables prédéfinies en nombres utiles.J'ai fini par faire un usage intensif des racines carrées (
mQ
etmq
), de la fonction exponentielleme
et de la conversion de base (b
), qui peuvent également être utilisées pour émuler la multiplication ([X 0] Yb
calcule X * Y). De plus, il est parfois plus facile de construire le point de code en majuscule, auquel cas nous pouvons utiliserel
(convertir en minuscule) le caractère résultant.Je ne suis toujours pas satisfait des plus longs. Tant pis.
Explication
Ceci est une explication caractère par caractère de la sortie. Avant de commencer, voici quelques méthodes simples pour faire des nombres:
T
,X
,Y
,Z
respectivement.A
jusqu'auK
.Sci
(S
pousse une chaîne contenant un espace,c
obtient le premier caractère de cette chaîne eti
convertit ce caractère en son point de code).S
est également utilisé pour les espaces.GmQ
(racine carrée entière de 16).AZbYb
(convertir 10 en base 3, donnant[1 0 1]
, et convertir le tableau résultant de nombres en base 2, donnant 5).Ymei
(compute exp (2) et converti en entier).A
n
d
s
h
e
a
i
,
'
B
u
t
.
la source
HYbYCtYbc
,HYbXAtYbc
etHYbXBtYbc
.Poisson-mort ~ , 943 octets
Essayez-le en ligne!
Aucune boucle autorisée
:(
la source
mal , 198 octets
Essayez-le en ligne!
C'était très amusant.
la source
Stax ,
133958479 octetsExécuter et déboguer
la source
MATL ,
187158 octetsEssayez-le en ligne!
Version plus lisible: Essayez-le en ligne! Tentative manuelle de construction de la chaîne. Il y a probablement beaucoup de place pour jouer au golf en coupant la corde en tronçons pratiques, en utilisant
P
eth
pour retourner et construire une corde. J'espère que quelqu'un relèvera le défi de me battre. Le principal défi est que vous ne pouvez pas utiliser+
ou-
, de sorte que l'arithmétique de base est souvent impossible.Points forts:
KQthpYq
: le 25e (KQthp
) nombre premierYq
est 97, ce qui correspond à la lettrea
. La lettres
(115) est générée de manière similaire à partir de 113, le 30e nombre premier. Il est ensuite largement réutilisé dans le presse-papierJ
.his
est raccourci en stockant l'h
avant de dans le presse-papiersJ
. Depuis celle précédemment stockées
, nous construisonshis
à l’inverse afin de pouvoir récupérer la dernières
utilisationy
, et la retourner après utilisationP
.h
envle
)la source
v
serait gâcher avec ceh
que j'avais auparavant. Je suppose que j'aurais dû ça au lieu de simplement assumer. Merci également pour le heads-up, une suppression trop zélée. Je suis curieux de voir si vous pouvez faire mieux que cela ...U
signifie^2
, cela aurait pu me sauver pas mal d'octets ...MATL , 118 octets
Essayez-le en ligne!
Version plus lisible (chaque ligne correspond à un caractère, sauf les opérations de réorganisation de pile).
Explication
Le programme produit les points de code des caractères requis, sous forme de nombres indépendants. À la fin, tous ces nombres sont concaténés dans un vecteur de colonne, redéfinis en tant que vecteur de ligne et convertis en caractères. Le résultat est implicitement affiché.
Quelques astuces utilisées:
0
est utilisé pour la plupart des espaces, car cela ne coûte qu'un octet (O
).15
est utilisé (généré en tant queKUq
), car il peut ensuite être réutilisé en l'ajoutant à100
(chard
) pour donner115
(s
). À une autre occasion, l’5
espace (généré en tant queKQ
) est utilisé ; il peut donc être soustrait ultérieurement de44
(,
) pour donner39
('
).J
- papiers est utilisé pour stocker des caractères qui seront répétés: d'abords
, ensuite'
. De même, lesH
magasins presse-papiers100
, ce qui est utile pourd
et pour générer d'autres caractères.Q
(add1
),q
(soustraire1
),E
(multiplier par2
) etU
(carré), ainsi que les littéraux prédéfinis dans les presse-papiersI
(3
) etK
(4
) sont largement utilisés .h
) et en calculant sa somme (s
) ou ses différences consécutives (d
).100
(d
) est généré comme4
en binaire interprété comme un nombre décimal.110
(n
) est obtenu à partir de65
(A
) en convertissant en chaîne ('65'
: points de code[54 53]
), en ajoutant1
aux points de code ([55 54]
), en les additionnant et en les additionnant1
.w
), bulle vers le hautb
).la source
O
au lieu deKWE
pour les espaces. Et vous avez confirmé mes soupçons selon lesquels il vaut probablement mieux sacrifier un autre bloc-notesH
.dc ,
240222209 octetsEssayez-le en ligne!
Ma première pensée était identique à celle de @seshoumara: il suffit d'insérer suffisamment d'éléments dans la pile pour générer toutes les valeurs ASCII des caractères. Puis, je me suis rendu compte que depuis
+
,-
et que*
je suis un opérateur à caractère unique, je ne peux que les recréer et pouvoir utiliser l’arithmétique! Ce serait sûrement plus petit!Et, je ne serais pas surpris si je suis capable de jouer plus d’octets, mais pour l’instant ... cette approche compliquée a réussi à lier le naïf (ish).OOOOOziOOOOOOOOOOOOOOOOOOOOOOOOOOOzddddddzkdddzasBdzasAdzscdzdasCzsd
est la partie de l’approche qui ressemble à celle de @ seshoumara, mais nous montons seulement à 46, ce qui est.
. Nous faisons cela parce que nous devons monter à 45,-
et nous avons également besoin d'une période dans notre chaîne, donc simplement aller plus loin pour la période est (je pense) moins cher. En cours de route, nous stockons certaines valeurs: 5, 32, 39 seront utiles plus tard. 5 pour les choses utilitaires, 32 et 39 pour leurs valeurs ASCII. À l’origine, j’en avais 1-5, mais c’était cher, et j’ai simplement pu éviter d’en utiliser 4; utilisezZ
(entrez une valeur, appuyez sur le nombre de chiffres dont elle dispose) sur un nombre à trois, deux ou un chiffre pour ces valeurs. 42, 43 et 45, nous convertir en chaînes (*
,+
et-
respectivement) et de les stocker sous forme de macros (B
,A
etC
respectivement). Cela signifie que sans utiliser les caractères*+-
, nous pouvons maintenant utiliser ces opérateurs.À partir de là, nous commençons généralement à générer les valeurs ASCII en utilisant la puissance des mathématiques au lieu d’une simple accumulation, en stockant certaines répétitions en cours de route. 100, 105 et 115 arrivent suffisamment pour que leur stockage (dans des registres ou autrement) ait un sens. À l'origine, j'ai laissé la pile remplie de 10 et les ai utilisées pour en faire des 100; il a fini par économiser des octets pour remplir la pile avec 32 secondes et les utiliser ensuite comme espaces. Une version légèrement plus lisible de la section ASCII:
OOlAxlAxP OBlBxdIlAxoP AdlBxddsrIlAxssP P OP lsIZlCxddspP OZlCxP P OP lrdZlCxP lsP lrP lcP P KP dZlBxdZlAxP OAZlAxdP IZlCxdP rPdP lpP lrdZlCxP P KP OP P lpP lsP OP ldP KP
.Supprimez 18 octets en: stockant le nombre 5 en tant que base d'entrée au lieu d'un registre; le nombre 32 comme précision au lieu d'un registre; le nombre 115 comme radix de sortie au lieu d'un registre; puis a dû changer
KZ
deIZ
générer 1 etOZ
àKZ
générer 2 s.Rasé 13 autres octets en inondant la pile avec 32 s; réglage de précision à 39; en utilisant la manipulation de pile pour éviter de stocker 116; couper un double travail que j'ai accidentellement laissé.
la source
a
pour recréer ces opérateurs, puis les appeler avecx
. Cela montre le comportement data-is-code de dc. Quand j’ai le temps, je vais appliquer votre dernière astuce, celle de stocker des données dans des paramètres plutôt que dans des registres. Pensez-vous que nous pourrions obtenir une solution de courant continu encore plus courte en abusant de la façon dont P travaille pour imprimer plus de lettres à la fois si nous avons la chance de saisir le nombre énorme nécessaire en utilisant uniquement l'hexagone?P
16750 ou 0x416E. Si nous avions juste de la chance et que l’une des chaînes était composée exclusivement de valeurs AF, cela pourrait nous donner un raccourci. Ce serait un peu de chance, cependant! Sinon, nous pourrions soit entrer un nombre important, soit les calculer, soit faire beaucoup d’additions et de multiplications par 256. Ce qui semble ... plus volumineux que de nombreuxP
art.Japt , 87 octets
L'essayer
Explication
La première ligne génère le
'
et l'assigne à la variableU
.La deuxième ligne affecte
2
une variableV
.La troisième ligne génère le
.
et l'assigne à la variableW
.La dernière ligne, ensuite, construit la chaîne un caractère à la fois en sens inverse.
la source
Qc dGaB
Rouge , 272 octets
Si les guillemets sont nécessaires:
Rouge , 344 octets
Ne fonctionne pas dans TIO mais fonctionne dans l'interprète rouge.
Explication:
Les mots sont triviaux - je les prie (imprimer sans nouvelle ligne) comme des littéraux
quote
. Rouge a un mot intégré pour l'espace -sp
, ainsi quecomma
etdot
."
et'
plus intéressant: je les Prin en soustrayant un espace deB
etG
respectivement, à partir d'un littéralB
etG
, en les convertissant d' abord en chaîne avecmold
puis à caractère (pour soustraction d'utilisation sur les) wtihto sp
( rouge a conversion par prototype - convertir le chaîne au type desp
, qui est un caractère).la source
'
, donc la solution de 272 octets est la même.Forth (gforth), 351
Dommage que je ne puisse pas redéfinir CHAR ou EMIT en mots d'une lettre, car il faudrait utiliser soit
:
et;
(exemple: C CHAR ;
) ou'
(exemple' CHAR ALIAS C
)En fait, si je pouvais définir les mots, je pourrais faire
: P CHAR EMIT ;
et ensuiteP x
imprimerx
. Tant pis.Je ne peux même pas créer de tampon, écrire cette séquence de caractères là-bas, puis l'utiliser comme entrée, car écrire en mémoire nécessite d'utiliser
!
ouC!
la source
AlphaBeta ,
180 177 175163 octetsEssayez-le en ligne!
WIP
la source
Pepe , 266 octets
Je garde la pile r vide et ai 's sur la pile r
Ce n'est pas sur TIO, mais vous pouvez l'essayer ici
la source
dc , 240 octets
L'idée principale est de faire croître la pile de 1 (
K
) en continu , en enregistrant (sX
) la taille de la pile (z
) dans des registres personnalisés lorsqu'elle correspond à chaque code ASCII unique. L'impression (P
) est terminée.Essayez-le en ligne!
J'ai fait quelques optimisations, comme ne pas enregistrer une lettre si elle n'est pas utilisée par la suite, comme dupliquer (
d
) une lettre, par exemple t, sur la pile pour enregistrer un octet, puisque rappel (lX
) est de 2 octets.la source
Code machine 80186+, format MS-DOS .COM,
822787 octetsSeuls les onglets et les espaces sont utilisés en plus des lettres. Etant donné que la plupart des opcodes dans la plage autorisée sont certains incréments, décréments, poussées, sauts et ET / OU à registre indirects, en plus de IMUL, je profite du fait que le registre de pile tourne quand il atteint la fin du segment pour modifier le code en sens inverse! L'assemblage 80186+ est requis car j'inscris des valeurs immédiates.
Source annotée (format TASM):
la source
Befunge-98 (FBBI) ,
125124121 octetsEssayez-le en ligne! Sortie dans un fichier nommé
\n
(une nouvelle ligne). Merci à Jo King pour son scénario.La sortie comprend 10 nouvelles lignes de fuite.
Pour un seul retour à la ligne, +1 octet en modifiant la ligne suivante:
Essayez-le en ligne!
Explication:
Le pointeur d'instruction se déplace comme suit:
Le programme met les caractères non alphabétiques en position avant de sortir cette ligne dans un fichier.
Befunge-98 inclut des instructions
a
...f
, qui poussent la valeur hexadécimale correspondante dans la pile. Pour générer d'autres nombres, il transmet ces valeurs ày
("Get SysInfo") en tant qu'arguments pour obtenir:En plaçant la majeure partie du code à y = 23, vous
ayy
pouvez utiliser l'accès répété à la taille de la pile, qui est ensuite utilisée pour générer des codes de caractères.la source
Pyth , 210 octets
Essayez-le en ligne!
J'ai trouvé quelques chiffres qui pourraient être exprimés en utilisant uniquement des lettres (comme
T
= 10,Z
= 0,lG
= longueur (alphabet) = 26,Cd
= charcode (espace) = 32), et quelques fonctions pouvant être exécutées en utilisant uniquement des lettres (commet
= décrément,h
= incrément,hF
= application répétée d’incrément = addition), puis il suffit de lancer une recherche de force brute pour trouver les combinaisons les plus courtes de ces fonctions et de ces nombres, donnant ainsi chacune des lettres dont j'avais besoin.la source
Code d'assemblage x86 16 bits, 665 octets
(le binaire est alphabétique, pas la source)J'ai en quelque sorte oublié la règle qui autorise les espaces. En conséquence, le code peut être joué au golf.
Bytecode:
La source:
Cela fonctionne de cette façon:
déplace le pointeur de pile à la fin du code, via POP AX (impossible avec SP SP car ce n'est pas alphabétique);
construit l'instruction pour envoyer un appel DOS (par algorithme car ce n'est pas alphabétique);
construit les caractères non alphabétiques;
place la chaîne sur la pile;
place l'instruction d'envoi sur la pile à la fin exacte du code, de sorte que l'exécution passe directement à cette instruction;
construit l'instruction pour imprimer une chaîne;
affiche la chaîne et les écrase rapidement. : - / (Une sortie gracieuse nécessiterait plus de code)
la source
Japt , 74 octets
L'essayer
la source
05AB1E ,
145121109 octetsEssayez-le en ligne!
la source
80186 code machine + DOS, 91 octets
Version texte:
Version textuelle, avec tabulations (code 9) remplacées par
9
et espaces (code 32) remplacées par*
:Hexdump:
Le code machine apparaît dans un fichier avec une extension
.com
. Lorsque je l'exécute, il imprime le message requis, puis se bloque (en exécutant des données aléatoires).Explication de haut niveau sur ce qu'il fait:
,'.$
)int 21
instruction, qui imprime le messageCode d'assemblage (peut être compilé avec
tasm
):Il utilise l'
popa
instruction pour faire apparaître tous les registres, parce que regularpop
ne peut pas remplir tous les registres nécessaires (par exemple,pop di
est un opcode interdit).Les adresses d'octets à corriger sont dans la plage 0x100 ... 0x160. Par chance, ils peuvent être représentés par une somme de 3 octets avec les valeurs autorisées:
bp
si
oudi
La correction des octets dans le message fonctionne de manière logique
OR
sur 0x20 (caractère espace) et une petite constante (4, 7, 12 ou 14). La petite constante est obtenue en initialisantcx
etdx
à 9 (caractère de tabulation) et en faisantINC
ouDEC
au besoin.La correction du code utilise l'
IMUL
instruction. J'ai trouvé les constantes 16 bits nécessaires pour se multiplier à l'aide de la recherche par force brute.Enfin, l'adresse du message (0x13b) est obtenue par multiplication. Pour économiser de l'espace, j'ai pris l'une des constantes de l'une des instructions, qui contient une valeur immédiate
0x96d
. Ici, la9
pièce choisit une fonction d’impression DOS et la6d
pièce est un paramètre libre. Il s’avère que6d
c’est la seule possibilité qui puisse donner 0x13b après la multiplication.Démontage de la partie code:
Anecdote: Normalement, j'utiliserais
offset message
le code codé en dur13bh
, mais dans ce cas, car au moment de l'analyse de son adresse est inconnue, tasm génère un décalage immédiat de 16 bits, gaspillant un octet de code:la source