การฉีดโค้ดใช้งานได้ใน C # ด้วย!


15

ป.ร. ให้ไว้ดังต่อไปนี้ C # โปรแกรม outputting Falseฉีดบรรทัด 'อันตราย' Trueรหัสดังกล่าวที่เอาท์พุทโปรแกรม

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

คำตอบของคุณควรประกอบด้วยสตริงที่แทนที่เซมิโคลอนที่สองและทำให้โปรแกรมส่งออกTrueทั้งหมดTrueและไม่มีอะไรนอกจากTrue(ไม่ใช่แม้แต่บรรทัดใหม่) ต้องทำเช่นนี้หาก stdout ถูกพิมพ์ไปยังคอนโซลและหาก stdout ถูกเปลี่ยนเส้นทางไปยังไฟล์

คำตอบที่สั้นที่สุดชนะ


เกณฑ์การชนะวัตถุประสงค์ของคุณคืออะไร
JB

@JB ปริศนาจำเป็นต้องมีเกณฑ์ชนะหรือไม่ จะแก้ไข
Kendall Frey

ฉันส่วนใหญ่ตอบสนองต่อข้อสังเกตของ code-golf แต่ประเด็นสำคัญ: ซึ่งจะเป็นคำตอบที่ยอมรับได้หรือไม่
JB

@JB คำตอบที่สั้นที่สุดคือคำตอบที่ดีที่สุด
Kendall Frey

มันคือ code-golf แล้วใช่ไหม?
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การขึ้นบรรทัดใหม่จะได้รับอนุญาตอีกต่อไปคุณจะต้องใช้
Kendall Frey

ตกลงฉันได้เปลี่ยนWriteLineเป็นWrite
Danko Durbić

1
คุณอาจจะสามารถบันทึกไบต์โดยแทนที่ออกของคุณด้วยfor(;;);ไม่มีอะไรที่ฉันเคยเห็นต้องการให้โปรแกรมยุติ ...
Joachim Isaksson

@JoachimIsaksson ใช่ที่เป็นไปตามข้อกำหนดที่ระบุไว้
Kendall Frey

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สิ่งแรกที่ผมพยายามที่โชคไม่ดีที่มันจะไม่ทำงานเพราะการเริ่มต้น
Vereos

3
ตอนนี้เป็นWrite: / ฉันไม่เข้าใจว่าเราจะจัดการแก้ปัญหานี้อย่างไรหากมันเปลี่ยน ...
Vereos

@Vereos ฉันต้องการลบความคลุมเครือของ 'newline หรือ no newline'
Kendall Frey

3
คุณไม่จำเป็นต้องมี 2 อินสแตนซ์Console.Writeและคุณสามารถใช้\rแทน 5 \bวิ Console.Write("\rTrue ");
Brian S

ฉันไม่คิดว่ามันเป็นไปตามเกณฑ์ จริง ๆ แล้วจะส่งออกเท็จก่อนซึ่งจากนั้นจริง overwtitten โดย True ในภายหลัง
microbian

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 ... WIP

ฉันหวังว่าสิ่งนี้จะได้ผล แต่ดูเหมือนว่า "ไม่จริง" ไม่ได้ถูกฝึกงานอย่างที่ฉันหวังไว้ในคอมไพเลอร์ของฉัน

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

ungolfed

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 ถูกเปลี่ยนเส้นทาง
Kendall Frey

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

ยินดีต้อนรับสู่ชุมชน!
Erik the Outgolfer

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀขอบคุณ นี่คือเว็บไซต์ที่ยอดเยี่ยม !!!
George Vovos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.