Schneemann-Bowling

29

(verwandt / inspiriert von: Eine Bowling-Formation zeichnen )

In den Wintermonaten ist es ein lustiger Zeitvertreib, mit einem großen Ball (wie einem Basketball) und winzigen Schneemannfiguren Schneemann-Bowling zu spielen. Lassen Sie uns dies in ASCII neu erstellen.

Jeder Schneemann besteht aus:

(.,.)
( : )

Hier ist die Ausrichtung der zehn Schneemann "Stifte"

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

Diese "Stifte" sind von 1bis 10als gekennzeichnet

7 8 9 10
 4 5 6
  2 3
   1

So weit, so normal. Im Gegensatz zum normalen Bowling werden die Schneemannstifte jedoch nur abgeflacht und nicht vollständig entfernt. Dies wird von jemandem durchgeführt, der den Schnee von Stiften, die getroffen wurden, manuell abflachen muss. Ein abgeflachter Schneemann wird durch _____(fünf Unterstriche) mit einem Leerzeichen darüber dargestellt. Hier ist ein Beispiel mit 1 3 5 6 9 10abgeflachten Stiften (was bedeutet, dass nur die 2 4 7 8Stifte übrig bleiben):

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

         _____

Eingang

  • Eine Liste von ganzen Zahlen von 1bis 10 in einem beliebigen geeigneten Format , die angibt, welche Stifte getroffen wurden und daher abgeflacht werden müssen.
  • Jede Nummer wird höchstens einmal angezeigt, und die Nummern können in beliebiger Reihenfolge (sortiert, unsortiert, absteigend sortiert) angegeben werden.
  • Die Eingabe hat garantiert mindestens eine Ganzzahl.

Ausgabe

Die resultierende ASCII-Grafikdarstellung der Schneemannstifte mit den richtigen abgeflachten Stiften.

Regeln

  • Führende oder nachfolgende Zeilenumbrüche oder Leerzeichen sind optional, sofern die Zeichen selbst korrekt ausgerichtet sind.
  • Es ist entweder ein vollständiges Programm oder eine Funktion zulässig. Bei einer Funktion können Sie die Ausgabe zurückgeben, anstatt sie zu drucken.
  • Fügen Sie nach Möglichkeit einen Link zu einer Online-Testumgebung hinzu, damit die Benutzer Ihren Code ausprobieren können!
  • Standardlücken sind verboten.
  • Dies ist daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Byte) gewinnt.

Beispiele

1 3 5 6 9 10

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

         _____

1 2 3

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

      _____ _____

         _____

1 2 3 4 5 6 8 9 10

(.,.)
( : ) _____ _____ _____

   _____ _____ _____

      _____ _____

         _____
AdmBorkBork
quelle
18
Code Golf ? Nicht Code Bowling ?
Mark
Können wir die indizierten Eingabenummern von 0 nehmen? Und wenn möglich, nehmen Sie die Eingabewerte ohne Leerzeichen wie 0123456789 anstelle von 1 2 3 4 5 6 7 8 9 10?
Teal
Perfect: D Ermöglicht es mir, einen einfacheren Versuch im> <>
Teal
4
Ich bin nicht damit einverstanden, Schneemänner platt zu machen.
Ich identifiziere mich als Schneemann und finde diese Abflachung.
Conquistador

Antworten:

7

05AB1E , 45 44 Bytes

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

Probieren Sie es online!

Erläuterung

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
quelle
46

Schneemann 1.0.2 , 157 Bytes

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

Probieren Sie es online!

Als ich diese Herausforderung sah, wusste ich, dass ich nur in der perfekten Sprache antworten musste ...

Dies ist eine Unterroutine, die Eingaben als Array von Zahlen und Ausgaben als Zeichenfolge über den aktuellen Permavar akzeptiert.

Eingewickelt für "Lesbarkeit" / Ästhetik:

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

Leicht ungolfed / kommentierte Version:

}
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
Türknauf
quelle
17
Ziemlich der einzige Kontext, der als "die perfekte Sprache" bekannt sein wird: P
DJMcMayhem
2
Ein Schneemann tötet seine eigene Art ... Du Monster!
RudolfJelin
10

gestapelt , nicht konkurrierend, 118 Bytes

deepmapNach dieser Herausforderung fügte ich einige weitere Dinge hinzu , zusammen mit Tonnen von Bugfixes. Probieren Sie es hier aus!

@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

Ungolfed

{ 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

Ausgabe:

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

      _____ _____ 

         _____ 
Conor O'Brien
quelle
Diese Sprache sieht gut aus. Das Fisher-Yates-Beispiel im Wiki ist wunderschön.
Jordanien
@Jordan vielen Dank! das bedeutet mir sehr viel :)
Conor O'Brien
7

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

-5 danke an @Rod

-15 Nochmals danke an Rod

-1 mit Raumberechnung wieder von Rod

Sieht länger aus, da mehr Zeilen und Einrückungen vorhanden sind, ist aber überraschenderweise 11 Byte kürzer.

Ich bin sicher, das wird unter 200 gehen ...

Ich hatte recht, aber nicht ohne 23 Bytes wert von ernsthaften Hinweisen von @ Pietu1998. Danke vielmals!

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

Probieren Sie es online!

Nimmt die Eingabe als Liste von ganzen Zahlen. Bei 248 viel zu groß, aber es funktioniert.

ElPedro
quelle
Lassen Sie uns diese Diskussion im Chat fortsetzen .
PurkkaKoodari
6

C # 233 221 213 203 Bytes

Methode nimmt ein Int-Array a als die Liste der gefallenen Pins

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

eingewickelt

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

erweitert

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

Einige Bytes durch Vorschläge in Kommentaren von Ghost, Rasnagul und Auhmaan abgeschlagen.

Erresen
quelle
2
Willkommen bei PPCG!
AdmBorkBork
nett! Sie können ein paar Bytes (5?) Sparen, wenn Sie das i-- in das for setzen und um new[]{7,4,2,1}.Contains(i--)i<9&&i%3==1||i==2
Ghost
Kann das miti==7||i<5&&i!=3
Ghost
@ Ghost danke! Wirft es ein bisschen mehr um, indem wir nicht-kurzgeschlossene ors und ands verwenden, und dekrementiert immer noch mit dem finalen i==7|i<5&i--!=3
Referenzeffekt
Sie können einige Bytes einsparen, var o="";var x=...indem Sie durch ersetzen string o="",x=""....
Raznagul
5

Batch, 262 Bytes

@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

Hinweis: Die Zeilen 2, 3 und 4 enden in einem Leerzeichen und geben in jeder Zeile ein Leerzeichen nach. Diese können zu einem Preis von 5 Byte entfernt werden. Erstellt die Variablen s1 ... s10 als untere Hälfte der Schneemänner und reduziert dann die als Befehlszeilenargumente angegebenen. Die entsprechenden Reihen werden zweimal gedruckt, wobei die unteren Hälften zum ersten Mal durch die oberen Hälften ersetzt werden. Dies spart 18 Bytes bei Verwendung von zwei Sätzen von Variablen in der oberen und unteren Hälfte.

Neil
quelle
1
Das ist eine kluge Antwort.
AdmBorkBork
4

JavaScript, 154 149 Bytes

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
quelle
3

Pyth, 63 Bytes

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

Ein Programm, das eine Liste von ganzen Zahlen eingibt und das Ergebnis ausgibt.

Testsuite

[Erklärung kommt später]

TheBikingViking
quelle
3

Pyth, 51 Bytes

Der Code enthält einige nicht druckbare Dateien. Hier ist also ein 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

Probieren Sie es online aus.

Ohne unprintables 52 Bytes

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

Probieren Sie es online aus.

PurkkaKoodari
quelle
2

Javascript 178 169 Bytes

Im Wesentlichen ein Port aus meiner C # Antwort.

Nimmt ein int-Array als Liste abgeflachter "Pins";

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}

Gewickelt:

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}

Erweitert und erklärt:

// 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
quelle