Боулінг сніговика


29

(пов'язане / натхнене: Намалюйте форму для боулінгу )

Веселим проведенням зимових місяців тут є проведення боулінгу сніговика, використовуючи великий м'яч (як баскетбол) та крихітні фігурки сніговика. Давайте відтворимо це в ASCII.

Кожен сніговик складається з наступного:

(.,.)
( : )

Ось вирівнювання десяти "шпильок" сніговика

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

Ці «контакти» маркуються від 1до , 10як

7 8 9 10
 4 5 6
  2 3
   1

Поки що, так стандартно. Однак, на відміну від звичайного боулінгу, шпильки сніговика просто сплющені і не повністю зняті. Це робиться тим, хто потребує вручну вирівняти сніг будь-яких шпильок, які були вражені. Уплощений сніговик представлений _____(п'ятьма підкресленнями) з пробілами вгорі. Ось приклад із 1 3 5 6 9 10випрямленими шпильками ( маючи на увазі лише 2 4 7 8штифти):

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

         _____

Вхідні дані

  • Список цілих чисел від 1до 10 будь-якого зручного формату, який представляє, які штифти були вражені, і тому їх потрібно вирівняти.
  • Кожне число відображатиметься не більше одного разу, і номери можуть бути в будь-якому порядку (відсортовано, несортовано, відсортовано за убуванням) - ваш вибір, незалежно від того, що робить ваш гольфіст коду.
  • Гарантоване вхід має принаймні одне ціле число.

Вихід

Отримане в зображенні ASCII мистецтво шпильок сніговика з правильними шпильками сплющене.

Правила

  • Провідні чи кінцеві рядки чи пробіли - це необов’язково, до тих пір, поки самі символи правильно вишикуються.
  • Прийнятна або повна програма, або функція. Якщо функція, ви можете повернути вихід, а не надрукувати його.
  • Якщо можливо, додайте посилання на онлайн-тестувальне середовище, щоб люди могли спробувати ваш код!
  • Стандартні лазівки заборонені.
  • Це тому діють усі звичайні правила гольфу, і найкоротший код (у байтах) виграє.

Приклади

1 3 5 6 9 10

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

         _____

1 2 3

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

      _____ _____

         _____

1 2 3 4 5 6 8 9 10

(.,.)
( : ) _____ _____ _____

   _____ _____ _____

      _____ _____

         _____

18
Код гольфу ? Не боулінг коду ?
Марк

Чи можемо ми взяти вхідні числа, індексовані від 0? І по можливості візьміть вхідні значення без пробілів, таких як 0123456789 замість 1 2 3 4 5 6 7 8 9 10?
Тілі пелікан

Ідеально: D, це дозволяє мені зробити більш легку спробу в <<
Тілі пелікана

4
Я не схвалюю сплющування сніговиків.

я ідентифікую себе як сніговика і знаходжу це сплощення.
конкістадор

Відповіді:


7

05AB1E , 45 44 байт

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

Спробуйте в Інтернеті!

Пояснення

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

46

Сніговик 1.0.2 , 157 байт

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

Спробуйте в Інтернеті!

Побачивши цей виклик, я зрозумів, що просто повинен відповісти ідеальною мовою ...

Це підпрограма, яка приймає введення як масив чисел і виводить як рядок через поточну permavar.

Обгорнутий для "читабельності" / естетики:

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

Трохи невольф / коментований варіант:

}
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

17
Насправді єдиний контекст, який буде відомий як «ідеальна мова»
,:

2
Сніговик вбиває свого роду ... Ти чудовисько!
РудольфДжелін

10

укладається , неконкурентний, 118 байт

deepmapПісля цього виклику я додав і ще декілька речей, а також безліч помилок. Спробуйте тут!

@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

Безумовно

{ 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

Вихід:

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

      _____ _____ 

         _____ 

Ця мова виглядає чудово. Приклад Фішера-Йейта у вікі прекрасний.
Йорданія

@Jordan дуже дякую! це для мене дуже багато означає
Conor O'Brien

7

Пітон 2, 248 243 241 226 224 223 221 210 206 200 177 байт

-5, завдяки @Rod

-15 знову завдяки Роду

-1, використовуючи обчислення простору знову від Rod

Виглядає довше через більше рядків і відступів, але на диво на 11 байт коротше.

Я впевнений, що це піде за 200 ...

Я мав рацію, але не без серйозних підказок від @ Pietu1998, варті 23 байти. Велике дякую!

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

Спробуйте в Інтернеті!

Вводиться як список цілих чисел. Шлях занадто великий у 248, але він працює.



6

C # 233 221 213 203 байт

метод приймає масив int a як список упалих штифтів

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

загорнутий

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

розширений

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

збив кілька байт пропозиціями в коментарях від Ghost, raznagul і auhmaan.


2
Ласкаво просимо до PPCG!
AdmBorkBork

приємно! Ви можете зберегти кілька байтів (5?), Якщо поставити i-- у "for" та змінити new[]{7,4,2,1}.Contains(i--)наi<9&&i%3==1||i==2
Ghost

Можна покращити це ще двома (за -7) за допомогоюi==7||i<5&&i!=3
Ghost

@Ghost дякую! збив його трохи більше, використовуючи не-короткий струм ор-енди, і все ще декрементуючи з остаточним посиланням на ii==7|i<5&i--!=3
Ерресен

Ви можете зберегти кілька байт, замінивши var o="";var x=...на string o="",x=""....
raznagul

5

Пакетна, 262 байти

@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

Примітка. Рядки 2, 3 і 4 закінчуються пробілом, а також виводять простір у кожному рядку. Їх можна видалити вартістю 5 байт. Працює, створюючи змінні s1 ... s10 як нижню половину сніговиків, потім вирівнюючи ті, що задані як аргументи командного рядка. Відповідні рядки надрукуються двічі, перший раз із нижньої половинки замінюють верхньою половиною. Це економить 18 байт за допомогою двох наборів змінних верхньої та нижньої половини.


1
Це хитра відповідь.
AdmBorkBork

4

JavaScript, 154 149 байт

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>


3

Pyth, 63 байти

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

Програма, яка приймає введення списку цілих чисел і друкує результат.

Тестовий набір

[Пояснення, що надходить пізніше]


3

Pyth, 51 байт

Код містить деякі недруковані xxdверсії , тож ось шестнадцятковий.

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

Спробуйте в Інтернеті.

Без недрукованих версій, 52 байти

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

Спробуйте в Інтернеті.


2

Javascript 178 169 байт

По суті, порт з моєї відповіді C #.

Приймає масив int як список сплющених "шпильок";

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}

Загорнутий:

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}

Розширено та пояснено:

// 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
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.