Game Sevens! Siapa bilang apa?

14

Permainan Sevens dimainkan sebagai berikut: npemain duduk melingkar, dan mulai menghitung mulai dari 1, melewati ke kiri (atau dari pemain Ake pemain B).

Ketika angka pyang memiliki 7ATAU dapat dibagi dengan 7tercapai, maka pemain yang berbicara nomor p-1, setelah pemain berikutnya mengatakan p, harus mengatakan p+1dan urutan orang yang berbicara terbalik. Misalnya, jika pemain Bberbicara 6, pemain Cmengatakan 7, Bmengatakan 8, dan pemain Amengatakan 9.

Catatan: Bagi mereka yang ingin bermain dalam kehidupan nyata, jika seseorang lupa nomor (atau dalam versi sevensyang tidak disebutkan, secara tidak sengaja mengatakan a seven), mereka dihilangkan dari lingkaran, tetapi kami akan menghilangkan detail ini dari tantangan ini.

Tantangannya sendiri adalah mencetak angka yang harus diucapkan oleh setiap pemain dalam permainan Sevens yang sempurna hingga input muntuk npemain input .

Sebagai contoh, di mana lima orang, A, B, C, D, dan E, yang bermain sampai mereka mencapai 30. Mereka bermain dengan cara ini

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

dimana sevensditandai dengan *. Perhatikan bahwa pada 27dan 28, kami membalik dua kali, dan permainan berlanjut "seperti biasa" dari Dke E.

Harap dicatat bahwa output tidak harus dalam format di atas. Saya hanya mencetaknya seperti itu untuk kejelasan.

Aturan

  • Input adalah dua bilangan bulat dalam urutan apa pun, mmewakili angka terakhir untuk diucapkan, nmewakili jumlah pemain.

  • Output dapat berupa beberapa array atau beberapa string, satu untuk setiap pemain. Jika Anda menggunakan string, Anda tidak harus menggunakan pemisah (meskipun, jika Anda bisa menambahkan beberapa dalam tes kode Anda, kami sangat menghargai keterbacaan). Jika Anda benar-benar dapat mencetaknya dalam lingkaran, itu juga dapat diterima, dan itu akan sangat keren juga.

  • Output tidak harus menentukan pemain mana yang (cukup jelas bahwa pemain pertama adalah yang mengatakan 1), meskipun jika output tidak diurutkan untuk alasan apa pun, Anda harus memperjelas pemain mana yang berbicara set angka yang mana . Menghilangkan pemain yang tidak mengatakan apa-apa juga diperbolehkan jika Anda memperjelas pemain mana yang berbicara. Saya akan menambahkan beberapa contoh lagi kemungkinan keluaran di bawah ini.

  • Ini adalah kode golf, sehingga jumlah byte terkecil menang.

Seperti biasa, jika masalahnya tidak jelas, beri tahu saya. Semoga berhasil dan bermain golf dengan baik!

Contohnya

>>> 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
sumber
Saya pikir output yang lebih berguna untuk tujuan memvisualisasikan permainan akan menjadi daftar pemain dalam urutan permainan. (Misalnya dengan 4 pemain dan maks. 15 1 2 3 4 1 2 3 2 1 4 3 2 1 4 1). Saya tidak mengatakan itu lebih baik atau lebih buruk dalam hal dia menantang: hanya saja itu akan lebih berguna di dunia nyata.
msh210
Bisakah kita menampilkan hasilnya sebagai matriks dan pad dengan nol?
Dennis
@Dennis Array kosong harus disimpan. Hasilnya mungkin matriks nol-empuk.
Sherlock9

Jawaban:

2

Pyth, 38 byte

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

Cobalah online. Suite uji.

Pada dasarnya port jawaban Python saya; mungkin ada cara yang lebih baik. Dibawa sebagai input jumlah untuk menghitung hingga ndan jumlah pemain ppada baris terpisah, output hasilnya sebagai array dua dimensi.

PurkkaKoodari
sumber
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]
Damien
sumber
2
Bagaimana kalau mod n 7<1bukannya mod n 7==0dan s<$>[1..]bukannya map s[1..]? Juga, mengapa tidak print[]bukan 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)

Menggunakan grafis kura-kura untuk mencetak dalam lingkaran sehingga angka yang diucapkan oleh pemain yang sama berada pada radius yang sama. Jari-jari lingkaran meningkat ketika arahnya terbalik, atau ketika urutan membungkus lingkaran, sehingga angka-angka sebelumnya tidak ditimpa.

Output sampel untuk f(22,6)

masukkan deskripsi gambar di sini

RootTwo
sumber
Ooh, ini pintar dan cantik. +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

Menentukan fungsi S(n,p)yang mengambil jumlah untuk dihitung ndan jumlah pemain pdan mencetak hasilnya sebagai array string.

>>> S(42,5)
['16813151923303539', '27121618243140', '31117253241', '410212628333742','591420222729343638']
PurkkaKoodari
sumber
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

Mencetak daftar tupel. Uji di Ideone .

Dennis
sumber
1

Jelly , 27 25 byte (tidak bersaing)

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

Cobalah online! atau verifikasi semua kasus uji .

Dennis
sumber
mengapa ini tidak bersaing
Bálint
Karena tantangannya adalah sejak Desember 2015 dan mendahului pembuatan Jelly.
Dennis
Oh, terima kasih atas klarifikasi!
Bálint
Apakah itu aturan resmi? Saya tidak pernah memeriksa tanggal pertanyaan terhadap tanggal penemuan bahasa pemrograman.
Thomas Weller
1

Dyalog APL, 50 47 35 byte

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

Ini menampilkan angka yang dikatakan setiap pemain sebagai sebuah tabel, di mana kolom pertama menyebutkan para pemain. Baris diisi dengan 0 s dengan panjang yang sama, dan baris tanpa angka dihilangkan.

Verifikasi

      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

Perhatikan bahwa, dalam contoh terakhir, 7 dan 8 dihilangkan karena para pemain belum mengatakan apa pun.

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

Implementasi yang cukup mudah. Mengembalikan string glommed jelek (Anda dapat menambahkan ruang untuk membuatnya "#{k+=1} "untuk ... well, string spasi). Saya ingin tahu apakah ada lebih banyak algoritma matematika di luar sana.

Bukan itu Charles
sumber
1

Faktor 172

Saya berhasil melakukannya lebih lama dari Haskell, dan dapat dibaca sebagai APL! Apakah saya mendapat 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 ]

Ini adalah kutipan (fungsi anonim) yang menghasilkan urutan vektor lingkaran. Setiap vektor dimulai dengan jumlah pemain, dan kemudian angka yang sesuai dengan pemain itu.

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

Saya mulai dengan ini:

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

yang bukan kode faktor yang baik, tetapi jauh lebih jelas (ya, saya menggunakan angka sebagai nama variabel di sana, jangan lihat saya seperti itu!).

fede s.
sumber
"Apakah saya mendapat kue?" Ya, benar.
Leaky Nun
Wow, itu tidak terduga! Ty, @LeakyNun: D
fede s.
Wow, aku suka ini! Mengutuk Anda karena menggunakan angka sebagai pengidentifikasi!
kucing
1
@cat saya benar-benar menyukainya dengan cara yang sesat: P Tapi penduduk setempat memecahkan masalah panjang SYMBOL:jauh lebih baik: satu nama huruf, dan menyingkirkan setdan get!
fede s.
0

JavaScript (ES6) 100

Mengembalikan hasil sebagai array string, tanpa pemisah

(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

Atau lebih mudah dibaca, selama 3 byte lebih, mengembalikan hasil sebagai array array

(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

Uji Menggunakan fitur konsol baru dan indah dari 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
sumber
0

J, 63 60 59 58 56 byte

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

Verifikasi

   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
sumber