Bowling Snowman

29

(terkait / terinspirasi oleh: Menggambar formasi bowling )

Sebuah hiburan yang menyenangkan di bulan-bulan musim dingin di sini adalah melakukan bowling snowman, menggunakan bola besar (seperti bola basket) dan figur manusia salju kecil. Mari kita buat ulang ini di ASCII.

Setiap manusia salju terdiri dari yang berikut:

(.,.)
( : )

Berikut adalah keselarasan dari sepuluh pin "manusia salju"

(.,.) (.,.) (.,.) (.,.)
( : ) ( : ) ( : ) ( : )
   (.,.) (.,.) (.,.)
   ( : ) ( : ) ( : )
      (.,.) (.,.)
      ( : ) ( : )
         (.,.)
         ( : )

Ini "pin" diberi label dari 1ke 10sebagai

7 8 9 10
 4 5 6
  2 3
   1

Sejauh ini standar. Namun, tidak seperti bowling normal, pin manusia salju hanya rata dan tidak sepenuhnya dihapus. Hal ini dilakukan oleh seseorang yang perlu meratakan salju pin yang dipukul secara manual. Manusia salju yang rata diwakili oleh _____(lima garis bawah), dengan spasi putih di atas. Berikut adalah contoh dengan 1 3 5 6 9 10pin diratakan (artinya hanya 2 4 7 8pin yang tersisa):

(.,.) (.,.)
( : ) ( : ) _____ _____
   (.,.)
   ( : ) _____ _____
      (.,.) 
      ( : ) _____

         _____

Memasukkan

  • Daftar bilangan bulat dari 1ke 10 dalam format apa pun yang mewakili pin mana yang dipukul dan karenanya perlu diratakan.
  • Setiap angka hanya akan muncul paling banyak satu kali, dan angka-angkanya dapat dalam urutan apa pun (diurutkan, tidak disortir, diurutkan secara menurun) - pilihan Anda, apa pun yang membuat kode Anda lebih golf.
  • Input dijamin memiliki setidaknya satu bilangan bulat.

Keluaran

Representasi seni ASCII yang dihasilkan dari pin manusia salju, dengan pin yang benar diratakan.

Aturan

  • Leading atau trailing newlines atau whitespace semuanya opsional, asalkan karakter itu sendiri berbaris dengan benar.
  • Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
  • Jika memungkinkan, harap sertakan tautan ke lingkungan pengujian online sehingga orang dapat mencoba kode Anda!
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.

Contohnya

1 3 5 6 9 10

(.,.) (.,.)
( : ) ( : ) _____ _____
   (.,.)
   ( : ) _____ _____
      (.,.) 
      ( : ) _____

         _____

1 2 3

(.,.) (.,.) (.,.) (.,.)
( : ) ( : ) ( : ) ( : )
   (.,.) (.,.) (.,.)
   ( : ) ( : ) ( : )

      _____ _____

         _____

1 2 3 4 5 6 8 9 10

(.,.)
( : ) _____ _____ _____

   _____ _____ _____

      _____ _____

         _____
AdmBorkBork
sumber
18
Golf kode ? Bukan kode bowling ?
Tandai
Bisakah kita mengambil nomor input yang diindeks dari 0? Dan jika mungkin mengambil nilai input tanpa spasi seperti 0123456789 bukan 1 2 3 4 5 6 7 8 9 10?
Teal pelican
Sempurna: D memungkinkan saya melakukan upaya yang lebih mudah di> <>
Teal pelican
4
Saya tidak setuju untuk meratakan manusia salju.
saya mengidentifikasi diri saya sebagai manusia salju dan menemukan perataan ini.
conquistador

Jawaban:

7

05AB1E , 45 44 byte

TF"(.,.)( : )"„ _5×{«4ä2ä¹N>åè})4L£Rvyø»}».c

Cobalah online!

Penjelasan

TF                                           # for N in [0 ... 9] do:
  "(.,.)( : )"                               # push string
              „ _                            # push the string " _"
                 5×                          # repeat it 5 times
                   {                         # sort
                    «                        # concatenate the strings
                     4ä                      # split the string in 4 parts
                       2ä                    # split the list in 2 parts
                         ¹N>åè               # if index+1 is in the input, push the first part
                                             # else push the second part
                              }              # end loop
                               )             # wrap stack in a list
                                4L£          # split list in parts of size 1,2,3,4
                                   R         # reverse list
                                    v        # for each list in list of lists
                                     yø      # transpose the list
                                       »     # join by spaces and newlines
                                        }    # end loop
                                         »   # join by newlines
                                          .c # centralize
Emigna
sumber
46

Snowman 1.0.2 , 157 byte

(()("789:045600230001"4aG::48nSdU][:#:]eq]/nM;AsI[:"_____"wR["     "wR/aC;:"( : )"wR["(.,.)"wR/aC;bI;:"  "wRdUaC;bI\#**\;aMaZ:" "aJ1AfL;aM;aM1AfL"
"aJ1AfL*))

Cobalah online!

Ketika saya melihat tantangan ini, saya tahu saya harus menjawab dalam bahasa yang sempurna ...

Ini adalah subrutin yang mengambil input sebagai array angka dan output sebagai string melalui permavar saat ini.

Dibungkus untuk "keterbacaan" / estetika:

(()("789:045600230001"4aG::48nSdU][:#:]eq]/nM;AsI[
:"_____"wR["     "wR/aC;:"( : )"wR["(.,.)"wR/aC;bI
;:"  "wRdUaC;bI\#**\;aMaZ:" "aJ1AfL;aM;aM1AfL"
"aJ1AfL*))

Versi sedikit ungolfed / berkomentar:

}
1wR`
3wR`aC`
5wR`aC`
6wR`aC`
9wR`aC`
*

((
    )(
    "789:045600230001"  // pin layout data
    4aG                 // split into groups of 4; we need each row twice
    :                   // map over groups of 2 output lines
        :               // map over pins (or whitespace)
            48nS        // subtract ascii '0'
            dU][        // duplicate the pin; we need it in the if{}
            :           // if (pin) {
                #:]eq]/nM;AsI[:"_____"wR["     "wR/aC;:"( : )"wR["(.,.)"wR/aC;bI
            ;:          // } else {
                "  "wRdUaC
            ;bI         // }
            \#**\       // maneuver the permavars around to discard pin
        ;aM
        aZ:" "aJ1AfL;aM
    ;aM
    1AfL                // flatten (simulate a flatmap)
    "
"aJ                     // join on newline
    1AfL                // flatten again into a single string
    *
))

#sP
Gagang pintu
sumber
17
Cukup banyak satu-satunya konteks bahwa ini akan dikenal sebagai "bahasa yang sempurna"
,:
2
Seorang manusia salju membunuh jenisnya sendiri ... Dasar monster!
RudolfJelin
10

ditumpuk , tidak bersaing, 118 byte

Saya menambahkan deepmapdan beberapa hal lain setelah tantangan ini, bersama dengan banyak perbaikan bug. Coba di sini!

@a((7 8 9 10)(4 5 6)(2 3)(1)){e:('(.,.)
( : )' ' 
_'5 hrep)a e has#'  'hcat
}deepmap{e i:' 
 'i 3*hrep e,$hcat#/!LF+}map

Tidak disatukan

{ a :
  ((7 8 9 10) (4 5 6) (2 3) (1))
  { e :
    (
      '(.,.)' LF '( : )' + + 
      ' ' LF '_' + + 5 hrep
    ) @possible
    a e has @ind
    possible ind get @res
    '  ' @padding
    res padding hcat return
  } deepmap
  { e i:
    ' ' LF ' ' + + i 3 * hrep
    e ,
    $hcat insert!
    LF +
  } map
} @:bowl

(1 2 3 4 6 10) bowl out

Keluaran:

(.,.) (.,.) (.,.)       
( : ) ( : ) ( : ) _____ 
         (.,.)       
   _____ ( : ) _____ 

      _____ _____ 

         _____ 
Conor O'Brien
sumber
Bahasa ini tampak hebat. Contoh Fisher-Yates di wiki itu indah.
Jordan
@ Jordan, terima kasih banyak! itu sangat berarti bagi saya :)
Conor O'Brien
7

Python 2, 248 243 241 226 224 223 221 210 206 200 177 byte

-5 dengan terima kasih kepada @Rod

-15 lagi terima kasih kepada Rod

-1 menggunakan perhitungan ruang lagi dari Rod

Terlihat lebih panjang karena lebih banyak garis dan indentasi tetapi secara mengejutkan 11 byte lebih pendek.

Saya yakin ini akan berada di bawah 200 ...

Saya benar tetapi tidak tanpa 23 byte petunjuk serius dari @ Pietu1998. Terimakasih banyak!

i,z=input(),0;m=['']*10;n=m[:]
for x in range(11):m[x-1],n[x-1]=('(.,.)',' '*5,'( : )','_'*5)[x in i::2]
for y in 10,6,3,1:
 for q in m,n:print' '*3*z+' '.join(q[y-4+z:y])
 z+=1

Cobalah online!

Mengambil input sebagai daftar bilangan bulat. Terlalu besar di 248 tapi berhasil.

ElPedro
sumber
Mari kita lanjutkan diskusi ini dalam obrolan .
PurkkaKoodari
6

C # 233 221 213 203 byte

Metode mengambil array int sebagai daftar pin yang jatuh

string S(int[]a){string o="",x=o,y=o,z=o;for(int i=10;i>0;){var c=a.Contains(i);x=(c?"      ":"(.,.) ")+x;y=(c?"_____ ":"( : ) ")+y;if(i==7|i<5&i--!=3){o+=$"{z}{x}\n{z}{y}\n";x=y="";z+="   ";}}return o;}

terbungkus

string S(int[]a){string o="",x=o,y=o,z=o;for(int i=10;i>0;)
{var c=a.Contains(i);x=(c?"      ":"(.,.) ")+x;y=(c?"_____ ":
"( : ) ")+y;if(i==7|i<5&i--!=3){o+=$"{z}{x}\n{z}{y}\n";x=y="";
z+="   ";}}return o;}

diperluas

string S(int[] a)
{
    string o = "", x = o, y = o, z= o;
    for (int i = 10; i > 0;)
    {
        var c = a.Contains(i);
        x = (c ? "      " : "(.,.) ") + x;
        y = (c ? "_____ " : "( : ) ") + y;

        if (i==7|i<5&i--!=3)
        {
            o += $"{z}{x}\n{z}{y}\n";
            x = y = "";
            z += "   ";
        }
    }
    return o;
}

menjatuhkan beberapa byte oleh saran dalam komentar dari Ghost, raznagul dan auhmaan.

Erresen
sumber
2
Selamat datang di PPCG!
AdmBorkBork
bagus! Anda dapat menyimpan beberapa byte (5?) Jika Anda meletakkan i-- di dalam for dan mengubah new[]{7,4,2,1}.Contains(i--)kei<9&&i%3==1||i==2
Ghost
Dapat memperbaikinya dengan dua lagi (untuk -7) dengani==7||i<5&&i!=3
Ghost
@ Terima kasih tuan! merobohkannya lebih sedikit dengan menggunakan non-shortcurcuit ors and ands, dan masih menurun dengan ref akhir ke ii==7|i<5&i--!=3
Erresen
Anda dapat menyimpan beberapa byte dengan menggantinya var o="";var x=...dengan string o="",x=""....
raznagul
5

Batch, 262 byte

@echo off
for /l %%i in (1,1,10)do set s%%i=( : ) 
for %%i in (%*)do set s%%i=_____ 
set l=call:l 
%l%%s7%%s8%%s9%%s10%
%l%"   %s4%%s5%%s6%
%l%"      %s2%%s3%
%l%"         %s1%
exit/b
:l
set s=%~1
set s=%s:( : )=(.,.)%
echo(%s:_____=     %
echo(%~1

Catatan: Baris 2, 3 dan 4 berakhir di spasi, dan juga menampilkan spasi tambahan di setiap baris. Ini dapat dihapus dengan biaya 5 byte. Bekerja dengan membuat variabel s1 ... s10 sebagai bagian bawah manusia salju, lalu meratakan yang diberikan sebagai argumen baris perintah. Baris yang sesuai dicetak dua kali, pertama kali dengan bagian bawah diganti dengan bagian atas. Ini menghemat 18 byte daripada menggunakan dua set variabel atas dan bawah setengah.

Neil
sumber
1
Itu jawaban yang licin.
AdmBorkBork
4

JavaScript, 154 149 byte

f=
a=>`6 7 8 9
_3 4 5
__1 2
___0
`[r='replace'](/\d|_/g,m=>++m?~a.indexOf(m)?'_____':'( : )':'   ')[r](/.*\n?/g,m=>m[r](/ : |_/g,s=>s=='_'?' ':'.,.')+m)


I.oninput=()=>O.innerHTML=f(JSON.parse(`[${I.value.match(/\d+/g)}]`))
I.oninput()
<input id=I value="1 3 5 6 9 10"><pre id=O>

Washington Guedes
sumber
3

Pyth, 63 byte

j.ejm+**3k;j;db)_CcR[1 3 6).e:*T]btMQ@m*T]*5d,d\_kc2"(.,.)( : )

Program yang mengambil input dari daftar bilangan bulat dan mencetak hasilnya.

Suite uji

[Penjelasan datang nanti]

TheBikingViking
sumber
3

Pyth, 51 byte

Kode ini mengandung beberapa unsintables, jadi ini adalah xxdhexdump.

00000000: 6a6d 2e5b 3233 5f6a 3b6d 4063 323f 7d6b  jm.[23_j;m@c2?}k
00000010: 5172 2235 2035 5f22 392e 2220 3b5b 8db2  Qr"5 5_"9." ;[..
00000020: 1778 a822 6472 4673 4d50 4253 2d34 2f64  .x."drFsMPBS-4/d
00000030: 323b 38                                  2;8

Cobalah online.

Tanpa unsintables, 52 byte

jm.[23_j;m@c2?}kQr"5 5_"9").,.() : ("drFsMPBS-4/d2;8

Cobalah online.

PurkkaKoodari
sumber
2

Javascript 178 169 byte

Pada dasarnya sebuah port dari jawaban C # saya.

Mengambil array int sebagai daftar "pin" yang diratakan;

f=a=>{o=x=y=z="";for(i=10;i>0;){c=a.includes(i);x=(c?"      ":"(.,.) ")+x;y=(c?"_____ ":"( : ) ")+y;if(i==7|i<5&i--!=3){o+=z+x+"\n"+z+y+"\n";x=y="";z+= "   ";}}return o}

Terbungkus:

f=a=>{o=x=y=z="";for(i=10;i>0;){c=a.includes(i);
x=(c?"      ":"(.,.) ")+x;y=(c?"_____ ":"( : ) ")+y;
if(i==7|i<5&i--!=3){o+=z+x+"\n"+z+y+"\n";x=y="";
z+= "   ";}}return o}

Diperluas & Dijelaskan:

// function f takes parameter a (an array of ints) 
f = a => {

    // four strings:
    // o: output
    // x: top row of snowmen
    // y: bottom row of snowmen
    // z: padding to indent the snowmen
    o = x = y = z = "";

    // loop from 10 to 1 (the pins)
    // remove the "afterthought" decrement - we can do that later
    for (i = 10; i > 0;) {

        // set the boolean c to whether the current pin has been flattened
        c = a.includes(i);

        // prefix x and y with the appropriate "sprite"
        // using a ternary if on c
        x = (c ? "      " : "(.,.) ") + x;
        y = (c ? "_____ " : "( : ) ") + y;

        // determine if we've reached the end of a row (i equals 7, 4, 2 or 1)
        // use non shortcircuit operators to save bytes and ensure we hit the final i, because...
        // we also decrement i here 
        // (we didn't do this in the for loop declaration to save a byte)
        if (i == 7 | i < 5 & i-- != 3) {

            // concatenate our rows x & y,
            // prefixing them with the padding z,
            // postfixing them with a newline
            o += z + x + "\n" + z + y + "\n";

            // reset x and y rows
            x = y = "";

            // increase our padding for next time
            z += "   ";
        }
    }

    // return our final string (no semicolon to save a byte)
    return o
}
Erresen
sumber