Trò chơi của Sevens! Ai nói gì?


14

Trò chơi Sevens được chơi như sau: nngười chơi ngồi thành một vòng tròn và bắt đầu đếm từ 1, chuyển sang bên trái (hoặc từ người chơi Asang người chơi B).

Khi một số pmà có một 7trong nó OR là chia hết cho 7được đạt tới, thì cầu thủ bị nói số lượng p-1, sau khi cầu thủ tiếp theo nói p, phải nói p+1và thứ tự của người nói đảo ngược. Ví dụ: nếu người chơi Bnói 6, người chơi Cnói 7, Bnói 8và người chơi Anói 9.

Lưu ý: Đối với những người muốn chơi trong đời thực, nếu một người quên một số (hoặc trong phiên bản sevenskhông được nói, vô tình nói a seven), họ sẽ bị loại khỏi vòng tròn, nhưng chúng tôi sẽ bỏ qua chi tiết này từ thử thách này.

Thách thức chính là in số mà mỗi người chơi nên nói trong một trò chơi Sevens hoàn hảo cho đến đầu vào mcho nngười chơi đầu vào .

Như một ví dụ, nơi năm người, A, B, C, D, và E, là để chơi cho đến khi họ đạt được 30. Họ chơi theo cách này

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

nơi sevensđược đánh dấu bằng *. Lưu ý rằng tại 2728, chúng tôi đảo ngược hai lần và chơi tiếp tục "như bình thường" từ Dđến E.

Xin lưu ý rằng đầu ra không phải ở định dạng trên. Tôi chỉ đơn giản là in nó theo cách đó cho rõ ràng.

Quy tắc

  • Đầu vào là hai số nguyên theo bất kỳ thứ tự nào, mđại diện cho số cuối cùng để nói, nđại diện cho số lượng người chơi.

  • Đầu ra có thể là một vài mảng hoặc một vài chuỗi, một chuỗi cho mỗi người chơi. Nếu bạn sử dụng chuỗi, bạn không phải sử dụng dấu phân cách (tuy nhiên, nếu bạn có thể thêm một số trong kiểm tra mã của mình, chúng tôi sẽ đánh giá cao khả năng đọc). Nếu bạn thực sự có thể in chúng trong một vòng tròn bằng cách nào đó, điều đó cũng được chấp nhận và nó cũng sẽ rất tuyệt.

  • Đầu ra không phải chỉ định người chơi nào (rõ ràng người chơi đầu tiên là người nói 1), mặc dù nếu đầu ra không được sắp xếp vì bất kỳ lý do gì, bạn nên làm rõ người chơi nào đang nói bộ số nào . Bỏ qua những người chơi không nói gì cũng được cho phép nếu bạn nói rõ người chơi nào đang nói. Tôi sẽ thêm một số ví dụ về các đầu ra có thể dưới đây.

  • Đây là mã golf, vì vậy số byte nhỏ nhất sẽ thắng.

Như mọi khi, nếu vấn đề không rõ ràng, xin vui lòng cho tôi biết. Chúc may mắn và chơi golf tốt!

Ví dụ

>>> 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]

Tôi nghĩ rằng một đầu ra hữu ích hơn cho mục đích trực quan hóa trò chơi sẽ là một danh sách các người chơi theo thứ tự chơi. (Ví dụ: có 4 người chơi và tối đa là 15 người 1 2 3 4 1 2 3 2 1 4 3 2 1 4 1.) Tôi sẽ không nói điều đó tốt hơn hay tệ hơn về mặt thách thức của anh ta: chỉ là nó sẽ hữu ích hơn trong thế giới thực.
msh210

Chúng ta có thể hiển thị kết quả dưới dạng ma trận và pad với số không?
Dennis

@Dennis Mảng trống nên được giữ. Kết quả có thể là một ma trận không đệm.
Sherlock9

Câu trả lời:


2

Bình thường, 38 byte

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

Hãy thử trực tuyến. Bộ thử nghiệm.

Về cơ bản là một cổng của câu trả lời Python của tôi; có lẽ có một cách tốt hơn. Lấy đầu vào là số để đếm đến nvà số lượng người chơi ptrên các dòng riêng biệt, đưa ra kết quả dưới dạng một mảng hai chiều.


3

Haskell, 151 byte

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]

2
Làm thế nào về mod n 7<1thay vì mod n 7==0s<$>[1..]thay vì map s[1..]? Ngoài ra, tại sao không print[]thay thế mapM_ print[]?
Michael Klein

2

Python 3, 155 byte

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)

Sử dụng đồ họa rùa để in trong một vòng tròn sao cho các số được nói bởi cùng một người chơi trên cùng một bán kính. Bán kính của vòng tròn được tăng lên khi hướng ngược lại hoặc khi chuỗi bao quanh vòng tròn, do đó các số trước đó không bị ghi đè.

Đầu ra mẫu cho f(22,6)

nhập mô tả hình ảnh ở đây


Ooh, điều này là thông minh và xinh đẹp. +1: D
Sherlock9

1

Python 2, 103 102 101 byte

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

Xác định hàm S(n,p)lấy số để đếm nvà số người chơi pvà in kết quả dưới dạng một chuỗi các chuỗi.

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

1

Python 2, 91 90 87 byte

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

In một danh sách các bộ dữ liệu. Kiểm tra nó trên Ideone .


1

Jelly , 27 25 byte (không cạnh tranh)

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

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .


Tại sao điều này không cạnh tranh
Bálint

Bởi vì thử thách là từ tháng 12 năm 2015 và trước khi tạo ra Jelly.
Dennis

Ồ, cảm ơn đã làm rõ!
Bálint

Đó có phải là một quy tắc chính thức? Tôi không bao giờ kiểm tra ngày câu hỏi so với ngày phát minh ngôn ngữ lập trình.
Thomas Weller


1

APL Dyalog, 50 47 35 byte

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

Điều này hiển thị các số mà mỗi người chơi nói dưới dạng bảng, trong đó cột đầu tiên liệt kê các người chơi. Các hàng được đệm với 0 s đến cùng độ dài và các hàng không có số bị bỏ qua.

xác minh

      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

Lưu ý rằng, trong ví dụ trước, 78 bị bỏ qua vì những người chơi đó chưa nói gì.


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}

Thực hiện khá đơn giản. Trả về một chuỗi glommed xấu xí (bạn có thể thêm một khoảng trắng để tạo "#{k+=1} "chuỗi cho ... tốt, một chuỗi cách đều nhau). Tôi tự hỏi nếu có một thuật toán toán học hơn ngoài kia.


1

Yếu tố 172

Tôi đã xoay sở để làm điều đó lâu hơn Haskell và có thể đọc được như APL! Tôi có nhận được một 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 ]

Đó là một trích dẫn (hàm ẩn danh) tạo ra một chuỗi các vectơ tròn. Mỗi vectơ bắt đầu bằng số người chơi và sau đó là các số tương ứng với người chơi đó.

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

Tôi bắt đầu với điều này:

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

đó không phải là mã yếu tố tốt, nhưng rõ ràng hơn rất nhiều (vâng, tôi đang sử dụng các số làm tên biến ở đó, đừng nhìn tôi như thế!).


"Tôi có nhận được một cookie?" Vâng, bạn làm.
Nữ tu bị rò rỉ

Wow, thật bất ngờ! Ty, @LeakyNun: D
fede s.

Wow, tôi thích điều này! Nguyền rủa bạn vì đã sử dụng số làm định danh!
con mèo

1
@cat tôi thực sự thích nó theo cách đồi trụy: P Nhưng người dân địa phương giải quyết vấn đề về chiều dài SYMBOL:tốt hơn rất nhiều: một tên chữ cái, và loại bỏ setget!
fede s.

0

JavaScript (ES6) 100

Trả về kết quả dưới dạng một chuỗi chuỗi, không có dấu phân cách

(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

Hoặc dễ đọc hơn, để có thêm 3 byte, trả về kết quả dưới dạng một mảng các mảng

(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

Kiểm tra Sử dụng tính năng bảng điều khiển tuyệt vời mới của 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))


0

J, 63 60 59 58 56 byte

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

xác minh

   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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.