Segitiga Sangat Sederhana


47

Tulis sebuah program atau fungsi yang mengambil bilangan bulat positif (melalui stdin, baris perintah, atau fungsi arg) dan mencetak atau mengembalikan string yang banyak dari segitiga kecil ini digabungkan menjadi satu, bergantian ke arah mana mereka menunjuk:

 /\
/__\

Segitiga tunggal ini adalah output jika inputnya adalah 1.

Jika inputnya adalah 2, outputnya adalah

  ____
 /\  /
/__\/

Jika inputnya adalah 3, outputnya adalah

  ____
 /\  /\
/__\/__\

Jika inputnya adalah 4, outputnya adalah

  ________
 /\  /\  /
/__\/__\/

Dan seterusnya. Program Anda harus mendukung input hingga 2 16 - 1 = 65535.

Detail

  • Segitiga paling kiri selalu menunjuk ke atas.
  • Mungkin ada spasi tambahan tetapi mungkin tidak ada ruang utama yang tidak perlu.
  • Mungkin ada trailing newline opsional.
  • Perhatikan bahwa untuk 1output panjangnya dua baris tetapi sebaliknya tiga. Ini wajib diisi.
  • Pengajuan terpendek dalam byte menang.

Jawaban:


32

Pyth, 44 42

ItQpdd*\_*4/Q2)jbms<*dQhQ,c" /\ "2,\/"__\\

Baris pertama:

ItQpdd*\_*4/Q2)
ItQ           )    If the input is not 1
   pdd             Print two spaces
      *\_*4/Q2     Then groups of 4 underscores, repeated input/2 times.

Dua baris lainnya dihasilkan dengan memperhatikan bahwa baris kedua terdiri dari " /"dan "\ "input bergantian + 1 kali, dan baris ketiga terdiri dari "/"dan "__\"berganti - ganti dengan cara yang sama.


158
dicoret 44 masih normal 44 :(
Pengoptimal

4
42 . Tentu saja!
mbomb007

48
@Optimizer: Saya merasa tidak ada habisnya bahwa kesedihan Anda atas penampilan 44 telah menerima lebih banyak suara daripada pertanyaan atau jawaban ini.
Alex A.

6
Baru saja mendapat 10 jawaban dalam 44 rantai dicoret
Leo

3
@AlexA. Saya merasa tak ada habisnya menghibur bahwa hiburan Anda atas kesedihan Pengoptimal atas penampilan 44 telah menerima lebih banyak suara daripada pertanyaan atau jawaban ini.
isaacg

24

SQL, 182 175 173 187 byte

Bukan berarti ini akan menjadi yang terpendek, tetapi masih lucu untuk mencoba meminimalkan sql;) lol Saya melakukan ini di Oracle 11, namun, ini harus SQL dasar. Seperti yang ditunjukkan, saya tidak menerapkan ketika input = 1 aturan - hanya menampilkan 2 baris. tidak bisa memikirkan cara yang lebih baik untuk melakukannya, namun, saya memang menyimpan beberapa byte dengan memodifikasi logika v;) menambahkan 2 sebelumnya menghemat beberapa byte dengan tidak harus mengulanginya nanti [/ edit]

select decode(&i,1,'',rpad('  ',v,'____')||z)||rpad(' /',v,'\  /')||decode(y,1,'\')||z||rpad('/',v-1,'__\/')||decode(y,1,'__\')from(select 2+floor(&i/2)*4v,mod(&i,2)y,chr(10)z from dual);

[edit1] menghapus beberapa spasi yang tidak perlu [/ edit1] [edit2] mengubah && i menjadi adil & i. Ini mengurangi 2 karakter, tetapi memaksa pengguna untuk memasukkan # segitiga sebanyak dua kali ...: PI menyadari "kebiasaan pengkodean yang baik" menggunakan && saya biayanya menjadi 2 byte !! Menyeramkan!! [/ edit2]

Penjelasan (catatan: Saya menggunakan && 1 dalam penjelasan ini sehingga hanya meminta sekali, & 1 di atas menghemat ruang kode, tetapi meminta beberapa kali;))

 select  -- line 1
     decode(&&1,1,'',   -- don't need line 1 if input is 1
     rpad('  ',v,'____') || z ) || -- every pair of triangles
     -- line 2
     rpad(' /',v,'\  /') ||  -- every pair of triangles
          decode(y,1,'\') || z || -- add the final triangle, input: 1,3,5 etc.
     -- line 3
     rpad('/',v-1,'__\/') ||  -- every pair of triangles
          decode(y,1,'__\')   -- add the final triangle, input: 1,3,5 etc.
from (select 2+floor(&&i/2)*4 v,   -- common multiplier. 4 extra chars for every triangle pair
             mod(&&i,2) y,  -- Flag for the final triangle (odd inputs, 1,3,5, etc)
             chr(10) z  -- CR, here to save space.
        from dual);

Keluaran

  SQL> accept i
  1
  SQL> /

   /\
  /__\


  SQL> accept i
  2
  SQL> /

    ____
   /\  /
  /__\/


  SQL> accept i
  3
  SQL> /

    ____
   /\  /\
  /__\/__\


  SQL> accept i
  12
  SQL> /

    ________________________
   /\  /\  /\  /\  /\  /\  /
  /__\/__\/__\/__\/__\/__\/


  SQL>

1
Apakah akan berhasil menghapus ruang setelah from? Jika demikian, itu akan menghemat satu byte.
Alex A.

oh tuan yang baik .. itu gila. coba saja .. dan kemudian "pergi ke kota" menghapus ruang apa yang saya bisa ... Oo pengisap ini tidak dapat dibaca sekarang .. tapi itu masih bekerja;) lol (Saya TIDAK bisa percaya alias masih bekerja seperti itu .. Oo hehe )
Ditto

Saya sooo bingung pada upvotes! Oo Tidak ada yang mendekati ukuran terkecil .. belum .. naik turun! Oo wow.
Ditto

2
Suara positif biasanya menunjukkan bahwa orang-orang menyukai kiriman Anda karena kreatif, bahasa yang digunakan tidak umum, atau sejumlah alasan. Dalam pengalaman saya, tidak biasa jawaban golf kode terpendek juga terpilih sebagai yang tertinggi. Jadi, meskipun ini mungkin bukan jawaban terpendek, masyarakat menganggapnya sebagai jawaban yang bagus. :)
Alex A.

@Alex .. keren, saus :) (saya harus mencoba ini di Excel berikutnya ... lol)
Ditto

11

Python 2, 89 88 87 85 83 bernama / 81 tidak disebutkan namanya

f=lambda n:1%n*("  "+n/2*4*"_"+"\n")+(" /\ "*n)[:2+2*n]+"\n"+("/__\\"*n)[:n-~n+n%2]

(Terima kasih kepada @orlp untuk satu byte, dan @xnor untuk tiga byte lainnya)

Ini adalah fungsi yang mengambil int ndan mengembalikan segitiga sebagai string menggunakan pendekatan baris-demi-baris.

misalnya print f(10)memberi

  ____________________
 /\  /\  /\  /\  /\  /
/__\/__\/__\/__\/__\/

Untuk baris pertama, alih-alih (n>1)*kita gunakan 1%n*, karena 1%n0 jika n == 1dan 1 jika n > 1.


1
Anda dapat mencukur karakter, mengubahnya " /\\ "menjadi " /\ ".
orlp

Tidakkah lambda ini bekerja di Python 3 juga?
mbomb007

2
@ mbomb007 Ada divisi lantai di sana
Sp3000

@ orlp Izinkan saya sekarang, untuk menambah kebingungan lebih lanjut, tetapi menghapus komentar saya;)
FryAmTheEggman

Saya curiga terhadap "\n".join()3 item, meskipun daftar tersebut digunakan untuk menghapus elemen pertama secara kondisional. Mungkin sesuatu seperti b*(x+"\n")+y+"\n"+zlebih pendek?
xnor

7

JavaScript (ES6), 101 109

Terlalu lama

f=(n,z=a=>a.repeat(n/2))=>(n>1?'  '+z('____')+'\n ':' ')+z('/\\  ',w=' /'[++n&1]+'\n')+w+z('/__\\')+w

Penjelasan

Menggunakan panah gemuk untuk definisi fungsi. Apalagi tidak ada {}blok: fungsi tubuh adalah ekspresi tunggal yang merupakan nilai balik. f=(a,b,c)=>exprsetara dengan

function f(a,b,c)
{
  return expr;
}

Di dalam satu ekspresi Anda tidak dapat menggunakan pernyataan seperti ifatau var, tetapi

  • parameter dengan nilai default dapat digunakan sebagai variabel lokal
  • ekspresi kondisional lebih ?:baik digunakan daripadaif else
  • Anda dapat menambahkan lebih banyak subekspresi menggunakan operator koma atau bahkan lebih baik sebagai parameter yang tidak digunakan untuk fungsi. Dalam hal ini penugasan wadalah parameter kedua (tidak digunakan) untuk fungsiz

Kita dapat menulis ulang ffungsi sebagai

f = function(n) {
  var z = function(a) { // use current value of n (that changes)
    return a.repeat(n/2);
  };
  var result;
  if (n > 1) {
    result = '  ' + z('____') + '\n '; // top row if more than 1 triangle
  else
    result = ' '; // else just the blank
  ++n; // increase n, so invert even/odd
  w = ' /'[n&1]+'\n'; //  blank if n is now even, else '/' if n is now odd
  // the next rows will end in "/\" or "\  /" based on n even/odd
  result +=  z('/\\  ') + w; // offset by the blank char added before
  result += z('/__\\') + w;
  return result;
}

Tes di Firefox / konsol FireBug

console.log(f(1),f(2),f(3),f(4),f(9))

Keluaran

 /\   
/__\ 

  ____
 /\  /
/__\/

  ____
 /\  /\   
/__\/__\ 

  ________
 /\  /\  /
/__\/__\/

  ________________
 /\  /\  /\  /\  /\   
/__\/__\/__\/__\/__\ 

Bagus sekali! Saya menghabiskan terlalu lama kemarin mencari untuk mempersingkat dan paling tidak berhasil mereproduksi 109 dengan cara yang berbeda. -8 cukup lompatan.
DocMax

Keren. Bisakah Anda memposting penjelasan? Saya tidak sepenuhnya memahami penggunaanw
BadHorsie

@BadHorse penjelasan ditambahkan (sungguh, kali ini)
edc65

Karena ketertarikan saya mencoba melakukannya tanpa spasi tambahan dan muncul n=>(n>1?' '+'____'.repeat(n/2)+'\n':'')+' /\\ '.repeat(n).slice(0,n*2+2-n%2)+'\n'+'/__\\'.repeat(n).slice(0,n*2+1+n%2)untuk 119 (sengaja tidak menggunakan string template dll untuk mencocokkan jawaban Anda).
Neil

6

CJam, 55 53 51 byte

SSri:I2/4*'_*N]I1>*" /\ "I*I)2*<N"/__\\"I*I2*)I2%+<

Saya mencoba porting jawaban Python saya dan ternyata lebih pendek daripada CJams lainnya.

Permalink .


6

Haskell 155 153 139 131 Bytes

Saya menemukan pendekatan yang sedikit berbeda yang ternyata lebih pendek dari metode asli saya. Upaya awal saya terpelihara di bawah ini. Seperti sebelumnya, tips golf sangat dihargai.

m n=unlines.dropWhile(=="  ").z["  "," /","/"].foldr1 z$map t[1..n]
t n|odd n=["","\\","__\\"]
t _=["____","  /","/"]
z=zipWith(++)

Terima kasih kepada Nimi untuk tips golfnya.


Percobaan Sebelumnya 197 179 Bytes

t n=putStr.unlines.dropWhile(all(==' ')).z(flip(++))(if odd n then["","\\","__\\"]else repeat"").z(++)["  "," /","/"].map(take(4*div n 2).cycle)$["____","\\  /","__\\/"]
z=zipWith

4
Beberapa petunjuk untuk bermain golf: (mod n 2)==0adalah even natau lebih baik menggunakan odd ndan swap thendan elsebagian. concat.take(div n 2).repeatadalah take(4*div n 2).cyclekarena semua elemen daftar adalah panjang 4. nama pendek Tetapkan ke fungsi dengan nama yang panjang, misalnya z=zipWith- penggunaan kemudian z. Anda dapat menendang beberapa ruang ...repeat""else[....
nimi

@nimi Terima kasih atas petunjuk Anda! Dengan menggunakan mereka, saya dapat mengubah solusi asli saya menjadi 179 byte. Dengan mempertimbangkan kembali pendekatan saya, saya juga dapat mengurangi solusi saya menjadi 155 Bytes.
ankh-morpork

1
Petunjuk, bagian II: foldr z["","",""]adalah foldr1 z, karena daftar untuk dilipat tidak pernah kosong. Alih-alih all(==' ') Anda dapat menggunakan ==" "(<- dua spasi di antara), karena digunakan untuk menghapus baris kosong jika n = 1 dan di sini baris pertama " ". Definisi pertama tdapat ditulis dalam satu baris: t n|odd....
nimi

4

CJam, 73 68 63 62 60 byte

Ini pasti membutuhkan golf ...

S2*l~:I2/'_4**N]I(g*S"\\  /"'\{I2md@*@@*'/\@}:F~N"__\\/"_W<F

Uji di sini.

Penjelasan

"Print the first line:";
S2*l~:I2/'_4**N]I(g*

S2*                  "Push a string with 2 spaces.";
   l~:I              "Read and eval the input, store it in I.";
       2/            "Divide by two to get the number of top segments.";
         '_4**       "Push '____' and repeat it by the number of segments.";
              N]     "Push a newline and wrap everything in an array.";
                I(g* "Get sign(I-1) and repeat the array that often. This is a no-op
                      for I > 1 but otherwise empties the array.";

"Print the other two lines. The basic idea is to define block which takes as arguments
 a repeatable 4-character string as well as another string which only gets printed for
 even I.";
S"\\  /"'\{I2md@*@@*'/\@}:F~N"__\\/"_W<F

S                                        "Push a space.";
 "\\__/"'\                               "Push the string '\__/' and the character \.";
          {             }:F~             "Store this block in F and evaluate it.";
           I2md                          "Get I/2 and I%2 using divmod.";
               @*                        "Pull up the second argument and repeat it I%2
                                          times. This turns it into an empty string for
                                          even I.";
                 @@                      "Pull up I/2 and the 4-character string.";
                   *                     "Repeat the string I/2 times.";
                    '/\@                 "Push a / and reorder the three line parts.";
                            N            "Push a newline.";
                             "__\\/"_W<F "Call F again, with '__\/' and '__\'.";

4

Julia, 115 byte

n->(m=2;p=println;k=n%2>0?m+1:m;e=m<k?"":"/";t=" /\\ ";b="/__\\";if n>1 p("  "*"_"^4m)end;p(t^k*" "*e);p(b^k*e))

Ini menciptakan fungsi tanpa nama yang menerima integer dan mencetak segitiga. Untuk menyebutnya, berikan nama, mis f=n->(...).

Penjelasan + tidak dikumpulkan:

function f(n)

    m = n ÷ 2                    # Number of upside down triangles
    p = println                  # Store println function to save space
    k = n % 2 > 0 ? m + 1 : m    # Number of right side up triangles
    e = m < k ? "" : "/"         # n even? End lines with a /

    # Top of the triangle
    t = " /\\ "

    # Bottom of the triangle
    b = "/__\\"

    # Print the bottoms of any upside down triangles
    # * performs string concatenation
    # ^ performs string repetition
    if n > 1
        println("  " * "_"^4m)
    end

    # Print the triangle tops (these have two trailing spaces
    # if the last triangle isn't upside down)
    println(t^k * " " * e)

    # Print the triangle bottoms
    println(b^k * e)
end

Contoh output:

julia> for i = 1:10 f(i) end
 /\  
/__\
  ____
 /\  /
/__\/
  ____
 /\  /\  
/__\/__\
  ________
 /\  /\  /
/__\/__\/
  ________
 /\  /\  /\  
/__\/__\/__\
  ____________
 /\  /\  /\  /
/__\/__\/__\/
  ____________
 /\  /\  /\  /\  
/__\/__\/__\/__\
  ________________
 /\  /\  /\  /\  /
/__\/__\/__\/__\/
  ________________
 /\  /\  /\  /\  /\  
/__\/__\/__\/__\/__\
  ____________________
 /\  /\  /\  /\  /\  /
/__\/__\/__\/__\/__\/

Saya sangat kecewa bahwa ini sangat lama. Saya yakin ada banyak peluang bermain golf tetapi mereka tidak jelas bagi saya saat ini. Beri tahu saya jika Anda memiliki saran atau ingin penjelasan lebih lanjut!


3

CJam, 68 62 60 byte

Sejauh yang saya bisa lihat, ini adalah pendekatan yang sama sekali berbeda dari solusi CJam lainnya. Ini bisa bermain golf banyak.

"/__\\ /\\"4/]ri:R(['/"  /"'_4*"__\\"'\L]3/R*<+zR1>SS+*\W%N*

Cobalah online di sini


3

C # 190

void f(int n){string s=(n>1)?"\n  ":"",t=" /",u = "/";bool b=true;int m=n;while(m-->0){s+=(n>1&&b&&m>0)?"____":"";t+=b?"\\":"  /";u+=b?"__\\":"/";b=!b;}Console.Write("{0}\n{1}\n{2}",s,t,u);}

Tidak disatukan

void f(int n)
{
string s = (n > 1) ? "\n  " : "", t = " /", u = "/";
bool b = true;
int m = n;
while(m-->0)
{
s += (n > 1 && b && m>0) ? "____" : "";
t += b ? "\\" : "  /";
u += b ? "__\\" : "/";
b = !b;
}
Console.Write("{0}\n{1}\n{2}",s,t,u);
}

1
Kerja bagus! Perhatikan bahwa tidak pernah lebih baik menggunakan whileloop, daripada menggunakan forloop. Dalam hal ini Anda dapat menyimpan 2 byte dengan memasukkan definisi mdalam inisialisasi loop, dan b=!bdalam hal terakhir apa pun namanya. Anda juga dapat melakukan penghematan dengan mengganti stringdan booldengan var. Anda juga tidak memerlukan "()" di sekitar n>1klausa, dan dalam s+=klausa Anda dapat menggunakan hubungan arus pendek &bukan &&karena tidak ada efek samping atau referensi yang salah. Akhirnya, 1>0lebih pendek dari true;)
VisualMelon

3

C #, 257 183 byte

void C(int t){int i;var n="\r\n";var s="  "+string.Join("____",new string[1+t/2])+n;for(i=0;i++<=t;)s+=i%2<1?"\\ ":" /";s+=n;for(i=0;i++<=t;)s+=i%2<1?"__\\":"/";Console.WriteLine(s);}

Sunting: Berkat tips dariVisualMelon, disimpan 74 byte.

Saya tahu itu jauh dari bahasa terbaik untuk bermain golf, tapi saya lebih tertarik untuk belajar tentang berbagai nuansa C #, daripada memenangkan kompetisi. Ini pada dasarnya adalah port dari jawaban Pyth ini .

Saya berpikir untuk loop bisa bermain golf lebih jauh, tapi saya tidak yakin bagaimana, mengingat pernyataan tersier tertanam di dalamnya.

Contoh (1, 2, 3, 10):

 /\   
/__\  
  ____
 /\  /
/__\/
  ____
 /\  /\ 
/__\/__\
  ____________________
 /\  /\  /\  /\  /\  /
/__\/__\/__\/__\/__\/

Tidak Disatukan:

void C2(int t)
{
    int i;
    var n="\r\n";
    var s="  "+string.Join("____",new string[1+t/2])+n;
    for(i=0;i++<=t;)
        s+=i%2<1?"\\ ":" /";
    s+=n;
    for(i=0;i++<=t;)
        s+=i%2<1?"__\\":"/";
    Console.WriteLine(s);
}

Sementara StringBuilders cepat dan indah, jika Anda ingin jumlah byte yang rendah, s+=adalah teman Anda. Memang, Anda untuk loop dapat dibuat sedikit lebih kompak. Kegembiraan / kengerian operator ++dan --berarti Anda dapat melakukan sebagian besar pekerjaan dalam pemeriksaan bersyarat for(i=0;i++<=t;)(ini memeriksa jika ikurang dari atau sama dengan t kemudian menambahnya). Anda sebaiknya mendefinisikan int iloop for di luar, dan menggunakannya kembali, dan karena Anda dapat menjamin bahwa itidak akan pernah negatif, i%2==0dapat ditukar dengan i%2<1. Dengan perubahan ini, skor sub 200byte mudah dicapai.
VisualMelon

1
Juga, saya curiga Anda menulis ini di LINQPad atau serupa, karena akses ke Enumerablebiasanya memerlukan using System.Linqarahan, dan saya pikir itu umumnya dimaksudkan bahwa klausa tersebut disertakan. Namun , dalam hal ini, satu-satunya LINQ yang dapat diganti dengan var s=" "+string.Join("____",new string[1+t/2])+n;yang tidak mengandung LINQ, dan lebih pendek dari kode saat ini;) Ia menggabungkan banyak string nol bersama dengan apa yang benar-benar kita pedulikan, "____" (1 + t / 2 menjadi karena kita membutuhkan string nol lain agar sesuai dengan "____" sebelum). Variabel ndinyatakan sebagai "\ r \ n".
VisualMelon

Tips hebat! Saya lupa bahwa Enumerable akan membutuhkan System.Linq, saya hampir tidak memperhatikan hari ini. Tip untuk loop berguna!
Trent

Agak terlambat, tetapi Anda bisa menghemat 4 byte dengan menggunakan Console.WritebukannyaConsole.WriteLine
Metoniem

2

Jawa, 185

String f(int n){int i;String s="";if(n>1){s="  ";for(i=0;i<n/2;i++)s+="____";s+='\n';}for(i=0;i<=n;)s+=i++%2<1?" /":"\\ ";s+='\n';for(i=0;i<=n;i++)s+=i%2<1?i<n?"/_":"/":"_\\";return s;}

Penjelasan

String f(int n) {
    int i;
    String s = "";
    if (n > 1) {
        s = "  ";
        for (i = 0; i < n / 2; i++) {
            s += "____";
        }
        s += '\n';
    }
    for (i = 0; i <= n; i++) {
        s += i % 2 < 1 ? " /" : "\\ ";
    }
    s += '\n';
    for (i = 0; i <= n; i++) {
        s += i % 2 < 1 ? i < n ? "/_" : "/" : "_\\";
    }
    return s;
}

2

C # - 151 146 141 138

Terinspirasi oleh jawaban @ bacchusbeale

string f(int n){string t="\n",s=n>1?"  "+new string('_',n/2*4)+t:"";for(var b=n<0;n-->=0;t+=b?"__\\":"/",b=!b)s+=b?"\\ ":" /";return s+t;}

Tidak disatukan

    string f(int n)
    {
        string t = "\n", s = n > 1 ? "  " + new string('_', n / 2 * 4) + t : "";
        for (var b = n < 0; n-- >= 0; t += b ? "__\\" : "/", b = !b)
            s += b ? "\\ " : " /";
        return s + t;
    }

1
Bagus, tidak yakin bagaimana saya melewatkan ini sebelum mengomentari jawaban lain! Kelebihan new Stringitu baru bagi saya! Anda sepertinya melewatkan t=""versi golf Anda, meskipun hal yang lebih baik untuk dilakukan adalah menginisialisasi tsebagai "\ n". Anda dapat menyimpan beberapa byte dengan menambahkan ke tmana Anda flip b, menyimpan "{}" pada untuk loop: t+=(b=!b)?"/":"__\\".
VisualMelon

1
@ ini Anda dapat menyimpan lebih banyak jika Anda mendefinisikan tsebelumnya sdan menambahkan tke string daripada "\n";)
VisualMelon

1

Pergi, 156 144

func f(n int){a,b,c:="  ","","";for i:=0;i<=n;i++{if i<n/2{a+="____"};if i%2<1{b+=" /";c+="/"}else{b+=`\ `;c+=`__\`}};print(a+"\n"+b+"\n"+c)}

Tidak Disatukan:

func f(n int) {
    a, b, c := "  ", "", ""   // Initialize 3 accumulators
    for i := 0; i <= n; i++ { // For each required triangle
        if i < n/2 {          // Yay integer math
            a += "____"
        }
        if i%2 < 1 {          // Even, uneven, (are we drawing up or downslope?)
            b += " /"
            c += "/"
        } else {
            b += `\ `
            c += `__\`
        }
    }
    print(a + "\n" + b + "\n" + c)
}

Satu-satunya trik nyata di sini (dan bahkan bukan yang baik) adalah menggunakan 3 akumulator sehingga saya dapat memadatkan solusinya menjadi 1 loop.

Kode dapat dijalankan di sini: http://play.golang.org/p/urEO1kIjKv


cukup gunakan c += `__\` sebagai gantiif i<n{c+="_"}
MarcDefiant

@MarcDefiant Diperbarui, terima kasih
Kristoffer Sall-Storgaard

1

> <> (Ikan) , 215 183 156 bytes

Sunting: Notepad ++ memberi saya 5 byte tambahan karena CR, jadi dimodifikasi hitung sesuai

Sedikit lebih golf, tetapi ini adalah program ikan pertama saya sejauh ini> _ <Persyaratan untuk tidak memiliki baris pertama kosong untuk 1 segitiga dua kali lipat ukuran program.

99+0{:}1=?.~~"  "oo:2,:1%-v
-1  oooo  "____"  v!?  )0:/!
" /"oa~~.?=1}:{24~/:oo
v!?)0:-1o"\"v!?)0:/!-1ooo"  /"
/v   ~o"/"oa/!
!\:0)?!;"\__"ooo1-:0)?!;"/"o1-

Dapat menguji di http://fishlanguage.com/ (Int pada tumpukan awal untuk panjang)

Penjelasan:

       Start with initial stack as input number
99+0   Push 18 and 0 to the top of the stack
{:}    Shift the stack to the left (wraps), copy the top value, and shift it back to the left (i.e. copy bottom of stack to the top)
1=     Check to see if the top of the stack is equal to 1, pushes 1 for true, 0 for false
?.     If top of stack is zero, skip the ., otherwise jumps to x,y coordinates on top of stack (18,0). This skips the next 8 instructions
~~     Pop the top 2 values from the stack (if they're not popped by the jump)
"  "   Push the string literal "  " onto the stack
oo     Pop the top two values of stack and output them as characters
:2,    Copy top value of stack, ad divide by 2
:1%-   Since ><> uses float division, and doesn't have >= notation, remove the decimal part (if exists)
v      Redirect pointer down
/      Redirect pointer left
:0)    Copy top of stack, and see if its greater than 0 (1 for true, 0 for false)
?!v    If top of stack is non-zero, then ! is executed, which skips the next instruction (redirect), otherwise, code is redirected
"____" Push the literal "____" to the stack
oooo   Pop the top four values of stack and output them as characters
1-     Decrement the top of the stack by 1
!/     Ignore the redirect action.
       When the loop gets to 0, it goes to next line, and gets redirected to the left.
~      Pops the top of the stack (0 counter)
42     Pushes 4 and 2 to the stack
{:}    As before, copies the bottom of the stack to the top
1=?.   Also as before, if the initial value is 1, jump to (2,4) (skipping next 4 instructions
~~     Pop 2 values from stack if these instructions haven't been skipped
ao     Push 10 onto the stack and output it as a character (LF)
"/ "oo Push the literal "/ " onto the stack and output it
://    Copies the top of the stack then redirects to the line below, which then redirects to the left
:0)    Copies top of the stack and compares if its greater than 0
?!v    If it is, redirect to next line
"\"o   Push "\" to stack, then output it as a character
1-     Decrement top value of stack
:0)?!v If loop is not greater than 0, redirect to next line
       Either mode of redirect will loop to the left, and (potentially) skip the far right redirect because of the !
ao     Push 10 to stack and output it as a character (LF)
"/"o~  Push "/" to stack, then output it as a character. Pop top value of stack (the 0 from previous loop)
v      Redirects to next line, which then redirects to the right
:0)?!; If the top of the stack is not greater than 0, terminate (;)
"\__"  Pushes "\__" to the stack
ooo    Outputs top 3 stack values as characters ("__\")
1-     Decrement top of stack by 1
:0)?!; If the top of the stack is not greater than 0, terminate (;)
"/"o   Push "/" to top of stack then output it as a character
1-     Decrement top of stack by 1
!\     Ignore the redirect

1
Penerjemah yang bagus! Apakah Anda membuatnya sendiri?
Sp3000

Bahkan tidak sedikit. : PI menggunakannya secara ekstensif untuk mengajari diri sendiri bahasa ... dan untuk debug. Saya baru saja melihat bahasa melayang-layang dan berpikir itu sangat menarik (juga ingin mencoba Marbles).
Fongoid

1

perl 109 108 106

$i=<>;$t=join$/,$i-1?"  "."_"x($i/2)x4:(),$m.=(" /")[$_&1]||"\\ ",$b.=("/")[$_&1]||"__\\"for 0..$i;print$t

Saya pikir ini tidak masalah untuk golf pertama saya, saya menggunakan bagian Vynce untuk baris pertama, dengan sisa kode saya untuk melewati masalah baris baru dengan 1 segitiga.

Sekarang untuk melihat apakah saya dapat mempersingkatnya :)

Sunting : Whitespace

Sunting 2 : diganti "\n"dengan$/

1:
 /\
/__\

4:
  ________
 /\  /\  /
/__\/__\/

1

C89, 150

r(p,q,n)int*p,*q;{n?printf(p),r(q,p,n-1):puts(p);}main(c,v)int**v;{c=atoi(v[1]);if(c>1)printf("  "),r("","____",c-1);r(" /","\\ ",c);r("/","__\\",c);}

Versi ungolfed:

r(p, q, n) char *p, *q; {
    if(n > 0) {
        printf(p);
        r(q, p, n-1); /* swap p and q */
    } else {
        puts(p);
    }
}

main(c, v) char**v; {
    c = atoi(v[1]);
    if(c>1) {
        printf("  ");
        r("", "____", c - 1);
    }
    r(" /", "\\ ", c);
    r("/", "__\\", c);
}

Hasil:

$ seq 1 3 10 | xargs -n1 ./triangles
 /\
/__\
  ________
 /\  /\  /
/__\/__\/
  ____________
 /\  /\  /\  /\
/__\/__\/__\/__\
  ____________________
 /\  /\  /\  /\  /\  /
/__\/__\/__\/__\/__\/

Tumpukan meluap jika saya masukkan 65535(tetapi tidak jika Anda mengkompilasi dengan -O3!), Tetapi secara teoritis itu akan bekerja ;-)

sunting: program sekarang memenuhi persyaratan bahwa hanya dua baris yang harus di-output jika 1dilewatkan ke program sunting 2: gunakan int*alih-alihchar*


Anda bisa mendeklarasikan mainseolah- main(c,v)**v;olah itu berhasil.
FUZxxl

Saya ingin tahu apakah Anda dapat menyimpan sesuatu dengan memiliki catau nsebagai variabel global, jadi Anda tidak harus meneruskan parameter itu ke r(). Saya tidak berpikir jawaban Anda sesuai denganNote that for 1 the output is two lines long but otherwise it's three. This is required.
Level River St

@FUZxxl sayangnya ini tidak berhasil :-(error: expected declaration specifiers before ‘*’ token main(c,v)**v;{
MarcDefiant

@steveverrill memperbaikinya, tetapi saya perlu memperpanjang kode. Tidak dapat menemukan solusi dengan global natau cyang lebih pendek.
MarcDefiant

@MarcDefiant Apakah Anda dapat lulus int**?
FUZxxl

1

C ++ stdlib, 194 byte

string f(int n){char* p[]={"____"," /\\ ","/__\\"};int x[]={(n-n%2)*2,n*2+2-n%2,n*2+1+n%2},i,j;string s=n>1?"  ":"";for (i=n>1?0:1;i<3;s+=++i<3?"\n":"")for (j=0;j<x[i];)s+=p[i][j++%4];return s;}

Program uji:

#include <string>
#include <iostream>

using namespace std;

string f(int n)
{
    char* p[]={"____"," /\\ ","/__\\"};
    int x[]={(n-n%2)*2,n*2+2-n%2,n*2+1+n%2},i,j;
    string s=n>1?"  ":"";
    for (i=n>1?0:1;i<3;s+=++i<3?"\n":"")
        for (j=0;j<x[i];)
            s+=p[i][j++%4];
    return s;
}

int main(int argc, char* argv[])
{
    cout << f(10);
    return 0;
}

1

Bash, 166 127 125 119 105 byte

printf -v l %$[$1/2]s;(($1%2))&&r= j=$l\ ||r=/ j=$l;echo "  ${l// /____}
${j// / /\ } $r
${j// //__\\}"$r

Dalam suatu fungsi:

triangle() {
    printf -v l %$[$1/2]s;(($1%2))&&r= j=$l\ ||r=/ j=$l;echo "  ${l// /____}
${j// / /\ } $r
${j// //__\\}"$r
}

Dengan beberapa presentasi:

for i in {1..5} 10 31;do
    paste -d\  <(
        figlet -fsmall $i |
             sed 's/^/         /;s/^ *\(.\{10\}\)$/\1  /;$d'
    ) <(triangle $i)
  done

Dapat merender (jika Anda telah menginstal figlet ):

        _      
       / |    /\  
       | |   /__\
       |_|   
      ___      ____
     |_  )    /\  /
      / /    /__\/
     /___|   
      ____     ____
     |__ /    /\  /\  
      |_ \   /__\/__\
     |___/   
     _ _       ________
    | | |     /\  /\  /
    |_  _|   /__\/__\/
      |_|    
      ___      ________
     | __|    /\  /\  /\  
     |__ \   /__\/__\/__\
     |___/   
   _  __       ____________________
  / |/  \     /\  /\  /\  /\  /\  /
  | | () |   /__\/__\/__\/__\/__\/
  |_|\__/    
    _____      ____________________________________________________________
   |__ / |    /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  
    |_ \ |   /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\
   |___/_|   

Simpan 2 karakter jika input dari variabel, bukan $1: 103

printf -v l %$[i/2]s;((i%2))&&r= j=$l\ ||r=/ j=$l;echo "  ${l// /____}
${j// / /\ } $r
${j// //__\\}"$r

Ke dalam loop:

for i in {1..3} {31..34};do
    [ $i == 31 ] && figlet -fsmall ...
    paste -d\  <(
        figlet -fsmall $i |
            sed 's/^/         /;s/^ *\(.\{10\}\)$/\1   /;$d'
    ) <(
        printf -v l %$[i/2]s;((i%2))&&r= j=$l\ ||r=/ j=$l;echo "  ${l// /____}
${j// / /\ } $r
${j// //__\\}"$r
    )
  done

Akan membuat (kira-kira) sama:

        _       
       / |     /\  
       | |    /__\
       |_|    
      ___       ____
     |_  )     /\  /
      / /     /__\/
     /___|    
      ____      ____
     |__ /     /\  /\  
      |_ \    /__\/__\
     |___/    


 _ _ _ 
(_|_|_)

    _____       ____________________________________________________________
   |__ / |     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  
    |_ \ |    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\
   |___/_|    
  _______       ________________________________________________________________
 |__ /_  )     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /
  |_ \/ /     /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/
 |___/___|    
  ________      ________________________________________________________________
 |__ /__ /     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  
  |_ \|_ \    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\
 |___/___/    
 _____ _        ____________________________________________________________________
|__ / | |      /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /
 |_ \_  _|    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/
|___/ |_|     

1
Anda harus memposting pertanyaan tentang codegolf implementasi figlet!
sergiol

1

Arang , 27 byte (tidak bersaing)

Nonkompetisi karena bahasa yang ada setelah tantangan.

FEN﹪鲫P×⁴_↗⊗¬ι↓P↘²↘⊗ι↑P↗⊗ι

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

FEN﹪鲫

Buat daftar bit bolak panjang ndan loop di atasnya.

P×⁴_

Gambar ____tanpa menggerakkan kursor.

↗⊗¬ι↓

Pada segitiga pertama dan setiap segitiga lainnya, gambar /sisi kiri .

P↘²

Gambar \sisi tanpa menggerakkan kursor.

↘⊗ι↑

Pada segitiga kedua dan setiap lainnya, gambar \sisi kiri lagi untuk menggerakkan kursor.

P↗⊗ι

Pada segitiga kedua dan setiap segitiga lainnya, gambar /sisi kanan , tanpa menggerakkan kursor.


1
Jawaban tidak lagi harus ditandai sebagai tidak bersaing lagi
Jo King

1

PowerShell , 116 95 byte

Terima kasih banyak kepada Mazzy dan ASCII-Only untuk menghemat 21 byte

param($n)@("  "+"_"*4*($x=$n-shr1))[$n-eq1]
" /"+"\  /"*$x+"\"*($a=$n%2)
"/"+"__\/"*$x+"__\"*$a

Cobalah online!

Tidak mengizinkan baris kosong untuk n = 1 memakan seperti 14 10 byte. Solusi ini cukup mati otak sekarang jauh lebih pintar dengan jumlah minimal kode berulang. Pembulatan Bankir masih iblis yang sebenarnya.


Apakah garis kosong tidak diizinkan ???
ASCII

@ Khusus ASCII Baca poin 4 dari OP.
Veskah


1
@ Hanya ASCII Istirahat pada x = 3 Ganti string adalah bagaimana Anda memotong pembulatan bankir
Veskah

1
@ Mazzy Anda tidak dapat membuat baris pertama, kalau tidak, itu akan menjadi 102
ASCII-hanya

0

C, 368 Bytes

void p(char* c){printf(c);}
int x(int s,int f){int t=0,p=s;for(int i=0;i<f;i++){if(p==1){t++;p=0;}else{p=1;}}return t;}
int main(int argc,char* argv[]){int t=atoi(argv[1]);if(t>1){p("  ");for(int i=0;i<x(0,t);i++)
{p("____");}p("\n");}for(int i=0;i<x(1,t);i++){p(" /\\ ");}if(t%2==0){p(" /");}p("\n");
for(int i=0;i<x(1,t);i++){p("/__\\");}if(t%2==0){p("/");}p("\n");}

Ini lebih jika Anda menghitung #includepernyataan, tetapi dikompilasi di gcc, meskipun dengan peringatan, tanpa mereka. Saya tahu ini bukan yang terpendek sejauh ini, tapi saya masih suka saya melakukannya di C.


Makro #define p(c)printf(c)lebih pendek dari fungsi Anda. Anda dapat menghilangkan jenis kembali pada fungsi (mereka default ke int). Anda juga dapat mendefinisikan fungsi dengan C89gaya seperti ini main(c,v)char**v;{}. Itu adalah kependekan dariint main(int c, char** v){}
MarcDefiant

0

Perl (sederhana) 131 125 120

pass pertama yang cukup mudah:

$i=<>;print join"\n",$i-1?"  "."_"x(4*int($i/2)):(),join("",map{(" /","\\ ")[$_%2]}0..$i),join"",map{("/","__\\")[$_%2]}0..$i

oh siapa yang butuh int eksplisit?

$i=<>;print join"\n",$i-1?"  "."_"x($i/2)x4:(),join("",map{(" /","\\ ")[$_%2]}0..$i),join"",map{("/","__\\")[$_%2]}0..$i

0

Prolog, 126 byte

A+B:-writef(A,B).
$N:-(N>1,"  %r\n"+['____',N//2];!),(0is N/\1,T='/';T='')," %r%w\n"+['/\\  ',N/2,T],"%r%w\n"+['/__\\',N/2,T].

Ajak suka $3.

Lebih mudah dibaca:

triangle(N):-
    (   N > 1
    ->  writef("  %r\n", ['____', N//2])
    ;   true
    ),
    (   0 is N mod 2
    ->  T = '/'
    ;   T = ''
    ),
    writef(" %r%w\n", ['/\\  ', N/2, T]),
    writef("%r%w\n", ['/__\\', N/2, T]).

Contoh:

?- findall(N,between(1,10,N),NN), maplist($, NN), !.
 /\  
/__\
  ____
 /\  /
/__\/
  ____
 /\  /\  
/__\/__\
  ________
 /\  /\  /
/__\/__\/
  ________
 /\  /\  /\  
/__\/__\/__\
  ____________
 /\  /\  /\  /
/__\/__\/__\/
  ____________
 /\  /\  /\  /\  
/__\/__\/__\/__\
  ________________
 /\  /\  /\  /\  /
/__\/__\/__\/__\/
  ________________
 /\  /\  /\  /\  /\  
/__\/__\/__\/__\/__\
  ____________________
 /\  /\  /\  /\  /\  /
/__\/__\/__\/__\/__\/
NN = [1, 2, 3, 4, 5, 6, 7, 8, 9|...].

0

C #: 1 baris LINQ, 198 byte

string f(int n){return(n>1?"  ":"")+string.Join("\n",new[]{"____"," /\\ ","/__\\"}.Zip(new[]{(n-n%2)*2,n*2+2-n%2,n*2+1+n%2},(s,l)=>string.Join(s,new string[n+1]).Substring(0,l)).Where(x=>x.Any()));}

0

Retina , 88 byte (tidak bersaing)

Nonkompetisi karena bahasa yang ada setelah tantangan.

K`  ____¶ /\  /¶/__\/
%`....$
$+*$&
%`(.+)\1$
$1
(  (____)*)__(¶.*)  /(¶.*)/
$1$3$4
G`\S

Cobalah online! Penjelasan:

K`  ____¶ /\  /¶/__\/

Ganti input dengan sepasang segitiga.

%`....$
$+*$&

Lipat gandakan segitiga dengan input asli.

%`(.+)\1$
$1

Bagilah segitiga dengan 2.

(  (____)*)__(¶.*)  /(¶.*)/
$1$3$4

Hapus segitiga setengah-kiri.

G`\S

Hapus baris pertama jika sekarang kosong.


0

Perl 6 , 83 byte

{~["  {'____'x$_/2-.5}
"x($_>2),'/\  'x$_/2~($!='/'x$_%2),"
"~'/__\\'x$_/2~$!]}o*+1

Cobalah online!

Blok kode anonim yang mengambil nomor dan mengembalikan string.



0

05AB1E , 37 byte

≠iðð'_I2÷4*×J}„ /„\ ‚I>∍J'/…__\‚I>∍J»

Cobalah online atau verifikasi 10 output pertama .

Penjelasan:

i            } # If the (implicit) input is NOT 1:
                #   i.e. 1 → 0 (falsey)
                #   i.e. 5 → 1 (truthy)
  ðð            #  Push two spaces "  "
    '_         '#  Push string "_"
      I         #  Push the input
       2÷       #  Integer-divide it by 2
                #   i.e. 5 → 2
         4*     #  And then multiply it by 4
                #   i.e. 2 → 8
           ×    #  Repeat the "_" that many times
                #   i.e. "_" and 8 → "________"
            J   #  Join everything on the stack together to a single string
                #   i.e. "  ________"
 /             # Push string " /"
   \           # Push string "\ "
               # Pair them together: [" /","\ "]
      I>        # Push the input+1
               # Extend the list to that size
                #  i.e. [" /","\ "] and 2 → [" /","\ "]
                #  i.e. [" /","\ "] and 6 → [" /","\ "," /","\ "," /","\ "]
         J      # Join the list together to a single string
                #  i.e. [" /","\ "] → " /\ "
                #  i.e. [" /","\ "," /","\ "," /","\ "] → " /\  /\  /\ "
'/             '# Push string "/"
  __\          # Push string "__\"
               # Pair them together: ["/","__\"]
       I>       # Push the input+1
               # Extend the list to that size
                #  i.e. ["/","__\"] and 2 → ["/","__\"]
                #  i.e. ["/","__\"] and 6 → ["/","__\","/","__\","/","__\"]
          J     # Join the list together to a single string
                #  i.e. ["/","__\"] → "/__\"
                #  i.e. ["/","__\","/","__\","/","__\"] → "/__\/__\/__\"
»               # Join the entire stack with a newline delimiter
                #  i.e. " /\ " and "/__\" → " /\ \n/__\"
                #  i.e. "  ________", " /\  /\  /\ " and "/__\/__\/__\"
                #   → "  ________\n /\  /\  /\ \n/__\/__\/__\"
                # (and output the result implicitly)

0

Java 11, 122 byte

n->(n>1?"  "+"_".repeat(n/2*4)+"\n":"")+" /\\ ".repeat(n).substring(0,++n*2)+"\n"+"/__\\".repeat(n).substring(0,n/2*4+n%2)

Cobalah online.

Penjelasan:

n->                   // Method with integer parameter and String return-type
  (n>1?               //  If the input is larger than 1:
    "  "              //   Return two spaces
    +"_".repeat(      //   Appended with "_" repeated the following amount of times:
          n/2         //    The input integer-divided by 2
             *4)      //    And then multiplied by 4
    +"\n"             //   Appended with a newline
   :                  //  Else:
    "")               //   Return nothing
  +" /\\ ".repeat(n)  //  Appended with " /\ " repeated the input amount of times
    .substring(0,     //   After which we only leave the first `x` characters, where `x` is:
      ++n             //    Increase the input by 1 first with `++n`
         *2)          //    And then multiply it by 2
                      //     i.e. For input 1, `x` becomes 4 here
                      //     i.e. For input 6, `x` becomes 14 here
  +"\n"               //  Appended with a newline
  +"/__\\".repeat(n)  //  Appended with "/__\" repeated the input amount of times
    .substring(0,     //   After which we only leave the first `y` characters, where `y` is:
      n/2             //    The input+1 integer-divided by 2
         *4           //    Then multiplied by 4
           +n%2)      //    And then the input+1 modulo-2 added
                      //     i.e. For input 1, `y` becomes 4 here
                      //     i.e. For input 6, `y` becomes 13 here
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.