เกมของ Sevens! ใครพูดอะไร


14

เกม Sevens เล่นดังนี้: nผู้เล่นนั่งเป็นวงกลมและเริ่มนับจาก 1 ผ่านไปทางซ้าย (หรือจากผู้เล่นAไปยังผู้เล่นB)

เมื่อถึงตัวเลขpที่7อยู่ในนั้นหรือหารด้วย7แล้วผู้เล่นที่พูดหมายเลขp-1หลังจากผู้เล่นคนถัดไปพูดpต้องพูดp+1และลำดับของผู้ที่พูดตรงกันข้าม ตัวอย่างเช่นถ้าผู้เล่นBพูด6เล่นCพูดว่า7, Bกล่าวว่า8, และเครื่องเล่นกล่าวว่าA9

หมายเหตุ:สำหรับผู้ที่ต้องการเล่นในชีวิตจริงหากคนลืมตัวเลข (หรือในรุ่นที่sevensไม่ได้พูดว่าตั้งใจseven), พวกเขาจะถูกตัดออกจากวงกลม แต่เราจะละเว้นรายละเอียดนี้จากความท้าทายนี้

ความท้าทายคือการพิมพ์ตัวเลขที่ผู้เล่นแต่ละคนควรพูดในเกมที่สมบูรณ์แบบของ Sevens จนถึงอินพุตmสำหรับnผู้เล่นอินพุท

เป็นตัวอย่างที่ห้าคนA, B, C, Dและมีการเล่นจนกว่าพวกเขาจะมาถึงE 30พวกเขาเล่นในลักษณะนี้

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

ที่มีเครื่องหมายsevens *ทราบว่าใน27และ28เรากำลังย้อนกลับสองครั้งและเล่นต่อ "ตามปกติ" จากไปDE

โปรดทราบว่าผลลัพธ์ไม่จำเป็นต้องอยู่ในรูปแบบข้างต้น ฉันพิมพ์มันออกมาเพื่อความชัดเจน

กฎระเบียบ

  • อินพุตเป็นจำนวนเต็มสองจำนวนในลำดับใด ๆ ที่mแสดงถึงจำนวนสุดท้ายที่จะพูดnแทนจำนวนผู้เล่น

  • เอาท์พุทสามารถเป็นหลายอาร์เรย์หรือหลายสายหนึ่งสำหรับผู้เล่นแต่ละคน หากคุณใช้สตริงคุณไม่จำเป็นต้องใช้ตัวคั่น (แต่ถ้าคุณสามารถเพิ่มบางส่วนในการทดสอบรหัสของคุณเราจะขอบคุณการอ่าน) หากคุณสามารถพิมพ์พวกมันเป็นวงกลมก็ได้นั่นก็เป็นที่ยอมรับเช่นกันและมันก็ค่อนข้างเท่ห์เช่นกัน

  • ผลลัพธ์ไม่จำเป็นต้องระบุว่าผู้เล่นคนไหนเป็นใคร (เห็นได้ชัดว่าผู้เล่นคนแรกคือคนที่พูดว่า1) แม้ว่าจะไม่ได้เรียงเอาท์พุทไม่ว่าด้วยเหตุผลใดก็ตามคุณควรทำให้ผู้เล่นคนไหนพูดด้วยตัวเลข . การละเว้นผู้เล่นที่ไม่ได้พูดอะไรจะได้รับอนุญาตถ้าคุณพูดให้ชัดเจนว่าผู้เล่นคนไหนพูด ฉันจะเพิ่มตัวอย่างเพิ่มเติมของผลลัพธ์ที่เป็นไปได้ด้านล่าง

  • นี่คือรหัสกอล์ฟดังนั้นจำนวนไบต์ที่น้อยที่สุดจึงเป็นชัยชนะ

เช่นเคยหากปัญหายังไม่ชัดเจนโปรดแจ้งให้เราทราบ ขอให้โชคดีและการเล่นกอล์ฟที่ดี!

ตัวอย่าง

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

ฉันคิดว่าผลลัพธ์ที่มีประโยชน์มากขึ้นสำหรับวัตถุประสงค์ในการแสดงภาพการเล่นเกมจะเป็นรายชื่อผู้เล่นตามลำดับการเล่น (เช่นมีผู้เล่น 4 คนและสูงสุด 15 1 2 3 4 1 2 3 2 1 4 3 2 1 4 1คน) ฉันไม่ได้บอกว่ามันดีกว่าหรือแย่กว่าในแง่ของการท้าทายเขา: แค่มันจะมีประโยชน์มากกว่าในโลกแห่งความเป็นจริง
msh210

เราสามารถแสดงผลลัพธ์เป็นเมทริกซ์และแพดที่มีเลขศูนย์ได้หรือไม่?
Dennis

@Dennis Array ว่างควรถูกเก็บไว้ ผลลัพธ์อาจเป็นเมทริกซ์แบบไม่มีเบาะรอง
Sherlock9

คำตอบ:


2

Pyth, 38 ไบต์

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

ลองออนไลน์ ชุดทดสอบ

โดยทั่วไปแล้วพอร์ตของคำตอบของ Python ของฉัน; อาจมีวิธีที่ดีกว่า ใช้เป็นตัวเลขในการนับnและจำนวนผู้เล่นpในบรรทัดแยกออกผลลัพธ์เป็นอาร์เรย์สองมิติ


3

Haskell, 151 ไบต์

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
วิธีการเกี่ยวกับmod n 7<1แทนmod n 7==0และs<$>[1..]แทนที่จะเป็นmap s[1..]อย่างไร นอกจากนี้ทำไมไม่ลองprint[]แทนmapM_ print[]ล่ะ
Michael Klein

2

Python 3, 155 ไบต์

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)

ใช้กราฟิกเต่าเพื่อพิมพ์ในวงกลมโดยตัวเลขที่ผู้เล่นคนเดียวกันพูดอยู่ในรัศมีเดียวกัน รัศมีของวงกลมจะเพิ่มขึ้นเมื่อทิศทางกลับด้านหรือเมื่อลำดับล้อมรอบวงกลมดังนั้นตัวเลขก่อนหน้านี้จะไม่ถูกเขียนทับ

ตัวอย่างผลลัพธ์สำหรับ f(22,6)

ป้อนคำอธิบายรูปภาพที่นี่


โอ้นี่ช่างฉลาดและน่ารัก +1: D
Sherlock9

1

Python 2, 103 102 101 ไบต์

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

กำหนดฟังก์ชั่นS(n,p)ที่ใช้จำนวนที่จะนับnและจำนวนของผู้เล่นpและพิมพ์ผลลัพธ์เป็นอาร์เรย์ของสตริง

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

1

Python 2, 91 90 87 ไบต์

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

พิมพ์รายการของสิ่งอันดับ ทดสอบบน Ideone


1

เยลลี่ , 27 25 ไบต์ (ไม่แข่งขัน)

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

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด


เหตุใดสิ่งนี้จึงไม่สามารถแข่งขันได้
Bálint

เพราะความท้าทายมาจากเดือนธันวาคม 2558 และถือกำเนิดการสร้างเยลลี่
Dennis

โอ้ขอบคุณสำหรับการชี้แจง!
Bálint

นั่นเป็นกฎอย่างเป็นทางการหรือไม่? ฉันไม่เคยตรวจสอบวันที่คำถามกับวันที่ประดิษฐ์ภาษาโปรแกรม
โทมัสเวลเลอร์


1

Dyalog APL, 50 47 35 ไบต์

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

นี่จะแสดงตัวเลขที่ผู้เล่นแต่ละคนพูดว่าเป็นตารางโดยที่คอลัมน์แรกจะระบุผู้เล่น แถวจะถูกเติมด้วย0 s ถึงความยาวเท่ากันและแถวที่ไม่มีตัวเลขจะถูกละเว้น

การตรวจสอบ

      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

โปรดทราบว่าในตัวอย่างสุดท้าย7และ8จะถูกละไว้เนื่องจากผู้เล่นเหล่านั้นยังไม่ได้พูดอะไรเลย


1

ทับทิม, 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}

การดำเนินการตรงไปตรงมาสวย ส่งคืนสตริง glommed ที่น่าเกลียด (คุณสามารถเพิ่มช่องว่างเพื่อให้"#{k+=1} "เหมาะกับ ... คือสตริงที่เว้นระยะ) ฉันสงสัยว่ามีอัลกอริทึมทางคณิตศาสตร์มากขึ้น


1

ปัจจัยที่ 172

ฉันจัดการให้นานกว่า Haskell และสามารถอ่านได้เหมือน APL! ฉันจะได้รับคุกกี้หรือไม่?

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

มันเป็นใบเสนอราคา (ฟังก์ชั่นที่ไม่ระบุชื่อ) ที่ส่งออกเป็นลำดับแบบเวกเตอร์ แต่ละเวกเตอร์เริ่มต้นด้วยจำนวนผู้เล่นและจากนั้นตัวเลขที่สอดคล้องกับผู้เล่นนั้น

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

ฉันเริ่มต้นด้วยสิ่งนี้:

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

ซึ่งไม่ใช่รหัสตัวประกอบที่ดี แต่มีความชัดเจนมากขึ้น (ใช่ฉันใช้ตัวเลขเป็นชื่อตัวแปรที่นั่นอย่ามองฉันอย่างนั้น!)


"ฉันจะได้รับคุกกี้หรือไม่?" ใช่คุณทำ
Leun Nun

ว้าวนั่นเป็นสิ่งที่คาดไม่ถึง! Ty, @LeakyNun: D
fede s

ว้าวฉันรักสิ่งนี้! สาปแช่งคุณเพื่อใช้ตัวเลขเป็นตัวระบุ!
แมว

1
@cat ฉันชอบมันอย่างวิปริต: P แต่ชาวบ้านแก้ปัญหาเรื่องความยาวได้SYMBOL:ดีกว่ามาก: ชื่อตัวอักษรหนึ่งตัวและกำจัดsetและget!
fede s

0

JavaScript (ES6) 100

ส่งคืนผลลัพธ์เป็นอาร์เรย์สตริงโดยไม่มีตัวคั่น

(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

หรืออ่านได้มากขึ้นสำหรับ 3 ไบต์ขึ้นไปจะส่งคืนผลลัพธ์เป็นอาร์เรย์ของอาร์เรย์

(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

ทดสอบการใช้คุณสมบัติคอนโซลใหม่ที่ยอดเยี่ยมของชุดย่อย

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 ไบต์

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

การตรวจสอบ

   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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.