Programme le plus court dont le programme + sortie concaténé est une permutation des 95 caractères ASCII imprimables

12

Écrivez un programme aussi court que possible (mesuré par le nombre d'octets), ne prend aucune entrée, ne contient aucun commentaire et génère une chaîne / séquence de caractères, de telle sorte que le programme + la sortie concaténés ont exactement 95 caractères et contiennent chaque caractère ASCII imprimable exactement une fois , c'est-à-dire que programme + sortie est une permutation des 95 caractères avec les codes ASCII 32-126:

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ 

En cas d'égalité, le gagnant est l'entrée dont le programme + sortie concaténé (95 caractères) est le plus proche de la chaîne ci-dessus, tel que mesuré par la distance d'édition de Levenshtein (c'est -à- dire le nombre de suppressions, insertions ou substitutions nécessaires pour le mettre en ordre ASCII).

res
la source
2
Cela signifie-t-il donc que si par exemple le programme contient des caractères répétés, il est automatiquement disqualifié? C'est rude.
boîte à pain le
1
Vous pouvez également décider si l'ancien echo $0est disqualifié.
Peter Taylor
3
Les caractères en dehors de la plage de caractères ascii imprimables (et éventuellement leurs doublons) sont-ils autorisés? Ou la sortie programme + doit-elle contenir chaque caractère imprimable exactement une fois, et rien de plus ?
primo
1
@primo Je suppose qu'ils sont autorisés. Je pense qu'il est temps d'écrire une solution "shift-and-eval" qui utilise des doublons (bien que les littéraux de chaîne vont être difficiles à obtenir)
John Dvorak

Réponses:

12

GolfScript, 14 caractères

{`),32>46-^}.~

Sortie :

 !"#$%&'(*+/015789:;<=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]_abcdefghijklmnopqrstuvwxyz|
Howard
la source
Le défi (au moins pour autant que je le comprenne) était d'écrire un programme dont le programme et la sortie sont une permutation des 95 caractères ASCII imprimables, et non d'écrire le programme le plus court possible qui génère les 95 caractères ASCII imprimables.
Frank Schmitt
Désolé, mon erreur. Dans le titre, il lit "programme + sortie", tandis que plus tard dans la question, il lit programme + sortie concaténé .
Frank Schmitt
),- sensationnel. J'aime ça.
John Dvorak
1
@JanDvorak codegolf.SE: le seul endroit où les gens s'enthousiasment pour une parenthèse rapprochée et une virgule. : P
Poignée de porte
@ Doorknob dans golfscript, cela signifie "annuler le droit (rparen) et créer un tableau de cette taille (virgule)". En effet, vous vous retrouvez avec une chaîne raccourcie d'un caractère (le bouclé à droite) et un tableau se terminant juste en dessous de la position ASCII de ce caractère (à |). Coupez les caractères non imprimables, la période et le xor (différence d'ensemble symétrique ici) avec le code source (la soustraction est prise) sans dire à droite bouclés, et vous avez terminé. Et oui, la chaîne xor est une chaîne.
John Dvorak
6

Perl, 89 caractères

C'est le meilleur que j'ai pu faire jusqu'à présent:

q< !"#%&'()+/8:?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\^_`abcdefghjklmosuvwxz|>;
print~-$=.73*2,y[]{}

Pour ceux qui ne connaissent pas les minuties Perl, les deux arguments de la printdéclaration pourraient être rendus comme ~(-($=)) . (73 * 2)et tr///.

Le programme produit 6 caractères:

591460

Malheureusement , chaque construction simple d'itération que je peux penser en Perl ( for, while, until, map, grep) actions au moins un caractère avec print. Si des retours à la ligne étaient autorisés à apparaître dans la sortie, je pourrais utiliser Perl 5.010 pour obtenir une solution à 87 caractères:

q{ !"#%&'*,-./0:;>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^`bcdfgjkmnoprtuvxz|~}while($_+=say)<9
boite à pain
la source
Voyons voir si je peux imprimer un plus grand nombre :-)
John Dvorak
euh ... pouvez-vous traduire la deuxième ligne pour moi?
John Dvorak
1
@JanDvorak $=est le nombre de lignes horizontales dans le périphérique de sortie actuel. Par défaut, 60. ~-$=est l'inversion au niveau du bit du complément à deux négatif de 60, qui se trouve être 59. 73*2est 146. .et ,faites ce que vous attendez d'eux. y[]{}est une autre façon de dire tr///, qui est l'opérateur de translittération. Cela prend $_et ne fait rien, car vous ne lui avez donné aucun caractère à remplacer. Il renvoie le nombre de caractères remplacés, qui est 0. Nous avons donc ~-$= . 73*2 , y[]{}= 59 . 146 , 0= '591460`.
Dan
6

PHP 67 octets

<?=U4eB1gkFdA6J9snZD2IE8y5PhwQV^xHGmqYMfNjKpbR3vcLalCWi0_TtrOSXouz;

Production:

-|"/@>& *+}:[!],'~(){.\`7#%$

Il semble qu'il devrait y avoir une solution de 65 octets, produisant 30 caractères au lieu de seulement 28, mais je n'ai pas réussi à l'aligner. Les 6 caractères inutilisés OSXouzont été collés à la place sur l'un des littéraux de chaîne.

Edit: Après réflexion, il n'est pas possible de générer plus de 28 caractères de cette manière. UPPER ^ lowerdonnera toujours un caractère compris entre 32 et 63, donc les 10 chiffres sont nécessaires pour @[\]_`{|}~. Quatre des 22 restants sont utilisés dans le script lui-même, ne laissant que 18 qui peuvent être obtenus avec des lettres seules. Le bris d'égalité pourrait cependant être considérablement amélioré.

primo
la source
Ah, bien sûr, mots nus. Comment aurais-je pu oublier?
John Dvorak
3

Rubis, 91 caractères

%{ !"#$&\',-/450:<=>ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcefghijklmnqvwxyz|~};puts(?@‌​.ord*98+1)

Sorties 6273.

%{...} tour volé à Jan Dvorak

Poignée de porte
la source
Sans commentaire. Comme indiqué clairement.
Johannes Kuhn
@JohannesKuhn Ah, je n'ai pas remarqué ça. édité.
Poignée de porte
%{ !"#$&\',-/450:<=>ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcefghijklmnqvwxyz|~};puts([email protected]*98+1)est ce que je pense que vous voulez (pour 91 caractères) avec le point-virgule déplacé pour être utilisé comme séparateur imprimable (au lieu d'une nouvelle ligne), et avec les lettres de 'ord' supprimées de l'intérieur des accolades.
res
@res Oui, il est difficile de gérer toutes ces lettres: P
Poignée de porte
Maintenant \ est inclus trois fois.
Howard
3

Perl, 61 caractères

print$:x8^CJIBQTOWAEULHVGFNMKRPZY,q<#"/;*g~?|={.>&+u15m97ws26

Production:

c@db[yo]le_ah\jfD`kX}zS-! %)('v304

$:par défaut à " \n-". x8le répète huit fois; le résultat de 24 caractères est ensuite xorisé au niveau du bit avec une barre de 23 caractères (le dernier -est laissé tel quel ). La deuxième partie est une chaîne q de 12 caractères au niveau du bit et une barre de 10 caractères (les 2 derniers caractères sont supprimés).

Grimmy
la source
1
Je trouve que la longueur de votre programme est de 61 caractères.
res
Merci. Mon éditeur de texte a signalé 62 caractères à cause de l'EOF.
Grimmy
1

Ruby, 95 caractères, 6 modifications

%{ !"#$&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz|~}

Oui. C'est ça. Juste un littéral de chaîne flottant qui n'est jamais imprimé. Ruby prend en charge les littéraux de chaîne (empruntés à Perl, je pense) sous la forme d'un délimiteur de type pour cent - le délimiteur est n'importe quel caractère non alphanumérique, et si le délimiteur d'ouverture est une parenthèse ouvrante (n'importe laquelle [({<), le délimiteur de fermeture est le délimiteur correspondant crochet de fermeture (les crochets imbriqués sont autorisés).

Je me rends compte que c'est plus une soumission de base, mais à moins que quelqu'un ne parvienne à imprimer quelque chose ou à moins qu'il y ait un langage avec une chaîne de caractères de forme libre à deux caractères avec un délimiteur d'ouverture et de fermeture différent , c'est le meilleur qui soit.

John Dvorak
la source
0

Tcl 96, modifier la distance 12

if 0    {!"#$%&'()*+,-./123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdeghjklmnopqrstuvwxyz|~}
Johannes Kuhn
la source
L'un des espaces devrait être un onglet, je le crains
John Dvorak
un onglet ou un espace est-il imprimable?
Johannes Kuhn
l'onglet n'est pas imprimable (ASCII 9), mais l'espace est imprimable (ASCII 32).
John Dvorak
1
[Je viens de voir que le PO n'a clarifié cela qu'après avoir répondu :)]
flornquake
1
join {!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghklmpqrstuvwxyz|~} semble fonctionner avec 95 caractères? (Merci pour votre entrée. Désolé pour le caméléon - malheureusement j'ai édité à la hâte, et j'aurais dû faire les choses différemment.)
res