Qu'avons-nous oublié?

31

Votre tâche consiste à écrire un programme informatique non vide composé d'une séquence d'octets. Si nous choisissons un octet particulier dans le programme et en supprimons toutes les instances du programme, le programme modifié doit sortir l'octet supprimé.

Par exemple, si notre programme était

aabacba

Puis bcbsortirait a, aaacaaurait besoin de sortir bet aababasortirait c.

Peu importe ce que fait le programme non modifié.

Les réponses seront notées en octets, l'objectif étant de minimiser le nombre d'octets.

Assistant de blé
la source
4
Puisque ce défi n'est pas étiqueté quine, pouvons-nous lire notre propre code source?
Dennis
1
@Dennis Sure. Soyez mon invité
Wheat Wizard
2
Si tous les octets de notre programme représentent des chiffres, pouvons-nous sortir via le code de sortie?
M. Xcoder
15
Je pense que ce serait mieux comme un défi de code où vous devez maximiser le nombre de caractères discrets utilisés.
Notts90
2
Doit avoir spécifié plus d'un octet au lieu de non vide : P. Ou ce que Notts90 a dit.
Urne de poulpe magique

Réponses:

70

zsh, 603 594 566 561 548 440 415 399 378 370 octets

ec
ho \\n;ca t<<<$'\x20';exi t
d$c -e8BC6P
d0c -eKp
$'\172\163\150' $'\055\143' $'\146\157\162 v \151\156 \173\043\056\056\134\175\175\073\173 \146\147\162\145\160 \055\161 $\166 '$0$'\174\174\074\074\074$\166\073\175'
$'\145v\141\154' $':\073\072\046\046\145\170\151\164';#%&()*+,/9=>?@ADEFGHIJLMNOQRSTUVWXYZ[]^_`jklmsuwy
0# $#;for b in {$..z};{ fgrep -q $b $0||<<<$b;}

Dépend de coreutils + dc.

Essayez-le en ligne!

C'était ... un voyage.

Cette réponse comporte trois parties. Les 4 premières lignes gèrent certains cas particuliers pour simplifier le code qui suit. Les 2 lignes suivantes et la dernière ligne accomplissent toutes deux essentiellement la même chose, mais exactement une est exécutée avec la suppression d'un caractère donné. Ils sont écrits avec des jeux de caractères pour la plupart complémentaires, de sorte que la suppression de tout caractère ne rompt qu'un seul, permettant à l'autre de continuer à fonctionner.

En regardant la première partie, nous nous occupons d'abord

  • suppression de la nouvelle ligne avec ec\nho \\n
  • suppression d'espace avec ca t<<<$'\x20'(suivi de exi tpour éviter d'exécuter du code plus tard, ce qui entraînerait une sortie étrangère)
  • $suppression avec d$c -e8BC6P( 8BC6= 9226is 36*256 + 10, et 36 et 10 sont les valeurs d'octet des $caractères et newline respectivement; nous utilisons des chiffres hexadécimaux en décimal pour éviter d'avoir à les inclure dans le grand commentaire de la ligne 6)
  • 0suppression avec d0c -eKp( Kobtient la précision décimale, qui est 0par défaut)

Dans la partie suivante, les seuls caractères utilisés (à part les ordures à la fin de la deuxième ligne) sont $'\01234567v;, l'espace et la nouvelle ligne. Parmi ceux-ci, quatre ont été pris en compte, de sorte que le reste ( '\1234567v) ne peut pas apparaître sur la dernière ligne. En développant les échappements octaux ( $'\123'représente le caractère ASCII avec la valeur 123 8 ), on obtient:

zsh -c 'for v in {#..\}};{ fgrep -q $v '$0'||<<<$v;}'
eval ':;:&&exit'

La première ligne parcourt tous les caractères utilisés dans le programme et recherche chacun dans son propre code source ( $0c'est le nom de fichier du script en cours d'exécution), en imprimant tout caractère introuvable.

La deuxième ligne semble un peu étrange et semble faire la même chose exitqu'avec un tas de nops. Cependant, le codage exiten octal entraîne directement $'\145\170\151\164'ce qui ne contient pas 2ou 3. Nous devons en fait rendre cela moins résistant aux renvois. En effet, si l'un d'entre eux '\014567vest supprimé, la première ligne est rompue, la deuxième ligne se rompt également, permettant au reste du code de s'exécuter. Cependant, nous avons besoin qu'il se casse également si 2ou 3sont supprimés pour que les lignes 3 et 4 puissent s'exécuter. Ceci est accompli par le cordage des chaussures dans :et ;, qui ont respectivement 2 et 3 dans leur représentation octale.

La jonque à la fin de la ligne 2 est simplement là pour s'assurer que chaque caractère ASCII imprimable apparaît au moins une fois, car la manière dont la vérification est effectuée en bouclant à travers chacun l'exige.

Si exitn'a pas été appelé dans la première section (c'est-à-dire qu'il a été mutilé par la suppression de l'un '\01234567v), nous passons à la seconde, dans laquelle nous devons accomplir la même chose sans utiliser aucun de ces caractères. La dernière ligne est similaire à la première ligne décodée, sauf que nous pouvons réduire la plage de la boucle pour économiser quelques octets, car nous savons déjà que tous les caractères, à l'exception de, '\01234567vont été couverts. Il a également 0# $#devant lui, qui le commente et l'empêche de produire une sortie étrangère si 0ou a $été supprimé.

Poignée de porte
la source
5
Wow, très impressionnant compte tenu de la quantité de personnages distincts impliqués! Je suis vraiment impatient de voir cette explication.
Kevin Cruijssen
3
@KevinCruijssen c'est parti :)
Poignée de porte
1
@ Doorknob si cela ne vous gagne pas 548 internets, je ne sais pas ce qui fait. Honnêtement, la version 603 octets est tout aussi impressionnante hah!
Urne de poulpe magique
3
La seule réponse intéressante à ce jour.
htmlcoderexe du
21

Rétine , 1 octet

1

Essayez-le en ligne!

Lorsque toutes les instances du seul octet ( 1) sont supprimées, la sortie est 1. Assez simple.

Conor O'Brien
la source
6
Je parcourais TIO pour trouver quelque chose comme ça - tu m'as battu. Btw this is a polyglot, works with Snails
JayCe
OMI, cette réponse devrait être mise à niveau vers une réponse polyglotte comme la première (peut-être avec une liste de langues toujours incomplète), et les deux autres sous-évaluées à l'oubli. Oh, et cela aussi fonctionne en C .
@Rogem Je ne sais pas trop ce que vous entendez par "ça marche en C." avez-vous un compilateur C qui sort 1pour le programme vide? Quoi qu'il en soit, je pense que les réponses en question utilisent des approches et des comportements différents. OMI, une réponse polyglotte n'est justifiée que si l'approche reste la même. (Objectivement, ce n'est pas un polyglotte car le code réel est différent, pour les réponses ci-dessous.) N'hésitez pas à voter comme vous le souhaitez, mais une réponse valide est une réponse valide. Je garderai ma réponse telle qu'elle est, je ne souhaite pas y héberger une collection de réponses.
Conor O'Brien
11

Lenguage, 216173027061157310 octets

216173027061157310 = (144115617572598740 + 144115241762960340 + 144115194786755540) / 2. Il y a des 216173027061157310 - 144115617572598740 $s, des 216173027061157310 - 144115241762960340 #s et des 216173027061157310 - 144115194786755540espaces.

Les 144115617572598740 #s et espaces codent le programme BF suivant:

++++++[>++++++<-]>.

Essayez-le en ligne!

Les 144115241762960340 $s et espaces codent le programme BF suivant:

+++++++[>+++++<-]>.

Essayez-le en ligne!

Les $s et #s 144115194786755540 codent le programme BF suivant:

++++++++[>++++<-]>.

Essayez-le en ligne!

Edit: 72057832274401770 octets enregistrés grâce à @Nitrodon.

Neil
la source
Pourquoi ne pas utiliser Uet octet 127? Essayez-le en ligne! Ou même juste l'octet nul et soh?
Jo King
@JoKing Je ne savais pas que Uc'était l'octet ASCII imprimable le plus court qui pouvait être sorti. Je ne voulais pas utiliser d'octets non imprimables.
Neil
Même sans tirer parti des cellules d'habillage ou des caractères non imprimables, vous pouvez réduire cela à 216173027061157310 octets en incluant le caractère espace comme troisième octet distinct.
Nitrodon
7
Je ne peux pas m'empêcher de voter à cause de "Edit: Saved 72057832274401770 bytes ..."
Mr Lister
10

Gelée , 1 octet

0

Complètement différent de la réponse Retina. sifflets

Essayez-le en ligne!

Dennis
la source
6
Polyglotte avec M et Enlist.
M. Xcoder
9

Polyglotte * , 1 octet (en attente de confirmation )

0

Essayez-le en ligne! (en utilisant la triangularité)

*: Cela fonctionne dans une (assez large) variété de langues (à l'exception des esolangs comme 4,> <> et similaires et quelques autres exceptions). Identique à la réponse Jelly dans le code source, mais la méthode d'E / S est différente - La sortie se fait via le code de sortie. Quand on supprime 0du code source, ils se retrouvent avec un programme vide, qui souvent ne fait pas d'erreur et donne le code de sortie 0 dans la majorité des langues.

M. Xcoder
la source
3

sed , 1 octet



Essayez-le en ligne!

Complètement différent de la réponse Retina ou de la réponse Jelly.

tsh
la source
Je ne vois aucun code. Cela n'en ferait-il pas une réponse de 0 octet? Comment cela marche-t-il?
Mast
15
@Mast Il y a une nouvelle ligne ..... vous aurez du mal à lire des programmes écrits en Whitespace si vous continuez à penser comme ça.
user202729
3

Unaire (non compétitif), 96 octets

00000000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000050: 0000 0000 0101 0101 0101 0101 0101 0101  ................

Voici le xxdvidage.

Une définition plus large de la langue unaire autorise tous les caractères de son code source. Mais je n'ai pas trouvé de compilateur ou d'interprète qui fonctionnerait pour cela. J'ai donc marqué cette réponse comme non compétitive. Si vous pouvez en trouver un qui a été publié avant que cette question ne soit posée, je vais y accéder.

tsh
la source
4
C'est le plus petit programme Unary que j'ai jamais vu.
Draco18s