Das Spiel der Siebener! Wer sagt was?

14

Das Spiel von Sevens wird wie folgt gespielt: Die nSpieler sitzen in einem Kreis und zählen von 1 nach links (oder von Spieler Azu Spieler B).

Wenn eine Zahl erreicht ist p, die ein 7ODER enthält, das durch teilbar 7ist, muss der Spieler, der die Nummer gesprochen hat p-1, nach dem nächsten Spieler psagen, p+1und die Reihenfolge der sprechenden Personen wird umgekehrt. Zum Beispiel, wenn der Spieler Bspricht 6, Csagt der Spieler 7, Bsagt 8und Asagt der Spieler 9.

Hinweis: Wenn eine Person eine Zahl vergisst (oder in der Version, in der sevensnicht gesagt wird, versehentlich a seven), werden sie aus dem Kreis gestrichen, aber wir werden dieses Detail bei dieser Herausforderung weglassen.

Die Herausforderung selbst besteht darin, die Zahlen zu drucken, die jeder Spieler in einem perfekten Sevens-Spiel sagen sollte, bis eine Eingabe mfür eine Eingabe erfolgtn .

Als ein Beispiel, in dem fünf Menschen, A, B, C, D, und Esind zu spielen , bis sie erreichen 30. Sie spielen auf diese Weise

A: 1 6 8 13    15 19       23    30
B: 2 7*  12    16 18       24
C: 3     11    17*         25
D: 4     10          21*   26 28*
E: 5      9 14*      20 22 27*29

wo sevenssind mit gekennzeichnet *. Beachten Sie, dass bei 27und 28, wir Umkehr zweimal, und das Spiel geht weiter „normal“ aus Dzu E.

Bitte beachten Sie, dass die Ausgabe nicht im obigen Format erfolgen muss. Ich habe es aus Gründen der Klarheit einfach so ausgedruckt.

Regeln

  • Die Eingabe besteht aus zwei Ganzzahlen in beliebiger Reihenfolge, mdie die letzte zu sagende nZahl darstellen und die Anzahl der Spieler darstellen.

  • Die Ausgabe kann aus mehreren Arrays oder mehreren Zeichenfolgen bestehen, eine für jeden Player. Wenn Sie Zeichenfolgen verwenden, müssen Sie keine Trennzeichen verwenden (wenn Sie jedoch einige in Ihren Codetests hinzufügen könnten, wären wir für die Lesbarkeit dankbar). Wenn man sie tatsächlich irgendwie im Kreis drucken kann, ist das auch akzeptabel, und es wäre auch ziemlich cool.

  • Die Ausgabe muss nicht angeben, welche Spieler welche sind (es ist ziemlich offensichtlich, dass der erste Spieler derjenige ist, der sagt 1). Wenn die Ausgabe jedoch aus irgendeinem Grund nicht sortiert ist, sollten Sie klarstellen, welcher Spieler welchen Satz von Zahlen spricht . Das Weglassen von Spielern, die nichts sagen, ist auch zulässig, wenn Sie klar machen, welche Spieler sprechen. Ich werde im Folgenden einige weitere Beispiele für mögliche Ausgaben hinzufügen.

  • Das ist Codegolf, also gewinnt die kleinste Anzahl von Bytes.

Wie immer, wenn das Problem unklar ist, lassen Sie es mich bitte wissen. Viel Glück und gutes Golfen!

Beispiele

>>> sevens_string(30, 5, " ")
'1 6 8 13 15 19 23 30'
'2 7 12 16 18 24'
'3 11 17 25'
'4 10 21 26 28'
'5 9 14 20 22 27 29'
>>> sevens_string(42, 5)
'16813151923303539'
'27121618243140'
'31117253241'
'410212628333742'
'591420222729343638'
>>> sevens_array(20, 3)
[1, 4, 7, 10, 13, 15, 19]
[2, 5, 9, 12, 16, 18]
[3, 6, 8, 11, 14, 17, 20]
>>> sevens_array(18, 10)
[1, 13, 15]
[2, 12, 16, 18]
[3, 11, 17]
[4, 10]
[5, 9]
[6, 8]
[7]
[]
[]
[14]
Sherlock9
quelle
Ich denke, eine nützlichere Ausgabe zum Zwecke der Visualisierung des Spielverlaufs wäre eine Liste von Spielern in der Reihenfolge ihres Verlaufs. (ZB mit 4 Spielern und maximal 15 Spielern 1 2 3 4 1 2 3 2 1 4 3 2 1 4 1.) Ich sage nicht, dass das in Bezug auf die Herausforderung besser oder schlechter ist: Nur, dass es in der realen Welt nützlicher wäre.
msh210
Können wir das Ergebnis als Matrix und Pad mit Nullen anzeigen?
Dennis
@Dennis Leere Arrays sollten aufbewahrt werden. Das Ergebnis kann eine mit Nullen aufgefüllte Matrix sein.
Sherlock9

Antworten:

2

Pyth, 38 Bytes

Jm[)EA,01VQa@JZ=hG=+Z=W|}\7`G!%G7H_H;J

Probieren Sie es online aus. Testsuite.

Grundsätzlich ein Port meiner Python-Antwort; Es gibt wahrscheinlich einen besseren Weg. Nimmt als Eingabe die Zahl, bis zu nder gezählt werden soll, und die Anzahl der Spieler pin separaten Zeilen, gibt das Ergebnis als zweidimensionales Array aus.

PurkkaKoodari
quelle
3

Haskell, 151 Bytes

s n|elem '7'(show n)||mod n 7==0=(0-)|0<1=id
a=scanl1(+)$map($1)$scanl(.)id$map s[1..]
f m n=mapM_ print[[x+1|x<-[0..m-1],mod(a!!x-1)n==i]|i<-[0..n-1]]
*Main> f 30 5
[1,6,8,13,15,19,23,30]
[2,7,12,16,18,24]
[3,11,17,25]
[4,10,21,26,28]
[5,9,14,20,22,27,29]
Damien
quelle
2
Wie wäre es mod n 7<1statt mod n 7==0und s<$>[1..]statt map s[1..]? Warum auch nicht print[]statt mapM_ print[]?
Michael Klein
2

Python 3, 155 Bytes

from turtle import*
def f(m,n,i=0,r=20,d=360):
 k=n
 while i<m:i+=1;fd(r);write(i);bk(r);e='7'[:i%7]in str(i);d*=1-2*e;k=~-e*(1-k)%n;r+=(k<1)*15;rt(d/n)

Verwendet Schildkrötengrafiken, um in einem Kreis zu drucken, sodass sich die vom selben Spieler gesprochenen Zahlen im selben Radius befinden. Der Radius des Kreises wird vergrößert, wenn die Richtung umgekehrt wird oder wenn die Sequenz um den Kreis herum verläuft, sodass vorherige Zahlen nicht überschrieben werden.

Beispielausgabe für f(22,6)

Bildbeschreibung hier eingeben

RootTwo
quelle
Oh, das ist schlau und hübsch. +1: D
Sherlock9
1

Python 2, 103 102 101 Bytes

def S(n,p):
 P=0;D=N=1;O=['']*p
 while n:O[P%p]+=`N`;D*=1-2*(N%7<1or'7'in`N`);N+=1;P+=D;n-=1
 print O

Definiert eine Funktion S(n,p), die die zu zählende Zahl nund die Anzahl der Spieler verwendet pund das Ergebnis als Array von Zeichenfolgen ausgibt.

>>> S(42,5)
['16813151923303539', '27121618243140', '31117253241', '410212628333742','591420222729343638']
PurkkaKoodari
quelle
1

Python 2, 91 90 87 Bytes

def f(m,n):a=d=i=0;r=[()]*n;exec"i+=1;r[a%n]+=i,;d^='7'[:i%7]in`i`;a+=1-2*d;"*m;print r

Gibt eine Liste mit Tupeln aus. Teste es auf Ideone .

Dennis
quelle
1

Jelly , 27 25 Bytes (nicht konkurrierend)

D;Æf7e
R’Ç€^\ḤC+\_'R}⁹ḍT€

Probieren Sie es online! oder überprüfen Sie alle Testfälle .

Dennis
quelle
warum ist das nicht konkurrierend
Bálint
Denn die Herausforderung ist ab Dezember 2015 und geht der Entstehung von Jelly voraus.
Dennis
Oh, danke für die Klarstellung!
Bálint
Ist das eine offizielle Regel? Ich überprüfe das Fragedatum nie mit dem Erfindungsdatum der Programmiersprache.
Thomas Weller
1

Dyalog APL, 50 47 35 Bytes

{,⌸⍵|+\0,¯1*+\{0=7|⍵×~7∊⍎¨⍕⍵}¨⍳⍺-1}

Dies zeigt die Zahlen, die jeder Spieler gesagt hat, als Tabelle an, wobei die erste Spalte die Spieler auflistet. Die Zeilen werden mit gepolsterten 0 s auf die gleiche Länge, und Zeilen ohne Zahlen weggelassen.

Nachprüfung

      f ← {,⌸⍵|+\0,¯1*+\{0=7|⍵×~7∊⍎¨⍕⍵}¨⍳⍺-1}
      30 f 5
0 1  6  8 13 15 19 23 30
1 2  7 12 16 18 24  0  0
2 3 11 17 25  0  0  0  0
3 4 10 21 26 28  0  0  0
4 5  9 14 20 22 27 29  0
      42 f 5
0 1  6  8 13 15 19 23 30 35 39
1 2  7 12 16 18 24 31 40  0  0
2 3 11 17 25 32 41  0  0  0  0
3 4 10 21 26 28 33 37 42  0  0
4 5  9 14 20 22 27 29 34 36 38
      20 f 3
0 1 4 7 10 13 15 19
1 2 5 9 12 16 18  0
2 3 6 8 11 14 17 20
      14 f 10
0  1 13
1  2 12
2  3 11
3  4 10
4  5  9
5  6  8
6  7  0
9 14  0

Beachten Sie, dass im letzten Beispiel 7 und 8 weggelassen werden, da diese Spieler noch nichts gesagt haben.

Dennis
quelle
1

Ruby, 81

->n,m{g=[""]*n
k=j=0
i=1
m.times{g[j%n]+=w="#{k+=1}"
j+=i=k%7<1||w[/7/]?-i :i}
g}

Ziemlich unkomplizierte Implementierung. Gibt eine hässliche glommed Zeichenfolge zurück (Sie können ein Leerzeichen hinzufügen, um es "#{k+=1} "... nun, eine Zeichenfolge mit Abstand zu machen ). Ich frage mich, ob es da draußen einen mathematischeren Algorithmus gibt.

Nicht dieser Charles
quelle
1

Faktor 172

Ich habe es länger geschafft als Haskell und so lesbar wie APL! Bekomme ich ein cookie

[| l! n! | 1 0 0 :> ( p! x! z! ) n iota [ 1vector ] map <circular> n! l iota [ 1 + z! z 7 mod 0 = 55 z 10 >base in? or -1 and 1 or p * p! z x n nth push x p + x! ] each n ]

Es ist ein Zitat (anonyme Funktion), das eine kreisförmige Folge von Vektoren ausgibt. Jeder Vektor beginnt mit der Nummer des Spielers und dann mit den Nummern, die diesem Spieler entsprechen.

30 5 [| l! n! | 1 0 0 :> ( p! x! z! ) n iota [ 1vector ] map <circular> n! l iota [ 1 + z! z 7 mod 0 = 55 z 10 >base in? or -1 and 1 or p * p! z x n nth push x p + x! ] each n ] call

Outputs:
T{ circular
    { seq
        {
            V{ 0 1 6 8 13 15 19 23 30 }
            V{ 1 2 7 12 16 18 24 }
            V{ 2 3 11 17 25 }
            V{ 3 4 10 21 26 28 }
            V{ 4 5 9 14 20 22 27 29 }
        }      ^ Note: first val is player number starting at 0
    }
}

Ich habe damit angefangen:

: game-of-7 ( last-num num-players -- {players:={numbers}} )
  1 1 set ! increment
  0 2 set ! current-index
  iota [ drop V{ } clone ] map <circular>
  swap iota
  [ 1 + ! iotas go 0 to n-1
    dup [ 7 mod 0 = ] [ 10 >base 55 swap in? ] bi or
    [ 1 get -1 * 1 set ] when
    over 2 get swap nth push
    2 get 1 get + 2 set
  ] each ;

das ist kein guter faktor code, aber viel klarer (ja, ich benutze da nummern als variablennamen, sieh mich nicht so an!).

fede s.
quelle
"Bekomme ich einen Keks?" Ja, das tust du.
Undichte Nonne
Wow, das war unerwartet! Ty, @LeakyNun: D
fede s.
Wow, ich liebe das! Verfluchen Sie die Verwendung von Zahlen als Bezeichner!
Katze
1
@cat Ich mag es eigentlich auf perverse Weise: P Aber Einheimische lösen das Längenproblem SYMBOL:viel besser: Ein-Buchstaben-Namen, und loswerden setund get!
fede s.
0

JavaScript (ES6) 100

Ergebnis als String-Array ohne Trennzeichen zurückgeben

(m,n)=>(d=>{for(r=[],p=i=0;i++<m;d=i%7&&!~(i+'').search(7)?d:n-d,p=(p+d)%n)r[p]=(r[p]||'')+i})(1)||r

Oder lesbarer, für 3 Bytes mehr, Ergebnis als Array von Arrays zurückgeben

(m,n)=>(d=>{for(r=[],p=i=0;i++<m;d=i%7&&!~(i+'').search(7)?d:n-d,p=(p+d)%n)r[p]=[...r[p]||[],i]})(1)||r

Testen Sie die neue wundervolle Konsolenfunktion der Stack-Snippets

S=(m,n)=>(d=>{for(r=[],p=i=0;i++<m;d=i%7&&!~(i+'').search(7)?d:n-d,p=(p+d)%n)r[p]=(r[p]||'')+i})(1)||r

A=(m,n)=>(d=>{for(r=[],p=i=0;i++<m;d=i%7&&!~(i+'').search(7)?d:n-d,p=(p+d)%n)r[p]=[...r[p]||[],i]})(1)||r

console.log(S(42,5))
console.log(A(20,3))

edc65
quelle
0

J, 63 60 59 58 56 Bytes

4 :'>:@I.(i.y)=/y|+/\0,_1^+/\(7 e."1 q:,.10#.inv])}.i.x'

Nachprüfung

   f =: 4 :'>:@I.(i.y)=/y|+/\0,_1^+/\(7 e."1 q:,.10#.inv])}.i.x'
   30 f 5
1  6  8 13 15 19 23 30
2  7 12 16 18 24  0  0
3 11 17 25  0  0  0  0
4 10 21 26 28  0  0  0
5  9 14 20 22 27 29  0
   42 f 5
1  6  8 13 15 19 23 30 35 39
2  7 12 16 18 24 31 40  0  0
3 11 17 25 32 41  0  0  0  0
4 10 21 26 28 33 37 42  0  0
5  9 14 20 22 27 29 34 36 38
   20 f 3
1 4 7 10 13 15 19
2 5 9 12 16 18  0
3 6 8 11 14 17 20
   14 f 10
 1 13
 2 12
 3 11
 4 10
 5  9
 6  8
 7  0
 0  0
 0  0
14  0
Dennis
quelle