Modèle de programme pour imprimer * toute * chaîne


40

Ecrivez un programme avec les propriétés suivantes:

  • Lorsqu'il est exécuté tel quel, le programme ne génère aucune sortie (c'est-à-dire 0 octet de sortie).

  • Il y a un emplacement dans le programme (de votre choix: il pourrait être au début, à la fin ou quelque part au milieu) avec la propriété suivante: modifier le programme en y plaçant une chaîne quelconque entraînera son impression par le programme résultant réalisé.

    Cela doit fonctionner que la chaîne contienne des guillemets, des barres obliques inverses, des marques de commentaire, des délimiteurs, des octets NUL, etc. peu importe ce que vous placez là-bas, la chaîne est toujours interprétée comme une chaîne et imprimée intégralement. Cependant, vous pouvez ne pas gérer de très longues chaînes si le compilateur manque de mémoire ou autre (pour être plus précis, vous devriez au moins pouvoir gérer des chaînes allant jusqu'à 1000 octets de long ou trois fois plus longues). durée de votre programme, selon la durée la plus longue).

Un exemple de solution non valide serait

print("");
#      ^ text goes here

en Python, Perl, Ruby, etc .; bien que cela fonctionne pour de nombreuses chaînes, cela ne fonctionnera pas pour une chaîne contenant un guillemet double ou une chaîne contenant la sous-chaîne \n(qui serait interprétée comme une nouvelle ligne).

Notez que ce problème est probablement impossible dans la plupart des langues; le défi consiste au moins partiellement à trouver une langue où cela fonctionne. La langue que vous avez choisie doit être un langage de programmation au sens de la définition de ce site , par exemple, aucune soumission de solution en texte .

S'agissant d'un , le modèle de programme le plus court l'emporte. Cependant, ne vous découragez pas de soumettre des solutions, même s'ils ne peuvent pas battre le gagnant actuel! Vous pouvez toujours concourir pour les deuxième, troisième places, etc. ou simplement pour trouver autant de réponses que possible. Cependant, vous devez vous assurer que votre programme respecte l'intégralité de la spécification avant de le soumettre. Des solutions approximatives passeraient à côté du problème.


Le message Sandbox correspondant est ici .

Pouvez-vous clarifier la gamme de caractères que nous devons prendre en charge pour la chaîne insérée? ASCII? ASCII + non imprimable? Tout de Unicode?
DJMcMayhem

3
Tous les 256 octets. Que vous interprétiez ces octets ou Unicode dépend de vous; cela ne fera pas beaucoup de différence une fois imprimé.

1
Le but de la question (et sa formulation actuelle) est que vous ne pouvez obtenir aucun résultat supplémentaire. Aviez-vous une solution en tête qui ne peut pas être adaptée pour l'éviter? (Utiliser des octets supplémentaires pour éviter les sorties parasites est préférable à la création de sorties parasites et au non-respect des spécifications.)

1
Si cela ne nécessitait pas un changement de code, ce serait trivial AWK, il le 1ferait.
Robert Benson

Réponses:


37

Excel, 1 octet

'

Version non-golfée

'        <-- print the following text,
             and exit the current formula

Je ne pense pas que cela peut accepter les nouvelles lignes.
Conor O'Brien

3
@ ConorO'Brien cela fait avec shift + enter
Adam

2
@MrPaulch C'était beaucoup d'ingénierie rétro. Je suis à peu près sûr que cette commande cache d'autres fonctionnalités inconnues, telles que le crash du système.
Adam

1
Cela fonctionne également sur OpenOffice Calc. Il est utilisé automatiquement lorsque vous définissez une cellule au format @.
Ismael Miguel

1
Personnellement, je pense que cette réponse est correcte. @Dennis a supprimé mon article Mathematica qui utilise le même concept. Le serveur frontal d'Excel enregistrera le test // "" "/// sous forme de chaîne non textuelle. Par conséquent, sa logique le supprime. Voici comment il est stocké <Row> <Cell> <Data ss: Type =" Chaîne "x: Ticked =" 1 "> test //" "/// </ Data> </ Cell> </ Row>
Kelly Lowder

20

Jolf, 6 octets

a Lq6(

Explication

a Lq6(
a       print
  L 6   all but the first 6 characters of
   q    the source code
     (  and exit

15

Perl 5 , 30 21 19 octets

print <DATA> __ END__

Essayez-le en ligne!

Retour à la ligne. Cela utilise une fonctionnalité Perl qui permet d’ajouter des données arbitraires au fichier source, qui peuvent ensuite être lues via le DATAdescripteur de fichier . Lorsque nous donnons un descripteur de fichier en argument print, un contexte de liste lui est attribué, ce qui lui permet de renvoyer une liste de toutes les lignes du fichier, y compris les nouvelles lignes (de même que les nouvelles lignes de la dernière ligne seront omises). Puis, printimplicitement, tous les enchaînent, annulant la division en lignes et nous donnant la chaîne originale exacte, quel que soit l'emplacement des nouvelles lignes.

Merci à @Dada, qui s'est rendu compte qu'il n'était pas nécessaire de gérer les nouvelles lignes manuellement, et à @ninjalj et @b_jonas, qui ont repéré un personnage qui pourrait être joué au golf.


2
Je ne pense pas que vous avez besoin undef$/. En tant qu'argument de print, <DATA>est appelé dans le contexte de liste, il doit donc lire chaque ligne.
Dada

Tu as raison. Il lit l'entrée d'une ligne à la fois, en conservant les séparateurs de ligne, puis les concatène implicitement lors de l'impression. Il n'est donc pas nécessaire de laisser couler l'eau au début. C'est également une économie de 8 octets; Je vais réparer le post.

4
Vous pouvez utiliser __END__au lieu de __DATA__.
Ninjalj

Ce que @ninjalj dit, plus vous pouvez omettre la nouvelle ligne après le signe supérieur à (mais vous avez besoin de la nouvelle ligne à la fin du programme).
b_jonas

14

Zsh, 6 octets

<<'
'

Il y a un retour à la ligne. La chaîne est insérée à la fin du programme.

Frapper, 20 17 octets

Merci à Adam d' avoir supprimé 3 octets.

exec sed 1d "$0"

* script shell nix, 21 14 octets

Merci à Adam d' avoir supprimé 7 octets.

#!/bin/sed 1d

1
@Copper Il y a une fin de ligne. La chaîne est insérée après cela.
Jimmy23013

Ah, je vois. Merci de me corriger!
Cuivre

Les solutions à 6/9 octets semblent exploiter un bogue dans l'interpréteur (ce n'est pas que ce soit interdit, bien sûr). (AFAICT avec quelques expériences, ils recherchent une nouvelle ligne sur une ligne, mais les lignes sont définies en séparant les nouvelles lignes, de sorte qu'une nouvelle ligne sur une ligne ne peut jamais arriver.) La zshsolution semble correcte. Cependant, la bashsolution à 9 octets est incorrecte (elle ajoute un retour à la ligne final si le fichier n'en a pas).

@ ais523 semblait être un bug pour moi aussi. Et je ne m'attendais pas à ce qu'ils soient autorisés par les interprètes. Suppression de la solution Bash.
Jimmy23013

1
pour bash, vous pouvez utiliser sed 1dau lieu detail -n+2
Adam

13

brainfuck ( Unfeadable Brainfuck ), 9 octets

,+[-.,+]!

Ajoutez l'entrée à la fin. Il n'y a pas de retour à la ligne, cette fois.

À la recherche de langues acceptant les contributions ajoutées à la fin du programme, le brainfuck semblait être une possibilité distincte; de nombreux interprètes de brainfuck écrits en esolangs prennent à la fois le programme et l'entrée du programme dans l'entrée standard, et ont donc besoin d'un moyen de faire la distinction entre eux. Dans ce cas, il existe une convention selon laquelle un !personnage différencie le programme de l'entrée, une astuce souvent utilisée pour écrire de courts programmes de type brainfuck ,[.,]!Hello, world!. cela crée fondamentalement un dialecte différent de brainfuck dans lequel !a une signification différente de la normale.

En théorie, nous pourrions donc simplement trouver un de ces interprètes et lui donner un catprogramme afin de répondre à la spécification. Il y a une grande subtilité, cependant; brainfuck utilise généralement 256 valeurs pour chaque cellule, il y a 256 octets et il faut en utiliser une pour EOF. Donc, si nous voulons pouvoir faire écho littéralement les 256 octets, nous ne pouvons pas détecter EOF du tout et nous devrons mettre fin au programme d'une autre manière. En d'autres termes, nous devons trouver une implémentation donnant soit des valeurs différentes aux 256 octets et 257 EOF, soit une panne sur EOF.

Entrez illisible . Un illisible interprète un cerveau qui précède ce défi et accepte les entrées après un !; de plus, contrairement à la plupart des interpréteurs brainfuck, il utilise des cellules bignum et -1 pour EOF, ce qui permet de distinguer EOF des 256 autres octets possibles. Ainsi, en utilisant Unfeadable Brainfuck comme interprète spécifique du programme, nous pouvons résoudre le problème en seulement 9 octets, via l'écriture d'un catprogramme de brainfuck qui s'arrête sur EOF = -1.

Est-il possible de faire mieux? Eh bien, nous pourrions essayer le programme suivant de 7 octets, qui tente de produire un fichier EOF à la fin de la chaîne avant qu'elle ne sorte de la boucle:

+[,.+]!

Le comportement de ce programme dépend du comportement de l'interprète Unreadable sur les conditions d'erreur (donc, cela dépend non seulement de la mise en œuvre de brainfuck, mais de la mise en œuvre utilisée pour exécuter la mise en œuvre de brainfuck). Malheureusement, l'interpréteur illisible que j'utilise génère des erreurs de sortie sur une sortie standard , ce qui signifie que cette sauvegarde ne fonctionne pas. Si quelqu'un connaît un interprète illisible qui tente de produire une sortie EOF ou l'ignore silencieusement, faites-le-moi savoir; ce serait une solution de sept octets juste là.


1
,[.,]!fonctionne ici et fait 6 octets (cochez la case correspondante !). Aussi ça se termine.
FinW

@FinW: Je n'arrive pas à comprendre comment entrer un octet NUL sur ce site Web, mais ce code se terminerait définitivement plus tôt s'il en voyait un.

cela a bien fonctionné sans octet NUL quand je l'ai fait.
FinW

1
Vous avez littéralement un ,(entrée standard lue sur l'élément de bande en cours) suivi d'un ](boucle de sortie si l'élément de bande en cours est 0). Ainsi, la lecture d’un octet d’entrée de valeur 0 (c’est-à-dire NUL) romprait la boucle.

Mais si l'interprète ne lit aucune entrée (par exemple la fin de la chaîne après le !), il définit automatiquement l'élément de bande en cours sur 0, mettant ainsi fin à la boucle.
FinW

9

Dyalog APL , 11 octets

Ce qui suit est le corps de la fonction f :

2↓⎕CR'f'⋄→

Il y a une fin de ligne, après quoi tout peut être inséré.

2↓ déposer les deux premières lignes (en-tête et cette ligne) de

⎕CR'f'le C haracter R ePresentation de f

puis

quitter


9

Ruby, 20 octets

print * DATA
__FIN__

L'entrée se termine à la fin (après la fin de la dernière ligne). L' DATAidiome est l'un des nombreux objets que Ruby a volés à Perl .

Essayez-le sur eval.in: https://eval.in/684370


1
Il a non seulement volé, il est même plus court ...
simbabque

9

JavaScript + HTML5 DOM, 163 octets

<html><body><script>fetch(location).then((r)=>r.text().then((t)=>console.log(t.slice(145,t.lastIndexOf("</b")))));document.body.remove()</script></body></html>

Vous pouvez insérer ce que vous voulez directement avant la balise body de fermeture. Cela fonctionne en récupérant le source de la page et en supprimant le code d'ouverture et les balises de fermeture.

Le vrai kicker était de savoir comment échapper à une boucle infinie. Mettre while(true){}dans la page bloque tous les rappels pour toujours, geler l'exécution, et JavaScript n'a aucun moyen de suspendre le thread principal. Cependant, le code qui n'existe plus ne s'exécute jamais et le corps du document valide alors seppuku dans la toute dernière commande, puis se supprime pendant l'attente du chargement de son clone.

Oui, c'est long et détourné, mais le simple fait que ce soit possible dans JS est assez surprenant.


1
Chrome s'est récemment énervé contre les scripts de blocage de l'analyseur et s'en plaint beaucoup. J'aime l'idée de bloquer intentionnellement l'analyseur pour empêcher tout script y compris de ruiner votre tentative d'impression.

7

PHP, 46 octets

(y compris le saut de ligne de fuite)

<?=join([""]+file(__FILE__));halt_compiler();
STRING HERE

Oui, même la filefonction est sécurisée en binaire.

[""]+ remplace l'index 0 (première ligne du fichier) par une chaîne vide


6

gs2 , 4 octets

╥¶=☼

Utilise le codage CP437. La chaîne va à la fin. récupère le code source, appuie sur 4, =supprime le nombre de caractères principaux et quitte.

Essayez-le en ligne!


5

PHP 94 octets

<?$f=fopen(__FILE__,'rb');fseek($f,93);while(false!==($c=fgetc($f)))echo$c;__halt_compiler();

Placez votre chaîne après le dernier point-virgule.

Yay pour les fonctionnalités obscures je suppose? __halt_compiler () fait exactement ce que vous attendez du nom. Le code précédent ouvre simplement le fichier et écrit tous les octets postérieurs au dernier point-virgule sur la sortie standard. NUL, BEL etc. vont bien. Les littéraux Unicode () sont bousillés sous Windows mais je pense que c'est juste que Windows cmd échoue à Unicode.


1) Je compte 93 octets, pas 94. 2) false!==$c=...N'a pas besoin de parenthèses. 3) rbn'a pas besoin de citations. 4) Vous pouvez enregistrer un octet avec for($f=fopen(...),fseek($f,88);false!==(...);)echo$c;5) deux autres octets plus courts:<?for($f=fopen(__FILE__,rb);false!==$s=fgets($f,86);)echo$i++?$s:"";__halt_compiler();
Titus

6) et deux autres octets si vous omettez le deuxième paramètre fgetset ajoutez un saut de ligne de fin au modèle.
Titus


3

PHP, 48 60 octets

<?=substr(file_get_contents(__FILE__),60);__halt_compiler();STRING HERE

Je viens de prendre conscience que la fermeture de PHP n'empêche pas la chaîne de contenir <?.


Vous avez un crochet de fermeture égaré. Dump de fichier beaucoup plus ordonné que ma tentative cependant, je pensais que substr () s'étoufferait avec les octets nuls - suppose que non.
ToXik-yogHurt

Essayez ceci: <?die(substr(file_get_contents(__FILE__),48))?>STRING HERE. Devrait marcher. J'ai essayé avec <?die('a')?>et ça a fonctionné.
Ismael Miguel

@IsmaelMiguel ne fonctionnera pas. dien’imprime pas ce paramètre, mais l’envoie comme code de sortie. Cela devrait ´tre die(print ...).
Titus

@ ToXik-yogHurt la plupart des fonctions de chaîne sont sécurisées en binaire. même file. En fait, je ne peux actuellement pas penser à ce qui ne l’est pas.
Titus

@Titus Trydie('text');
Ismael Miguel

2

Lambda Calcul binaire , 1 octet

 [text goes here]

C'est un espace unique (0x20) avant le texte.

Essayez-le en ligne!

Comment ça marche

0x20 = 00100000 2 est analysé comme

00    λx.
01        x
0000  (ignored, can be anything)

(Donc, en fait, tous les personnages !"#$%&\'()*+,-./fonctionneront aussi bien.)

S'agissant d'une expression complète, le reste du programme est interprété comme une donnée d'entrée et, selon les conventions d'entrée-sortie du calcul lambda binaire, la fonction d'identité λ x. x copie directement l'entrée dans la sortie.


Par intérêt, pourquoi les derniers bits zéro entre la fonction d'identité et l'insertion ne sont-ils pas répercutés?

@ ais523 L'interprète lit un octet à la fois, et une fois λ x . x a été analysé, le remplissage a déjà été consommé.
Anders Kaseorg

2

Bash, 17 octets

tail -n+3 $0
exit
<string here>

Développé indépendamment de la réponse de jimmy23013 .


Tu ne veux pas dire $0? En dehors de cela, je pense que cela fonctionne (j'ai confirmé qu'il n'analyse rien après exit).

@ ais523 Fixe! Merci.
nozɐɹƆ


1

Excel VBA, 6 octets

Il s’agit principalement de répondre à la question de savoir comment imprimer le texte tel la fenêtre Réponse de Adam à la fenêtre Immédiat dans l'environnement VBA.

Configuration de base:

Dans la cellule A1 de la feuille active, utilisez la formule ci-dessous pour contenir la chaîne à imprimer. Pour bien compter les octets, il faut ajouter 1 octet.

'[Your Text Here]

par exemple:

'Hello 
World

Fonction de fenêtre immédiate, 5 + 1 = 6 octets

?[A1]

+1 octet pour un 'dans la cellule A1


0

Vim (en mode ex), 28 octets

#!/bin/ex -c ':1d' -c ':wq'
[string]

28 octets incluent la dernière nouvelle ligne.


0

Vim, 738 octets

:imap <esc> <c-v><esc>
:imap <c-a> <c-v><c-a>
:imap <c-b> <c-v><c-b>
:imap <c-c> <c-v><c-c>
:imap <c-d> <c-v><c-d>
:imap <c-e> <c-v><c-e>
:imap <c-f> <c-v><c-f>
:imap <c-g> <c-v><c-g>
:imap <c-h> <c-v><c-h>
:imap <c-i> <c-v><c-i>
:imap <c-j> <c-v><c-j>
:imap <c-k> <c-v><c-k>
:imap <c-l> <c-v><c-l>
:imap <c-m> <c-v><c-m>
:imap <c-n> <c-v><c-n>
:imap <c-o> <c-v><c-o>
:imap <c-p> <c-v><c-p>
:imap <c-q> <c-v><c-q>
:imap <c-r> <c-v><c-r>
:imap <c-s> <c-v><c-s>
:imap <c-t> <c-v><c-t>
:imap <c-u> <c-v><c-u>
:imap <c-v> <c-v><c-v>
:imap <c-w> <c-v><c-w>
:imap <c-x> <c-v><c-x>
:imap <c-y> <c-v><c-y>
:imap <c-z> <c-v><c-z>
:imap <c-@> <c-v><c-@>
:imap <c-\> <c-v><c-\>
:imap <c-]> <c-v><c-]>
:imap <c-^> <c-v><c-^>
:imap <c-?> <c-v><c-?>
i

Rappelle tous les caractères de contrôle en mode insertion à <c-v> , suivi de ce caractère de contrôle, qui les entrera littéralement. ^ _ (unité séparateur) ne semble pas avoir besoin d'être ré-associé, car il est sorti littéralement par défaut.

Le texte variable vient à la fin, bien sûr.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.