Détecteur de rayonnement!

26

Un programme durci par rayonnement est un programme où, si un caractère du code est supprimé, le programme fonctionnera toujours de la même manière. Pour cette question, nous allons écrire un programme qui détecte quand il est irradié.

Écrivez un programme ou une fonction qui, quand un seul octet est supprimé, le programme résultant sortira cet octet et uniquement cet octet. ( Vous pouvez sortir cet octet plusieurs fois, tant que vous ne sortez aucun autre octet )

Règles:

  • Le programme doit contenir au moins 2 octets distincts. (Pas de solutions de seulement 0s;)
  • Peu importe ce que fait le programme d'origine
  • Pas de lecture de votre propre code source.
  • Le code sera noté sur le nombre d'octets distincts, où le montant le plus élevé gagne. Par exemple, abc= 3 points, ababba= 2 points, abcgagne.
    • Le bris d'égalité est le nombre d'octets le plus petit, suivi de l'heure de soumission antérieure

Bonne chance!

Jo King
la source
Sandbox Post (supprimé) Relié , lié , lié
Jo King
J'ai raté cette ligne. Honte sur moi!
Mego
5
"Le code sera marqué sur le nombre de caractères distincts, où le montant le plus élevé gagne." Je m'attends à ce que la plupart des solutions (sinon toutes) aient une forme de chaîne quelque part qu'elles peuvent simplement remplir avec des caractères arbitraires sans réellement changer la solution (il s'agit donc simplement de savoir si votre langue est limitée à ASCII, ASCII étendu ou Unicode) .
Martin Ender
3
... Le bac à sable n'est pas parfait. :( / Vous pouvez simplement mesurer des "octets distincts" au lieu de "caractères distincts", car les caractères sont liés à l'encodage et à d'autres problèmes.
user202729
1
Le programme peut-il prendre n'importe quelle entrée?
gggg

Réponses:

15

05AB1E , 9 7 octets (Score de 3)

22'''rr

Essayez-le en ligne!

Suppression d'un '

Si tout est 'supprimé, 22''rr22 sera la première chose sur la pile et 'la dernière chose sur la pile, ce qui, une fois inversé deux fois, entraînera '.

Suppression d'un r

Si tout est rsupprimé, 22'''r22 est la première chose sur la pile, 'la seconde sur la pile et rla dernière sur la pile. Ceci r, cependant, a été précédé par un 'qui en fait la chaîne littérale "r"(par opposition à la commande reverse stack), qui est implicitement imprimée.

Suppression d'un 2

Si tout est 2supprimé, cela 2'''rrse traduira par 2être la 1ère chose sur la pile, 'être la 2ème chose sur la pile et enfin rêtre la dernière chose sur la pile, qui une fois inversée entraînera 2.

Par conséquent, cette réponse est valide. Sans rien retiré, il sort ', ce qui n'est pas pertinent. Cela fonctionne également pour tout nombre autre que 2.


Créé un vérificateur de validité, vous pouvez l'utiliser pour participer à 05AB1E *.

* Je ne suis pas sûr à 100% du nombre de solutions possibles dans 05AB1E ...


Des solutions plus valables qui sont pires ou identiques

  • 1 point (invalide)
  • 2 points
    • '''''''VV, '''''''XXou'''''''<any command that pops a without pushing>x2
    • Tout nombre impair 'supérieur à 3 suivi par tout nombre pair ssupérieur à 1 (EG '''''''''ssss).
    • '''..avec un nombre de périodes supérieur à 1 et un nombre impair 'supérieur à 2.
  • 3 points
    • '\\'''rr- même idée que 22'''rrmais \"supprimer le dernier élément de la pile".
Urne de poulpe magique
la source
La sortie normale de 'n'est pas pertinente par les règles, comme vous le dites. Mais cela invalide l'objectif nominal de détection des anomalies, ce qui est un peu drôle.
gggg
1
@gggg Je suis assez certain qu'au moins UNE de mes alternatives n'imprime rien lol.
Urne de poulpe magique
1
@MagicOctopusUrn Vous êtes les bienvenus. Je pensais que je pourrais aussi bien éditer au lieu de commenter.
boboquack
@boboquack a fonctionné ma balise d'origine (@boboquack), ou l'avez-vous trouvée en consultant à nouveau le message? J'essaie de comprendre comment les balises fonctionnent lorsque l'utilisateur n'a jamais commenté lol.
Urne de poulpe magique
@boboquack Je veux dire, avez-vous reçu une notification de mon "merci"? De plus, nous devrions probablement supprimer ce fil jusqu'à mon +1 pour votre "Vous êtes les bienvenus".
Urne de poulpe magique
9

Brainfuck, Score 3

Peut ne pas être compétitif car la sortie n'est visible que via un vidage de la mémoire.

+++++++++++++++++++++++++++++++++++++++++++++,-

En supposant que l'entrée est vide et EOF laisse la cellule inchangée. Utilise un interpréteur qui transfère la mémoire vers une sortie, comme celle-ci .

Supprimez un plus, et la mémoire est la valeur unicode pour "+", sinon c'est la valeur unicode pour ",". C'est plus une règle que une réponse. À peu près la même chose avec "-". Abuse le fait que ces trois personnages se succèdent dans le jeu de caractères unicode.

Håvard Nygård
la source
Intelligent, pour être tout à fait honnête, ne pensez pas que ce soit une échappatoire.
Magic Octopus Urn
Vous supposez que l'EOF laisse la cellule inchangée, oui?
Jo King
Ouais, et tant qu'il n'y a pas d'entrée, ça devrait aller 😊
Håvard Nygård
Je suis tenté de permettre cela, mais croyez - vous avoir un interprète qui a une décharge de mémoire que les cellules ne Would sortie changé et sort de la cellule inchangée sur EOF?
Jo King
1
copy.sh/brainfuck Celui-ci devrait fonctionner correctement . Il suffit de l'exécuter et de cliquer sur "Afficher la mémoire".
Håvard Nygård
9

Un poirier, 256 octets distincts, 975 octets

Malheureusement, la question nécessite à peu près une solution optimale pour contenir un octet NUL quelque part (car elle doit contenir les 256 octets quelque part). Cela signifie que a) je ne peux pas vous donner un lien TIO (parce que TIO n'aime pas NUL dans les programmes, ou au moins, je n'ai pas trouvé de moyen de le taper que mon navigateur peut gérer), et b) I ne peut pas coller le programme dans Stack Exchange littéralement. Au lieu de cela, j'ai placé un xxdvidage hexadécimal réversible caché derrière le lien "extrait de code" ci-dessous.

Explication

Ce programme se compose de trois parties identiques. (La concaténation de plusieurs parties identiques d'un programme est quelque chose d'un thème pour moi dans programmes de aux .) Chaque A Pear Tree a besoin d'une somme de contrôle quelque part pour permettre à l'interprète de savoir quelles parties du programme exécuter; il fait tourner toute partie du programme pour laquelle la somme de contrôle réussit au début avant de l'exécuter (ou s'imprime a partridgesi aucune somme de contrôle ne correspond). Dans ce cas, nous avons une somme de contrôle sur chacune des trois parties, et donc une partie non irradiée se déplacera au début. On peut donc supposer que le programme se compose d'une partie non modifiée, suivie de deux autres parties (dont une peut avoir été modifiée).

Chaque partie commence par une nouvelle ligne, puis continue avec le code suivant (j'ai ajouté des espaces et des commentaires ci-dessous):

$z{$/}++;      # In the hash table %z, set the key "\n" to 1
$/=$\=$@;      # Turn off newline handling when reading ($/ = undef);
               # Also don't add newlines when printing ($\ = undef)
               # $@ is set to undef by default
!$z{$_}?       #   If the current character is not in the hash table %z
  $z{$_}=1:    #   place it in the hash table %z
  delete$z{$_} #   else remove it from the hash table %z
for split//,   # for each character in
    <DATA>;    # the text appearing from the line beneath __DATA__ to EOF
print          # Print the following (no newline because $\ was undefined):
  keys%z>5?    # if the hash table %z contains more than 5 elements:
  "\n":        #   a newline; otherwise
  keys%z;      #   every key of %z, separated by spaces
__DATA__       # Start a string literal running from after this line to EOF

Après cela vient une copie de chaque octet qui n'a pas été utilisé dans le programme jusqu'à présent (uniquement pour augmenter le score), et enfin la somme de contrôle. (Il n'y a pas de nouvelle ligne de fin; les pièces commencent par une nouvelle ligne mais ne se terminent pas par une.)

Il y a trois cas distincts ici:

  • Un caractère autre qu'une nouvelle ligne a été supprimé . Dans ce cas, il apparaîtra un nombre impair de fois dans les deuxième et troisième parties. Cela signifie qu'il sera ajouté et / ou supprimé d' %zun nombre impair de fois, pour finir finalement dans la table de hachage. En fait, ce sera la seule clé de la table de hachage (car la chaîne va de après la nouvelle ligne de la deuxième partie à la fin de la troisième partie, et la table de hachage a commencé avec une seule nouvelle ligne), donc c'est ' ll vient d'être imprimé seul.
  • La première ou la troisième nouvelle ligne a été supprimée . Dans ce cas, le programme sera tourné de telle sorte que c'est le troisième des sauts de ligne qui manque, fusionnant efficacement les deuxième et troisième parties en une seule ligne. Le littéral de chaîne accessible via <DATA>contient chaque caractère un nombre pair de fois, donc la table de hachage aura son contenu d'origine, une seule nouvelle ligne, et cela sera imprimé.
  • La deuxième nouvelle ligne a été supprimée . Dans ce cas, le programme ne sera pas tourné (car la première partie a une somme de contrôle valide), donc la deuxième partie sera déplacée sur la même ligne que la première partie. <DATA>commence seulement la lecture de la ligne ci __DATA__- dessous , donc il ne verra que la troisième partie. Cela a plus de cinq caractères qui apparaissent un nombre impair de fois, donc cela déclenchera le cas spécial pour imprimer une nouvelle ligne.

Vérification

Une dernière chose qui doit être vérifiée pour à peu près tous les programmes A Pear Tree durcis aux radiations est de savoir si une suppression se produit au hasard pour qu'une section indésirable du code fasse une somme de contrôle correcte et fasse pivoter le code au mauvais endroit; étant donné que nous utilisons des sommes de contrôle 32 bits, cela est peu probable mais pas impossible. J'ai utilisé le script de force brute suivant pour m'assurer que cela ne se produise pour aucune suppression:

use 5.010;
use IPC::Run qw/run/;
use warnings;
use strict;
use Data::Dumper;
$Data::Dumper::Useqq=1;
$Data::Dumper::Terse=1;
$Data::Dumper::Indent=0;
undef $/;
$| = 1;
my $program = <>;

for my $x (0 .. (length($program) - 1)) {
    my $p = $program;
    my $removed = substr $p, $x, 1, "";
    alarm 4;
    say Dumper($p);
    run [$^X, '-M5.010', 'apeartree.pl'], '<', \$p, '>', \my $out, '2>', \my $err;
    if ($out ne $removed) {
        print "Unexpected output deleting character $x ($removed)\n";
        print "Output: {{{\n$out}}}\n";
        print "Errors: {{{\n$err}}}\n";
        exit;
    }
}

say $program;
run [$^X, '-M5.010', 'apeartree.pl'], '<', \$program, '>', \my $out, '2>', \my $err;
if ($out ne '') {
    print "Unexpected output not mutating\n";
    print "Output: {{{\n$out}}}\n";
    print "Errors: {{{\n$err}}}\n";
    exit;
}

say "All OK!";

Le script de vérification confirme que ce programme fonctionne correctement.

ais523
la source
7

Stax , 11 octets (Score de 4)

'''cc'~~'dd

Exécutez et déboguez en ligne!

C'est mon honneur d'avoir la première (chronologiquement) réponse à ce défi avec un score supérieur ou égal à 4. Peut-être que le score peut être encore plus élevé.

Dans Stax, un littéral de chaîne composé d'un seul caractère est écrit avec ', tout '', 'c, 'd, '~comme tous les littéraux de chaîne. Les commandes c det ~moyens correspondants dupliquent le haut de la pile principale, sautent le haut de la pile principale et sautent le haut de la pile principale et poussent vers la pile d'entrée, respectivement. Pour ce défi, la pile d'entrée n'affecte pas la sortie et n'est pas importante, nous pouvons donc dire det ~sont identiques.

Explication

Il est préférable de diviser le code en plusieurs parties et de les considérer séparément.

Quand il n'est pas altéré, '''ccpousse un littéral 'et un littéral cvers la pile principale et duplique le haut, de sorte que la pile serait (de bas en haut) c,c,'.

Lorsqu'il n'est pas altéré, '~~pousse le littéral ~, puis le fait apparaître (et le pousse vers la pile d'entrée), qui est fondamentalement un no-op pour la pile principale.

Lorsqu'il n'est pas altéré, 'ddpousse le littéral dpuis le fait apparaître, un autre no-op pour la pile principale.

À la fin du programme, étant donné qu'aucune sortie explicite n'est effectuée, le haut de la pile principale sera implicitement imprimé.

Si le programme s'exécute tel quel, la pile finale est toujours c,c,'et sortira c.

Si la première partie devient ''cc, alors nous avons un littéral 'et deux instructions de copie, la pile finale sera ',','. Étant donné que les deux autres parties sont sans opération, le résultat sera '.

Si la première partie devient '''c, le résultat est fondamentalement le même que celui non modifié, mais le cn'est pas dupliqué. La pile sera donc c,'. Après deux no-op, le haut de la pile est c.

Nous pouvons donc détecter le rayonnement dans la première partie.

La deuxième partie et la troisième partie fonctionnent exactement de la même manière. Je prendrai la troisième partie comme exemple.

Si la troisième partie est altérée, les deux premières parties sont conservées telles quelles et la pile avant d'exécuter la troisième partie est c,c,'

Si la troisième partie devient 'd, un littéral dest poussé vers le haut de la pile principale et rien de plus n'est fait. Le haut de la pile principale est maintenant celui dqui sera sorti.

Si la troisième partie devient dd, deux éléments sont extraits de la pile principale et maintenant le haut de la pile est 'et est sorti.

Par conséquent, nous pouvons détecter le rayonnement dans la troisième partie. Pour la même raison, nous pouvons détecter un rayonnement dans la deuxième partie.

Weijun Zhou
la source
5

05AB1E , score 2, 6 octets

„"""„„

Imprime parfois le double du caractère supprimé. Ne contient pas '.

Comment ça marche:

Suppression du premier

"""„„

Essayez-le en ligne!

Tout d'abord, nous poussons un littéral de chaîne vide dans la pile. Ensuite, nous poussons „„, qui est imprimé implicitement.

Suppression d'un "

„""„„

Essayez-le en ligne!

Tout d'abord, nous poussons ""vers la pile avec l' 2-char stringinstruction. Ensuite, nous essayons d'obtenir une autre chaîne de 2 caractères, mais celle-ci est abandonnée (je ne sais pas exactement pourquoi) et le ""est imprimé.

Retrait du deuxième ou du troisième

„"""„

Essayez-le en ligne!

Tout d'abord, nous poussons ""vers la pile avec l' 2-char stringinstruction. Ensuite, nous poussons , qui est imprimé implicitement.

boboquack
la source
5

Gelée , 5 octets, score 2

”””ḷḷ

Essayez-le en ligne!

Avec tout supprimé:

””ḷḷ

Essayez-le en ligne!

Le caractère commence un littéral de caractère d'un octet. Ce programme commence par ””lequel donne la chaîne . La dyade prend son argument de gauche. La chaîne est simplement passée à travers les deux instances de .

Avec tout supprimé:

”””ḷ

Essayez-le en ligne!

Dans ce programme ””donne le caractère puis ”ḷdonne le caractère et seulement ceci est sorti.


Autres solutions

  • Beaucoup d'autres personnages tels que aou oauraient travaillé à la place de cette soumission.
  • ⁾⁾⁾⁾FFF. Cela fonctionne de manière similaire. est comme mais il démarre un littéral de chaîne de deux octets. Les programmes "irradiés" produisent deux fois l'octet supprimé, ce qui a été jugé valide dans les commentaires.

Voici une version (beaucoup moins sophistiquée) Jelly du vérificateur de validité de Magic Octopus Urn. La colonne de gauche de la sortie est le caractère supprimé et la colonne de droite est la sortie du programme résultant.

dylnan
la source
Mon vérificateur de validité n'est pas thaaat fantaisie. Il échoue pour l'autre solution publiée;).
Urne de poulpe magique le