Java Yıldız Dikdörtgen [kapalı]


15

CS sınıfım için eğitmenim bize, Java'da çapraz çizgiler çizilen yıldız işaretlerinden oluşan bir dikdörtgen oluşturma görevini verdi.

Ayrıca bize mümkün olduğunca az bayt yazmamızı söyledi. Ben 190 bayt aşağı aldım, ama bayt azaltmak için bu kodu daha da basitleştirmek için birkaç bulmak gerekir. Biri bana bu konuda yardımcı olabilir mi?

Bu kod işlevseldir:

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)?"*":" ");}}}

Girdi 10 10.

Çıktı:

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

25
Onu SO'ya yönlendirmeyin; hayatta yenecek.
Leaky Nun

3
Programın çıktı ve özelliklerini açıklığa kavuşturabilir misiniz? örnek giriş / çıkış vb.
TheLethalCoder

25
Bu kadar yakın olmanın neden oy verdiğinden tam olarak emin değilim. Bu kesinlikle genel bir programlama sorusu değildir. Konu hakkında çok fazla standart ipuçları sorusu var. Ödev konusunda bir politikamız olup olmadığından emin değilim, ancak görebildiğim kadarıyla OP kendi çabalarını bile gösteriyor, bu yüzden bununla ilgili yanlış bir şey olduğunu düşünmüyorum?
Martin Ender

3
@NathanMerrill Belirli golf problemleri için tavsiye kesinlikle konu dışı değildir .
Martin Ender

3
@LeakyNun insanları canlı yemiyoruz, önce öldürüyoruz;)

Yanıtlar:


1

mantıksal olarak, her seferinde i == j& i+j==w-1(köşegenler için), i == 0& j == 0(üst ve sol taraf için) ve j == w-1& i==h-1 (sağ ve alt taraf için ) Asterik ("*") olmalıdır .

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

Bu kullanılabilir bir mantık örneği veya tamamen golfed bir kod olup olmadığını bilmiyorum. İkinci durumsa, burada golf yapılacak çok şey var. System.out.println()OR boruları ( ||) ile üçlü operatör arasındaki işe yaramaz ve tüm gereksiz boşluklar gibi .
Yytsi

1
@TuukkaX mantığına sadece bir örnek.
Abbas Kararawala

1

Sağladığınız kod şu şekilde azaltılabilir:

  • "*" yerine 42 ve "" yerine '' yazın (* karakterinin kodundan yararlanarak)
  • ((y - x)% 3) ile çarpılacak olanların başlangıcına gidin ve çevresindeki parantezleri kaldırın
  • (x> w - 2) ve ((y - x)% 3 * y% (h - 1) * x == 0) çevresindeki parantezleri kaldırın

Ortaya çıkan kod şöyle olacaktır:

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

Not: Sorunun örnek çıktısında son satır eksik! Örnek kodun çıktısı farklıdır.


0

Aslında bilgisayarımda Java yok, bu yüzden bunu test edemem ama 174 bayt için çalışması gerektiğini ve neredeyse kesinlikle daha golf olabilir düşünüyorum

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?"*":" ");}}

netlik için koydu beyaz boşluk:

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 ? "*":" ");
    }
}

her satırdaki son karakter için "* \ n", ilk ve son satırların tümü ve ilk sütun için "*" ve satır ile sütun toplamının eşit olduğu herhangi bir zamanda "*" yazdıysanız, aksi halde yazdırır ""

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.