Lass uns Mölkky spielen!


33

Mölkky

Mölkky ist ein finnisches Wurfspiel. Die Spieler benutzen eine Holznadel (auch "mölkky" genannt), um mit der Wurfnadel, die mit Nummern von 1 bis 12 gekennzeichnet ist, Holznadeln mit fast ähnlichen Abmessungen umzuwerfen. Die Ausgangsposition der Nadeln ist wie folgt:

   (07)(09)(08)
 (05)(11)(12)(06)
   (03)(10)(04)
     (01)(02)

Diese Beschreibung und die folgenden Regeln basieren auf Wikipedia .

Vereinfachte Mölkky-Regeln

  1. Wenn Sie einen Pin umwerfen, wird die Anzahl der auf dem Pin markierten Punkte gewertet.

  2. Wenn Sie 2 oder mehr Stifte umwerfen, erhalten Sie die Anzahl der umgeworfenen Stifte (z. B. wenn Sie 3 Stifte umwerfen, erhalten Sie 3 Punkte).

  3. Ziel des Spiels ist es, genau 50 Punkte zu erreichen . Wenn Sie mehr als 50 Punkte erzielen, wird dies bestraft, indem Sie die Punktzahl auf 25 zurücksetzen.

  4. Für diese Herausforderung nehmen wir an, dass sich die Stifte immer in der oben beschriebenen genauen Reihenfolge befinden. (In einem echten Spiel werden die Stifte nach jedem Wurf an der Stelle, an der sie gelandet sind, wieder aufgerichtet.)

Alle anderen Mölkky-Regeln werden ignoriert und nur ein einzelner Spieler wird berücksichtigt.

Eingang

Eine nicht leere Liste von Listen mit 12 Booleschen Werten. Jede Liste von Booleschen Werten beschreibt das Ergebnis eines Wurfs: 1, wenn die Nadel umgeworfen wurde, und 0, wenn dies nicht der Fall ist . Die Booleschen Werte werden in der genauen Reihenfolge der Stifte von links oben nach rechts unten angegeben: 7 , 9 , 8 , 5 , 11 , 12 , 6 , 3 , 10 , 4 , 1 , 2 .

Ausgabe

Die Punktzahl nach allen in der Eingabe beschriebenen Würfen, berechnet nach den Regeln 1 , 2 und 3 .

Ausführliches Beispiel

Betrachten wir die folgende Eingabe:

// 07 09 08 05 11 12 06 03 10 04 01 02
[ [ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 ],  // scores 5 (rule #1)
  [ 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 ],  // scores 2 (rule #2), total: 7
  [ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 ],  // scores 7, total: 14
  [ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 ],  // scores 12, total: 26
  [ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 ],  // scores 12, total: 38
  [ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ],  // scores 11, total: 49
  [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],  // scores 7, total: 56 -> 25 (rule #3)
  [ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] ] // scores 2, total: 27

Die erwartete Ausgabe ist 27 .

Herausforderungsregeln

  • Sie können Eingaben in jedem vernünftigen Format vornehmen. Anstelle von Listen mit Booleschen Werten können Sie Ganzzahlen verwenden, bei denen das höchstwertige Bit Pin 7 und das niedrigstwertige Bit Pin 2 ist. In diesem Format würde das obige Beispiel als übergeben [ 256, 2304, 127, 64, 64, 128, 2048, 3072 ].
  • Die Eingabeliste kann Würfe enthalten, bei denen überhaupt keine Nadel umgeworfen wird. In diesem Fall wird die Punktzahl unverändert gelassen.
  • Sie haben nichts Besonderes zu tun, wenn die Punktzahl genau 50 Punkte erreicht. Sie können jedoch davon ausgehen, dass kein weiterer Wurf folgen wird, wenn dies geschieht.
  • Das ist , also gewinnt die kürzeste Antwort in Bytes.

Testfälle

Verwenden von Ganzzahllisten als Eingabe:

[ 0 ] --> 0
[ 528 ] --> 2
[ 4095 ] --> 12
[ 64, 0, 3208 ] --> 16
[ 16, 1907, 2048 ] --> 18
[ 2023, 2010, 1, 8 ] --> 29
[ 1726, 128, 35, 3136, 1024 ] --> 34
[ 32, 32, 2924, 2, 256, 16 ] --> 28
[ 64, 64, 2434, 1904, 3251, 32, 256 ] --> 25
[ 3659, 2777, 2211, 3957, 64, 2208, 492, 2815 ] --> 25
[ 2047, 1402, 2, 2599, 4, 1024, 2048, 3266 ] --> 50
[ 256, 2304, 127, 64, 64, 128, 2048, 3072 ] --> 27
[ 16, 8, 128, 1, 2048, 1, 2048, 513, 8, 3206 ] --> 30

Sie können diesem Link folgen , um diese Testfälle im Booleschen Format abzurufen.


5
Coole Herausforderung und auch ein tolles Spiel im Sommer für diejenigen von euch, die es noch nicht ausprobiert haben - funktioniert hervorragend zusammen mit einem Grill.
Nit

2
@Nit Danke. :) Ich muss gestehen, dass ich dieses Spiel bis heute nicht gekannt habe. Ich habe heute Nachmittag Leute beim Spazierengehen in einem Park spielen sehen. Jetzt möchte ich es versuchen.
Arnauld

Antworten:


7

Python 2 , 126 111 108 104 Bytes

-3 Bytes dank Jonathan Allan

-4 Bytes dank Kaya!

f=lambda A,t=0:t>50and f(A,25)or A and f(A[1:],t-~(sum(A[0])-1or 762447093078/12**A[0].index(1)%12))or t

Probieren Sie es online!

Definiert eine rekursive Funktion, die ein 2D-Array mit 1 und 0 verwendet und einen ganzzahligen Wert zurückgibt. Nichts Besonderes an der Konstruktion, und ich bin sicher, es gibt eine einfachere Lösung.

Erläuterung:

f=lambda A,t=0:    #Define the function, initialising t to 0 on the first iteration
               t>50and f(A,25)      #If t>50 then iterate again with t=25
                              or    #Else
               A and                #If A exists
                     f(A[1:],       #Iterate again without the first list of A
                        t-~         #And add to t, either
                           (sum(A[0])-1   #The sum of all elements if that's not 1
                                         or
                           762447093078/12**A[0].index(1)%12   #Else the appropriate pin value (black magic!)
               or t       #Finally, if A is finished, just return t

(0x103925BA4786>>4*A[0].index(1))%16speichert 1 Charakter gegenord('GIHEKLFCJDAB'[A[0].index(1)])-65
Kaya

1
Ein bisschen optimaler:762447093078/12**A[0].index(1)%12
Kaya

Das Zeug sieht für mich aus wie schwarze Magie! Vielen Dank @ Kaya!
Jo King

1
Das ist nur die Codierung mit Basis 12
7.

6

Gelee , 25 Bytes

“ñ€bḷ’œ?TLḢṖ?µ€+25¹>?50ɗ/

Eine monadische Verknüpfung, die eine Liste mit Einsen und Nullen (jeweils mit einer Länge von 12) akzeptiert und eine Ganzzahl zurückgibt.

Probieren Sie es online! Oder sehen Sie sich die Testsuite an (unter Verwendung der im OP angegebenen Integer-Werte)

Wie?

Diese Lösung verwendet,, œ?das mit einer Nummer n versehen ist und eine Liste die n- te lexikographische Permutation der Liste findet, wobei die Liste die Sortierreihenfolge definiert. Zuerst müssen wir Folgendes herausfinden n:

 index:  1  2  3  4  5  6  7  8  9 10 11 12
 value:  7  9  8  5 11 12  6  3 10  4  1  2   (as defined by the question)
     P: 11 12  8 10  4  7  1  3  2  9  5  6   (our permutation lookup array)

... dh Pat index iwird auf den ursprünglichen Index des Werts gesetzt i.
Dies Phat einen lexikographischen Index von 438.337.469 (das heißt, wenn Sie alle nehmen 12! Permutationen der Zahlen 1 zu 12 und sortierten sie lexikografisch, die 438.337.469 th wären P).
Dies kann unter Verwendung von Jellys Œ¿Atom gefunden werden .
Beide Schritte können mit dem Jelly-Programm gleichzeitig ausgeführt werdenĠŒ¿

“ñ€bḷ’œ?TLḢṖ?µ€+25¹>?50ɗ/ - Link: list of lists of zeros and ones
             µ€           - perform the monadic chain to the left for €ach list:
“ñ€bḷ’                    -   base 250 number = 438337469
      œ?                  -   nth permutation (reorder the 1s and 0s to their pin values)
        T                 -   truthy indices (get the pin values of the 1s)
            ?             -   if...
           Ṗ              -   ...condition: pop (length greater than 1 ?)
         L                -   ...then: length (the number of pins)
          Ḣ               -   ...else: head (the first (& only) pin value)
                        / - reduce the resulting list of integers with:
                       ɗ  -   last three links as a dyad:
               +          -     addition (add the two values together)
                     50   -     literal fifty
                    ?     -     if...
                   >      -     ...condition: greater than (sum greater than 50 ?)
                25        -     ...then: literal twenty-five
                  ¹       -     ...else: identity (do nothing - just yield the sum)

Ich denke, dass Ihre Erklärung, den passenden lexikografischen Index unter allen Permutationen zu finden, es wert wäre, als Tipp für Jelly hinzugefügt zu werden . (Das letzte Mal, als ich das machen musste, habe ich eine manuelle dichotomische Suche durchgeführt, die für kurze Sequenzen nicht so lang ist , aber ... irgendwie mühsam. ^^)
Arnauld

LOL; Ich hatte genau die gleiche Lösung, mit Ausnahme von zwei verschiedenen Bytes: -> , µ-> Ʋ. Jelly würde wirklich profitieren einen argumentlose Link als acceppting ¡‚s <link>(erstes Argument), mit der Ausnahme , dass, wenn auf die sehr des Programms starten, halten Sie die Spezial-Gehäuse Verhalten.
Erik der Outgolfer

... und ich habe beides fast benutzt!
Jonathan Allan


4

Pyth, 51 48 38 Bytes

VQI>=+Z?qJsN1@.PC"îO&"S12xN1J50=Z25;Z

Dank Jonathan Allan 10 Bytes gespart Nimmt Eingaben als Liste von Listen von Booleschen Werten entgegen.
Probieren Sie es hier aus

Erläuterung

VQI>=+Z?qJsN1@.PC"îO&"S12xN1J50=Z25;Z
VQ                                  ;     For each input...
    =+Z                                   ... add to the total...
       ?q sN1                             ... if one pin is down...
             @.PC"îO&"S12xN1              ... the score of that pin.
         J                    J           ... otherwise, the count.
  I>                           50         If we pass 50...
                                 =Z25     ... reset to 25.
                                     Z    Output the total.

Nicht sicher , wie es in das Programm genau das zu bekommen, aber es sollte 6 oder 7 Bytes speichern , wenn Sie können ... 7tT8h4hT12h5h2T4h02-> .PC"îO&"S12- verwendet lexikographische Permutation Indizierung wie meine Jelly Antwort. (Der Code hat ein nicht druckbares Byte 0x0F am Anfang der Zeichenfolge.)
Jonathan Allan

))kann sein;
Jonathan Allan

4

05AB1E , 29 28 Bytes

v•CÞŸαLć•13вyOΘmyÏOO25‚¬50›è

Probieren Sie es online!

Erläuterung

v                              # for each boolean list in input
 •CÞŸαLć•                      # push 13875514324986
         13в                   # convert to a list of base-13 numbers
            yO                 # push the sum of y
              Θm               # truthify and raise the pin-list to this number (0 or 1)
                yÏ             # keep those which are true in the current list
                  OO           # sum the list and the stack
                    25‚        # pair with 25
                       ¬50›    # check if the first number is larger than 50
                           è   # index into the pair with this result

4

Perl 5 , 74, 70 Bytes

$\+=y/1//-1||/1/g&&(0,6,8,7,4,10,11,5,2,9,3,0,1)[pos];$\=25if++$\>50}{

Probieren Sie es online!

Übernimmt die Eingabe als eine Reihe von durch Zeilenumbrüche getrennten Bitstrings.


3

Haskell , 96 Bytes

foldl(\s a->([s..50]++e)!!sum(last$zipWith(*)[7,9,8,5,11,12,6,3,10,4,1,2]a:[a|sum a>1]))0
e=25:e

Probieren Sie es online!

Die Umhüllung ist clever: Ich indexiere im Wesentlichen an der Position s+sum(…)in der Liste ([0..50]++cycle[25]). Ein kürzerer Weg zum Schreiben ist jedoch die Indizierung an Position sum(…)und der Beginn der Liste an s.


3

Java 10, 131 130 129 Bytes

m->{int r=0,i,s,t;for(var a:m){for(i=s=t=0;i<12;s+=a[i++])t=a[i]>0?"    \n".charAt(i):t;r+=s<2?t:s;r=r>50?25:r;}return r;}

Enthält 10 nicht druckbare Elemente.
Eingabe als Ganzzahlmatrix aus Nullen und Einsen.

-1 Byte dank @JonathanFrech , der sich \tin eine aktuelle Registerkarte verwandelt (funktioniert in TIO, nicht in meiner lokalen IDE).

Probieren Sie es online aus.

Erläuterung:

m->{                // Method with integer-matrix parameter and integer return-type
  int r=0,          //  Result-integer, starting at 0
      i,s,t;        //  Temp integers
  for(var a:m){     //  Loop over the integer-arrays of the input
    for(i=s=t=0;    //   Reset `i`, `s` and `t` to 0
        i<12;       //   Loop `i` in the range [0,12)
        s+=a[i++])  //    Increase `s` by the current value (0 or 1)
      t=a[i]>0?     //    If the current value is 1:
         "  \n".charAt(i)
                    //     Set `t` to the score at this position
        :t;         //    Else: Leave `t` the same
    r+=s<2?         //   If only a single pin was hit:
        t           //    Add its score `t` to the result
       :            //   Else:
        s;          //    Add the amount of pins `s` to the result
    r=r>50?         //   If the result is now above 50
       25           //    Penalize it back to 25
      :r;}          //   If not, it stays the same
  return r;}        //  Return the result

Ich denke, Sie können ein Byte speichern, indem Sie ein tatsächliches Tabulatorzeichen in verwenden "\t\n".
Jonathan Frech

@ JonathanFrech Hmm, scheint in der Tat in TIO zu arbeiten. Funktioniert nicht lokal in meiner IDE, aber wen interessiert das, denke ich.;)
Kevin Cruijssen

Wenn es irgendwo eine funktionierende Implementierung gibt, ist dies zulässig. : @
Jonathan Frech

2

Holzkohle , 43 Bytes

≔⁰ηFθ«≧⁺⎇⊖ΣιΣι⌕᧔$|#z⁸Ug⊗”⌕ι¹η¿›η⁵⁰≔²⁵η»Iη

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Übernimmt die Eingabe als boolesches Array. Erläuterung:

≔⁰η

Setzen Sie die Punktzahl auf 0.

Fθ«

Schleife über die Würfe.

⎇⊖Σι

Ist die Anzahl der Pins 1?

Σι

Wenn nicht, nehmen Sie die Anzahl der Stifte.

⌕᧔$|#z⁸Ug⊗”⌕ι¹

Andernfalls übersetzen Sie die Position des Stifts in einen Wert.

≧⁺...η

Fügen Sie es der Kerbe hinzu.

¿›η⁵⁰≔²⁵η

Wenn die Punktzahl 50 überschreitet, setzen Sie sie auf 25 zurück.

»Iη

Drucken Sie das Endergebnis nach allen Würfen.


2

Haskell , 110 Bytes

m s|sum s==1=sum$zipWith(*)[7,9,8,5,11,12,6,3,10,4,1,2]s|1>0=sum s
f l=foldl(\b->c.(b+).m)0l
c a|a>50=25|1>0=a

Gleiche Länge: f l=foldl(\b a->last$b+m a:[25|b+m a>50])0lstatt fundc

Probieren Sie es online!


Löschen Sie das Argument l in f für 3 Bytes. f=foldl(\b->c.(b+).m)0
aoemica

2

Schale , 47 35 Bytes

-12 Bytes dank H.PWiz (bessere Methode zum Generieren der Listenkodierungspunkte )!

F₅0
S?25>50+?←Lε`f`+Nm+3d4652893071

Probieren Sie es online!

Erläuterung

F₅0  -- input is a list of boolean lists
F    -- left fold by
 ₅   -- | the function flipped (overflowing label) on line 1
  0  -- | with initial value 0

S?25>50+?←Lε`f`+Nm+3d4652893071  -- example inputs: [0,0,0,1,0,0,0,0,0,0,0,0] 0
                     4652893071  -- integer literal: 4652893071
                    d            -- digits: [4,6,5,2,8,9,3,0,7,1]
                 m+3             -- map (+3): [7,9,8,5,11,12,6,3,10,4]
              `+N                -- append natural numbers: [7,9,8,5,11,12,6,3,10,4,1,2,3,...
            `f                   -- filter this list by argument: [5]
        ?  ε                     -- if it's of length 1
         ←                       -- | take first
          L                      -- | else the length
                                 -- : 5
       +                         -- add to argument: 5
 ?  >50                          -- if the value is > 50
  25                             -- | then 25
S                                -- | else the value
                                 -- : 5

Wie wäre es m+3d4652893071?
H.PWiz

1

Rot , 189 172 Bytes

func[b][s: 0 foreach c b[d: 0 foreach e c[if e = 1[d: d + 1]]i: find c 1
n: either i[pick[7 9 8 5 11 12 6 3 10 4 1 2]index? i][0]if 50 < s: s + either 1 < d[d][n][s: 25]]s]

Probieren Sie es online!

Erklärung des ungolfed Codes:

f: func[b][                                            ; a block of blocks of booleans
    s: 0                                               ; sets sum to 0
    foreach c b[                                       ; for each row of booleans 
        d: 0 foreach e c[if e = 1[d: d + 1]            ; count the number of 1s         
        i: find c 1                                    ; the index of the first 1
        n: either i[pick [7 9 8 5 11 12 6 3 10 4 1 2]  ; if there is 1, pick the number
                    index? i][0]                       ; at the index of 1
                                                       ; otherwise 0  
        if 50 < s: s + either 1 < d[d][n][s: 25]       ; if there is only one 1, add 
                                                       ; the number to the sum, otherwise
                                                       ; the number of 1s 
                                                       ; if the sum > 50, reset it to 25 
    ]
    s                                                  ; return the sum 
]

1

JavaScript (ES6), 98 Byte

a=>a.map(b=>b.map((m,i)=>(c+=m,d+=m*('0x'+'7985bc63a412'[i])),c=d=0)|(t+=c>1?c:d)>50?t=25:0,t=0)|t

Testfälle:


Gleiche Größe (und sehr ähnlich) wie meine Referenzimplementierung . :)
Arnauld

Achso cool. Ich freue mich, wenn ich Ihrer Codegröße entsprechen kann. Es ist nur einmal in einem blauen Mond, dass ich es schlagen kann :)
Rick Hitchcock

0

Stax , 37 Bytes

├T<↓"♥←~;▌6»≥øF←î5░U╚_π○Q▒<│∟└ù║pε♀▀æ

Führen Sie es aus und debuggen Sie es

Probieren Sie es online!

Erläuterung

F:1"=EA5MQ9-I1%)"!s@c%1={h+}{%+}?c50>{d25}{}?    # Full program, unpacked

F                                                # Loop through every element
 :1                                              # Get indices of truthy elements
   "=EA5MQ9-I1%)"!                               # Push encoded [7,9,8,5,11,12,6,3,10,4,1,2]
                 s@                              # Swap the top 2 elements of stack and get elements at indexes
                   c%1=                          # Copy the top element, get length of array, compare to length of 1
                       {h+}{%+}?                 # If it has length of 1, add the element, otherwise add the length of the array to total
                                 c50>            # Compare total to 50, 
                                     {d25}{}?    # If it is greater, pop it off and push 25 to reset counter, otherwise do nothing

Nicht meine beste Arbeit, aber es funktioniert. Ich bin mir sicher, dass ich etwas vermisse, um es ein bisschen kürzer zu machen.


0

Python 2 , 109 105 103 Bytes

c=0
for l in input():a=sum(l);c+=int('7985bc63a412'[l.index(1)],16)if a==1else a;c=(25,c)[c<51]
print c

Probieren Sie es online!

Alternative ohne rekursive Funktion.

-2 mit Dank an @ Jo King


Sie können die Klammern um das String-Literal entfernen
Jo King
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.