Java Asterisk สี่เหลี่ยมผืนผ้า [ปิด]


15

สำหรับชั้นเรียน CS ของฉันผู้สอนของฉันให้เรามอบหมายงานสร้างสี่เหลี่ยมผืนผ้าที่มีเครื่องหมายดอกจันที่มีเส้นทแยงมุมลากผ่านมันใน Java

เขายังบอกให้เราเขียนเป็นไบต์น้อยที่สุด ฉันได้รับมันถึง 190 ไบต์ แต่ฉันต้องการค้นหาบางอย่างเพื่อทำให้รหัสนี้ง่ายขึ้นเพื่อลดจำนวนไบต์ มีใครช่วยฉันได้บ้าง

รหัสนี้ใช้งานได้:

interface d{static void main(String[]a){for(int z=0,w=new Byte(a[0]),h=new Byte(a[1]);z<h*w;){int y=z/w,x=z++%w;System.out.print((x>w-2)?"*\n":(y%(h-1)*x*((y-x)%3)==0)?"*":" ");}}}

10 10การป้อนข้อมูลเป็น

เอาท์พุท:

**********
**  *  * *
* *  *  **
*  *  *  *
**  *  * *
* *  *  **
*  *  *  *
**  *  * *
* *  *  ** 

25
อย่าเปลี่ยนเส้นทางของเขาไปที่ SO; เขาจะมีชีวิตอยู่กิน
Leun Nun

3
คุณสามารถอธิบายผลลัพธ์และรายละเอียดของโปรแกรมได้หรือไม่? เช่นอินพุท / เอาท์พุท ฯลฯ
TheLethalCoder

25
ฉันไม่แน่ใจทั้งหมดว่าทำไมเรื่องนี้จึงถูกโหวตอย่างใกล้ชิด นี่ไม่ใช่คำถามโปรแกรมทั่วไปแน่นอนที่สุด มันเป็นคำถามเคล็ดลับมาตรฐานซึ่งค่อนข้างมากในหัวข้อ ฉันไม่แน่ใจว่าเรามีนโยบายเกี่ยวกับการบ้านหรือไม่แม้ว่าเท่าที่ฉันสามารถเห็น OP ได้แสดงความพยายามของตัวเองดังนั้นฉันจึงไม่คิดว่ามีอะไรผิดปกติกับเรื่องนี้หรือไม่?
Martin Ender

3
แนะนำ @NathanMerrill สำหรับปัญหาการเล่นกอล์ฟที่เฉพาะเจาะจงเป็นส่วนใหญ่แน่นอนไม่ปิดหัวข้อ
Martin Ender

3
@LeakyNun เราไม่ได้กินคนที่ยังมีชีวิตอยู่เราฆ่าพวกเขาก่อน;)

คำตอบ:


1

ตามหลักเหตุผลควรมี Asterik ("*") ทุกครั้งi == j& i+j==w-1(สำหรับเส้นทแยงมุม), i == 0& j == 0(สำหรับบรรทัดบนสุดและด้านซ้าย) และj == w-1& i==h-1 (สำหรับด้านขวาและบรรทัดล่าง)

class d {
    public static void main(String[] a) {
        for(int i=0,w=new Byte(a[0]),h=new Byte(a[1]);i<h;i++) {
            for(int j=0;j<w;j++) {
                System.out.print(i==0 || j==0 || i==h-1 || i+j==w-1 || j==w-1 || i==j ? "*":" ");
            }
            System.out.println();
        }
    }
}

ฉันไม่รู้ว่านี่เป็นตัวอย่างของตรรกะที่สามารถใช้หรือรหัส golfed อย่างสมบูรณ์ ถ้าเป็นกรณีที่สองมีหลายสิ่งให้เล่นกอล์ฟที่นี่ เช่นSystem.out.println()ช่องว่างที่ไร้ประโยชน์และช่องว่างไร้ประโยชน์ทั้งหมดระหว่างท่อ OR ( ||) และผู้ประกอบการที่ประกอบไปด้วยสามส่วน
Yytsi

1
นี่เป็นเพียงตัวอย่างของตรรกะ @TuukkaX
Abbas Kararawala

1

รหัสที่คุณระบุอาจลดลงได้โดยทำสิ่งนี้:

  • แทนที่ "*" 42 และ "" โดย '' (ใช้ประโยชน์จากรหัสสำหรับ *)
  • ย้าย ((y - x)% 3) ไปยังจุดเริ่มต้นของสิ่งต่าง ๆ ที่จะคูณและลบวงเล็บที่อยู่รอบ ๆ
  • ลบวงเล็บที่อยู่รอบ ๆ ออกจาก (x> w - 2) และจาก ((y - x)% 3 * y% (h - 1) * x == 0)

รหัสผลลัพธ์จะเป็น:

interface r{static void main(String[]a){for(int z=0,w=new Byte(a[0]),h=new Byte(a[1]);z<h*w;){int y=z/w,x=z++%w;System.out.print(x>w-2?"*\n":(y-x)%3*y%(h-1)*x==0?42:' ');}}}

หมายเหตุ: บรรทัดสุดท้ายหายไปในตัวอย่างผลลัพธ์ของคำถาม! เอาต์พุตของโค้ดตัวอย่างแตกต่างกัน


0

ฉันไม่มี Java บนคอมพิวเตอร์ของฉันดังนั้นฉันจึงไม่สามารถทดสอบสิ่งนี้ได้ แต่ฉันคิดว่ามันควรใช้งานได้ 174 ไบต์และเกือบจะแน่นอนมากกว่านี้

class d{static void main(String[]a){for(int i=0,w=new Byte(a[0]),h=new Byte(a[1]);i<h;i++)for(int j=0;j<w;j++)System.out.print(j==w-1?"*\n":i%h-1==0||!j||i+j%2==0?"*":" ");}}

พื้นที่สีขาวใส่เพื่อความชัดเจน:

class d {
    static void string main(String[] a) {
        for(int i=0,w=new Byte(a[0]),h=new Byte(a[1]);i<h;i++)
            for(int j=0;j<w;j++)
                System.out.print(j==w-1 ? "*\n" : i % h-1 == 0 || !j || i+j % 2 == 0 ? "*":" ");
    }
}

พิมพ์ "* \ n" สำหรับอักขระตัวสุดท้ายในแต่ละบรรทัด "*" สำหรับทุกบรรทัดแรกและบรรทัดสุดท้ายและคอลัมน์แรกและ "*" ทุกครั้งที่ผลรวมของแถวและคอลัมน์นั้นเท่ากัน ""

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.