Інжекція коду працює і в C #!


15

З огляду на наступне виведення програми C # False, введіть "шкідливий" рядок коду таким чином, що програма виводить True.

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

Ваша відповідь повинна складатися з рядка, який замінює другий крапку з комою, і призводить до того, що програма виводить Trueціле Trueі нічого, крім True(навіть не нового рядка). Це потрібно зробити, якщо stdout друкується на консолі, а якщо stdout перенаправляється до файлу.

Найкоротша відповідь виграє.


Який ваш об'єктивний критерій виграшу?
JB

@JB Чи потрібні головоломки критерію виграшу? Відредагуємо.
Кендалл Фрей

Я здебільшого реагую на зауваження з кодом-гольфу, але суть: яка буде прийнята відповідь?
JB

@JB Найкоротша відповідь - найкраща відповідь.
Кендалл Фрей

Що ж, це код-гольф, чи не так?
JB

Відповіді:


17

52 символи

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

тому вся справа стає:

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

Вибачте за редагування питання в середині вашої відповіді. Нові рядки більше заборонені, вам доведеться користуватися Write.
Кендалл Фрей

Ок, я змінився WriteLineнаWrite
Данько Дурбич

1
Ви, ймовірно, можете зберегти кілька байт, замінивши свій вихід for(;;);, ніщо, що я бачив, не вимагає, щоб програма припинялася ...?
Йоахім Ісакссон

@JoachimIsaksson Так, це відповідає вимогам, визначеним.
Кендалл Фрей

4
}static Program(){System.Console.Write(0<1);for(;;);завжди міг стати}static Program(){for(System.Console.Write(0<1);;);
NPSF3000

7

C #, 51 символ

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

Працюватиме лише на стандартному виході


Перше, що я спробував, на жаль, це не вийде через початкове WriteLine.
Вереос

3
Тепер це Write: / Я не розумію, як нам вдалося б це вирішити, якщо це все змінюється ...
Vereos

@Vereos Я хотів прибрати неоднозначність "newline or no newline".
Кендалл Фрей

3
Вам не потрібно 2 екземпляри Console.Write, і ви можете використовувати \rзамість 5 \bс. Console.Write("\rTrue ");
Брайан S

Я не думаю, що це відповідає критеріям. Він фактично виводить False спочатку, що потім перезаписується True пізніше.
мікробій

1

Ви можете узагальнити відповідь RamonBoza як і раніше працювати, якщо stdout буде переспрямовано у файл.

Якщо припустимо, що програма працює під Mono на Linux, збірка Mono.Posix.dllзавантажена:

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

Я сумніваюся, що це працює в Windows, але, мабуть, це еквівалент isatty().


1

83 ... ВІП

Я сподівався, що це спрацює, але, мабуть, "False" не інтернується так, як я сподівався у своєму компіляторі

//}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];

неозорий

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];
    }
}

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

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

        Console.ReadLine();
    }
}

Це не спрацює, якщо stdout буде переспрямовано.
Кендалл Фрей

0

Не впевнений, чи це прийнято.
Питання нічого не говорить про параметри компілятора, тому я припускаю, що я можу змінити точку входу програми.
55 символів, на 3 більше, ніж прийнята відповідь

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

Повна

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

Ласкаво просимо до громади!
Ерік Аутгольфер

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Дякую Це фантастичний сайт !!!
Джордж Вовос
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.