L'injection de code fonctionne aussi en C #!

15

Étant donné la sortie de programme C # suivante False, injectez une ligne de code «malveillante» telle que le programme sort True.

class Program
{
    static void Main()
    {
        System.Console.Write("False");
        ;
    }
}

Votre réponse doit consister en une chaîne qui remplace le deuxième point-virgule et provoque la sortie du programme True, le tout Trueet rien mais True(pas même une nouvelle ligne). Il doit le faire si stdout est imprimé sur la console et si stdout est redirigé vers un fichier.

La réponse la plus courte l'emporte.

Kendall Frey
la source
Quel est votre critère de victoire objectif?
JB
@JB Les puzzles ont-ils besoin d'un critère gagnant? Va éditer.
Kendall Frey
Je réagis principalement à la remarque du code-golf, mais le point est là: quelle sera la réponse acceptée?
JB
@JB La réponse la plus courte est la meilleure réponse.
Kendall Frey
Eh bien , il est un code-golf, alors, est - ce pas?
JB

Réponses:

17

52 caractères

}static Program(){System.Console.Write(0<1);for(;;);

donc le tout devient:

class Program
{
    static void Main()
    {
        System.Console.Write( "False" );
    }
    static Program()
    {
        System.Console.Write( 0 < 1 ); 
        for ( ; ; ) ;
    }
}
Danko Durbić
la source
Désolé d'avoir modifié la question au milieu de votre réponse. Les sauts de ligne ne sont plus autorisés, vous devrez utiliser Write.
Kendall Frey
Ok, j'ai changé WriteLinepourWrite
Danko Durbić
1
Vous pourriez probablement économiser quelques octets en remplaçant votre sortie par for(;;);, rien de ce que j'ai vu n'exige que le programme se termine ...?
Joachim Isaksson
@JoachimIsaksson Oui, cela répond aux exigences spécifiées.
Kendall Frey
4
}static Program(){System.Console.Write(0<1);for(;;);pourrait toujours devenir}static Program(){for(System.Console.Write(0<1);;);
NPSF3000
7

C #, 51 caractères

Console.Write("\b\b\b\b\b");Console.Write("True ");

Ne fonctionnera que sur une sortie standard

RamonBoza
la source
La première chose que j'ai essayée, malheureusement, cela ne fonctionnera pas à cause de l'initiale WriteLine.
Vereos
3
Maintenant, c'est Write: / Je ne comprends pas comment nous pourrions résoudre ce problème si cela continue de changer ...
Vereos
@Vereos Je voulais supprimer l'ambiguïté de «nouvelle ligne ou pas de nouvelle ligne».
Kendall Frey
3
Vous n'avez pas besoin de 2 instances de Console.Write, et vous pouvez utiliser \rau lieu de 5 \bs. Console.Write("\rTrue ");
Brian S
Je ne pense pas que cela réponde aux critères. Il génère en fait False en premier, qui est ensuite remplacé par True plus tard.
microbian
1

Vous pouvez généraliser la réponse de RamonBoza pour qu'elle fonctionne toujours si stdout est redirigé vers un fichier.

En supposant que le programme fonctionne sous Mono sous Linux, avec l'assembly Mono.Posix.dllchargé:

if(Mono.Unix.Native.Syscall.isatty(1))
{
    Console.Write("\rTrue ");
}
else
{
    // Truncate the output file first
    Console.OpenStandardOutput().SetLength(0);
    Console.Write("True");
}

Je doute que cela fonctionne sous Windows, mais il y a probablement un équivalent à isatty().

Escargot mécanique
la source
1

83 ... WIP

J'espérais que ça marcherait, mais apparemment "False" n'est pas interné comme je l'avais espéré dans mon compilateur

//}unsafe static Program(){fixed(char*f="False"){*(long*)f=0x65007500720054;*(f+4)=' ';}
}unsafe static Program(){fixed(char*f="False")for(int i=5;i-->0;)*(f+i)="True "[i];

non golfé

class Program
{
    static void Main(string[] args)
    {
        Console.Write("False");
    }

    unsafe static Program()
    {
        fixed (char* f = "False") for (int i = 5; i-- > 0; ) *(f + i) = "True "[i];
    }
}
NPSF3000
la source
1
class Program
{
    static void Main()
    {
        System.Console.Write("False");

        System.Console.Clear(); System.Console.Write("True");

        Console.ReadLine();
    }
}
satarupa
la source
Cela ne fonctionnera pas si stdout est redirigé.
Kendall Frey
0

Je ne sais pas si cela est accepté.
La question ne dit rien sur les options du compilateur, je suppose donc que je peux changer le point d'entrée de l'application.
55 caractères, 3 de plus que la réponse acceptée

}class P{static void Main(){System.Console.Write(1>0);}

Plein

class Program
{
    static void Main()
    {
        System.Console.Write("False");
    }
    class P
    {
        static void Main() { System.Console.Write(1 > 0); }
    }
}
George Vovos
la source
Bienvenue dans la communauté!
Erik the Outgolfer du
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Merci. C'est un site fantastique!!!
George Vovos