House of cards (versi 2)

8

Terima kasih kepada FryAmTheEggman untuk ide untuk versi kedua ini.
Versi 1 di sini .

Tantangan yang tidak terlalu sederhana: diberikan sejumlah kartu, bangun rumah kartu terbesar yang Anda bisa dengan jumlah kartu itu, sesuai dengan urutan bangunan berikut:

                          /\       /\         /\         /\/\
                 --       --       --         ----       ----
/\  →  /\/\  →  /\/\  →  /\/\  →  /\/\/\  →  /\/\/\  →  /\/\/\  →

                /\         /\
     --         --         --
    /\/\       /\/\       /\/\
    ----       ----       ----
→  /\/\/\  →  /\/\/\  →  /\/\/\/\  →  ...

Jadi Anda mulai dengan rumah satu lantai, kemudian membangun kelompok yang berdekatan, kemudian meletakkan kartu jembatan, kemudian membangun kelompok di lantai dua, kemudian mulai membangun kelompok dan jembatan dari lantai pertama secara diagonal untuk mencapai lantai tiga, dan seterusnya di.

Satu kartu akan diwakili dengan a /, a \atau a --. Jika setelah menggunakan sebanyak mungkin kartu, Anda memiliki satu kartu tersisa, cukup outputkan apa yang telah Anda capai sejauh ini (lihat contoh untuk 3 kartu, hasilnya sama dengan 2 kartu). Satu-satunya pengecualian adalah kasus 1 kartu, yang harus mengeluarkan kartu datar.

Contoh:

Input: 1
Output: 

--   <a card lying on the floor>

Input: 2
Output:

/\

Input: 3
Output:

/\

Input: 5
Output:

 --
/\/\

Input: 10
Output:

 /\
 ----
/\/\/\

Input: 20
Output:

  /\
  --
 /\/\/\
 ------
/\/\/\/\

Input: 39
Output:

    --
   /\/\
   ----
  /\/\/\
  ------
 /\/\/\/\
 --------
/\/\/\/\/\

Input: 40
Output:

    /\
    --
   /\/\
   ----
  /\/\/\
  ------
 /\/\/\/\
 --------
/\/\/\/\/\

Input dapat berupa angka atau string, dan akan selalu menjadi bilangan bulat positif. Keluaran harus persis seperti yang ditunjukkan, dengan spasi di depan dan di belakang serta baris baru diizinkan.

Ini adalah , jadi semoga program / fungsi terpendek untuk setiap bahasa menang!

Charlie
sumber
Ini berasal dari kotak pasir .
Charlie
6
Ini tantangan yang menarik tetapi secara pribadi saya pikir Anda harus menunggu sedikit lebih lama, mungkin sehari, antara mempostingnya.
caird coinheringaahing
@cairdcoinheringaahing Saya akui bahwa saya tidak tahu berapa lama saya harus menunggu di antara kedua posting. Sudah lama sejak jawaban terakhir untuk versi 1, jadi saya kira saya bisa mempostingnya sekarang (24 jam setelah). Terima kasih atas saran Anda, saya akan mengingatnya lain kali.
Charlie
2
Jika lebar kartu bridge bukan nol, bukankah seharusnya output untuk 1 kartu menjadi kartu flat?
Peter Taylor
2
Saya pikir setengah dari kasus uji sekarang salah, karena mereka tidak memperhitungkan kemungkinan menempatkan lapisan datar di bagian bawah. Kotak pasir tidak benar-benar berfungsi kecuali Anda meninggalkan pertanyaan di sana selama beberapa hari sehingga orang punya waktu untuk berkomentar. (Dan untuk "bagian 2" adalah penting untuk memperjelas bahwa ini adalah bagian 2 sehingga orang tidak berpikir itu bagian 1 dan mereka sudah melihatnya).
Peter Taylor

Jawaban:

4

Arang , 67 byte

Nθ⁼θ¹A²ηW¬‹θη«←÷η³↓→/…\/÷η³↙A⁻θηθA⁺³ηη»‖MM÷η³→Fθ≡﹪鳦¹«↗←\/»²«↑P²»«

Cobalah online! Catatan: Versi terbaru dari Charcoal tidak perlu »«untuk -2 byte. Penjelasan:

Nθ

Baca input sebagai bilangan bulat θ.

⁼θ¹

Kasus khusus: jika inputnya 1, cetak a -.

A²ηW¬‹θη«

η mewakili jumlah kartu yang dibutuhkan untuk membangun lapisan berikutnya, awalnya 2. A while loop berulang selama ada cukup kartu untuk lapisan.

←÷η³↓→/…\/÷η³↙

Cetak setengah kiri lapisan berikutnya. (Saya ingin mencetak setengah yang tepat, tetapi saya tidak bisa membuatnya mencerminkan dengan benar karena beberapa alasan.) Jumlah -s adalah sepertiga dari jumlah kartu di lapisan, dibulatkan ke bawah. (Lihat juga jawaban saya untuk bagian 1.)

A⁻θηθA⁺³ηη»

Kurangi jumlah kartu dari nomor input, dan tambahkan tiga kartu ke nomor yang diperlukan untuk lapisan berikutnya.

‖M

Cermin rumah sejauh ini. (Ini juga mengubah -ke --dalam kasus 1 kartu.)

M÷η³→

Pindahkan kursor ke kanan rumah.

Fθ

Ulangi untuk setiap kartu yang tersisa (jika ada).

≡﹪鳦

Jika kartu modulo 3 adalah:

¹«↗←\/»

1, lalu cetak sepasang kartu;

²«↑P²»

2, lalu cetak kartu horisontal;

«

Kalau tidak, lewati kartu (karena pasangan diperlukan pada saat ini).

Neil
sumber
Jawaban yang sangat bagus! Apakah Anda mulai menulisnya sebelum saya mengubah wadah 1 kartu? Kasing itu harus menampilkan --(kartu datar), tetapi jika Anda memulai program Anda sebelum saya mengubah persyaratan itu saya akan melewatkan itu ...
Charlie
@CarlosAlejo Tidak, saya baru saja lupa tentang kasus itu. Maaf soal itu. Diperbaiki sekarang
Neil
1
@Neil Anda yakin tidak membuat arang? Karena aku mulai tidak percaya padamu.
Magic Gurita Guci
@MagicOctopusUrn D: hei (tapi ya, keterampilan Arang Neil luar biasa, bahkan mungkin lebih baik daripada milikku haha)
ASCII
Ups maaf, akan diperbaiki di komit berikutnya
ASCII
2

Python 2 , 167 182 byte

167 byte

f=lambda x,y=0:y<x<2and"--"or~-x>y*3and f(x-2-y*3,y+1)or d(y,x)
d=lambda h,r,v=0:h and d(~-h,max(r-3,1),-~v)+" "*-~v+"--"*(h-(r<3))+"\n"+" "*v+"/\\"*(h+(r>1))+"\n"or""

182 byte

f=lambda x,y=0:[x>1+y*3and f(x-2-y*3,y+1)or d(y,x),"--"][2>x>y]
d=lambda h,r,v=0:d(h-1,r-3*(r>2)-2*(r==2),v+1)+" "*(v+1)+"--"*(h-1+(r>2))+"\n"+" "*v+"/\\"*(h+(r>1))+"\n"if h+r else""

Penjelasan (versi 167-byte)

f=lambda x,y=0:
    "--" if y<x<2         # handle case where x is 1 on step 0 (only one card) 
    else f(x-2-y*3,y+1)   # recursive call with one full triangular level accounted for
    if x>= 2+y*3          # one full level requires 2+3y cards (2, 7, 15...)
    else d(y,x)           # if no more full levels can be constructed, draw
d=lambda h,r,v=0:         # (h)eight to draw, (r)emaining cards, (v)ertical height already drawn (to determine leading white space)
    d(h-1,          ,v+1) # recursive call to draw upper lines
          max(r-3,1)      # subtract remainder cards used in this iteration
    +" "*(v+1)            # leading whitespace for -- row
    +"--"*(       )+"\n"  # -- line. 
           h-(r<3)        # horizontal card count is equal to the remaining count of levels to draw, minus 1, 
                          # ...plus 1 if there are at least three remaining cards to add to the right
    +" "*v                # leading whitespace for /\ row
    +"/\\"*(       )+"\n" # /\ line
            h+(r>1)       # vertical card pair count equals remaining level count
                          # ...plus 1 if there are at least two extra cards
    if h                  # return above is there are levels to draw (h) 
    else ""               # else return nothing (ends recursion)

Cobalah online!

  • Ini terasa terlalu lama, tapi saya tidak bisa melihat apa pun untuk dihapus saat ini ... jangan ragu untuk berkomentar saran
Coty Johnathan Saxman
sumber
Terima kasih banyak atas jawaban Anda, tetapi contoh Anda tidak cocok dengan kasus uji, Anda menaruh lebih banyak kartu di rumah Anda daripada yang Anda miliki. Misalnya, dalam kasus 7 kartu Anda dapat membangun rumah dengan 4 kartu di lantai pertama, kartu jembatan dan 2 kartu lagi di lantai dua. Tapi Anda menunjukkan rumah dengan 10 kartu (6 kartu di floow pertama dan 2 kartu bridge). Lihat contoh dan cara rumah dibangun.
Charlie
Mari kita lanjutkan diskusi ini dalam obrolan .
Coty Johnathan Saxman
Jika Anda ingin memisahkan bagian-bagian kode yang secara langsung mengikuti satu sama lain, Anda dapat melakukannya dengan menggunakan <pre><code>... </code></pre>tag di sekitar kode Anda, masing-masing blok dengan indentasi 4 spasi
Taylor Scott
1
Saya melihat apa yang terjadi: untuk beberapa alasan ketika Anda menggunakan <pre><code>tag , tag tersebut ditangkap <3))+"\n"+" "*v+"/\\"*(h+(r>sebagai tag lain dan tidak menampilkan wilayah solusi tersebut. Mungkin seseorang di komunitas yang memahami ini sedikit lebih baik dapat memberi tahu kami bagaimana cara menghindarinya ... tetapi selain itu pemformatan Anda saat ini dapat dibaca dengan sempurna dan karenanya meniadakan kebutuhan untuk pemformatan jenis ini bersama
Taylor Scott
2
@TaylorScott Agak terlambat tetapi Anda dapat memperbaikinya dengan menggantinya dengan entitas HTML: &lt;untuk <dan &gt;untuk>
Business Cat
1

Perl 5 , 129 byte

@r=($_=<>-2)<0?'--':'/\\';while($_>1){$#r+=2;$i=0;$r[$i].=$i++%2?'--':'/\\'while$i<@r&&($_-=2-$i%2)>=0}say$"x(@r/2).pop@r while@r

Cobalah online!

Xcali
sumber