FizzBuzz Reverse Solver


32

เรื่องย่อ:จากผลลัพธ์ของโปรแกรม FizzBuzz ทั่วไปให้ส่งคืนรายการปัจจัยและคำที่ใช้สำหรับโปรแกรม

คำอธิบายการท้าทาย

ลองนึกภาพโปรแกรม FizzBuzz ทั่วไปที่ป้อนข้อมูลรายการปัจจัยและคำที่ใช้และจำนวนที่จะเริ่ม ตัวอย่างเช่นหากอินพุตของโปรแกรมนี้คือ

3 2,Ninja 5,Bear 7,Monkey

โปรแกรมจะพิมพ์ออกมาจากตัวเลข3ที่จะ100เปลี่ยนหมายเลขหารด้วย2กับNinjaตัวเลขหารด้วย5กับBearและตัวเลขหารด้วยกับ7 Monkeyสำหรับตัวเลขที่หารแล้วมากกว่าหนึ่งของคำเหล่านั้นโปรแกรมจะเชื่อมคำพิมพ์สิ่งต่างๆเช่นNinjaBearหรือBearMonkeyหรือหรือNinjaMonkey NinjaBearMonkeyนี่คือผลลัพธ์ของอินพุตนั้น:

3
Ninja
Bear
Ninja
Monkey
Ninja
9
NinjaBear
11
Ninja
13
NinjaMonkey
Bear
Ninja
17
Ninja
19
NinjaBear
Monkey
Ninja
23
Ninja
Bear
Ninja
27
NinjaMonkey
29
NinjaBear
31
Ninja
33
Ninja
BearMonkey
Ninja
37
Ninja
39
NinjaBear
41
NinjaMonkey
43
Ninja
Bear
Ninja
47
Ninja
Monkey
NinjaBear
51
Ninja
53
Ninja
Bear
NinjaMonkey
57
Ninja
59
NinjaBear
61
Ninja
Monkey
Ninja
Bear
Ninja
67
Ninja
69
NinjaBearMonkey
71
Ninja
73
Ninja
Bear
Ninja
Monkey
Ninja
79
NinjaBear
81
Ninja
83
NinjaMonkey
Bear
Ninja
87
Ninja
89
NinjaBear
Monkey
Ninja
93
Ninja
Bear
Ninja
97
NinjaMonkey
99
NinjaBear

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

โปรแกรมของคุณควรจะใช้เวลาในการส่งออกของโปรแกรมทั่วไป FizzBuzz เป็นอินพุทและเอาท์พุทการป้อนข้อมูลให้กับโปรแกรม FizzBuzz ทั่วไป กล่าวอีกนัยหนึ่งให้เขียน "reverse program" สำหรับโปรแกรม FizzBuzz ทั่วไป ยกตัวอย่างเช่นได้รับการป้องกันรหัสดังกล่าวข้างต้นเป็น input 3 2,Ninja 5,Bear, 7,Monkeyโปรแกรมของคุณควรเอาท์พุท

มีกฎบางอย่างที่คำพูดจะปฏิบัติตามเสมอ:

  • มันจะเป็นไปได้เสมอที่จะบอกว่าปัจจัยและคำพูดมาจากอินพุต
  • แต่ละคำจะเริ่มต้นด้วยตัวพิมพ์ใหญ่และจะไม่มีตัวอักษรหรือตัวเลขอื่น ๆ
  • แต่ละปัจจัยมีความเป็นเอกลักษณ์

ตัวอย่างอินพุตและเอาต์พุต

การป้อนข้อมูล:

Calvins
7
Hobbies
9
10
11
Calvins
13
14
15
Hobbies
17
Calvins
19
20
21
22
23
CalvinsHobbies
25
26
27
28
29
Calvins
31
Hobbies
33
34
35
Calvins
37
38
39
Hobbies
41
Calvins
43
44
45
46
47
CalvinsHobbies
49
50
51
52
53
Calvins
55
Hobbies
57
58
59
Calvins
61
62
63
Hobbies
65
Calvins
67
68
69
70
71
CalvinsHobbies
73
74
75
76
77
Calvins
79
Hobbies
81
82
83
Calvins
85
86
87
Hobbies
89
Calvins
91
92
93
94
95
CalvinsHobbies
97
98
99
100

เอาท์พุท:

6 6,Calvins 8,Hobbies

การป้อนข้อมูล:

FryEggman
7
Am
Fry
The
11
FryAmEggman
13
14
FryThe
Am
17
FryEggman
19
AmThe
Fry
22
23
FryAmEggman
The
26
Fry
Am
29
FryTheEggman
31
Am
Fry
34
The
FryAmEggman
37
38
Fry
AmThe
41
FryEggman
43
Am
FryThe
46
47
FryAmEggman
49
The
Fry
Am
53
FryEggman
The
Am
Fry
58
59
FryAmTheEggman
61
62
Fry
Am
The
FryEggman
67
Am
Fry
The
71
FryAmEggman
73
74
FryThe
Am
77
FryEggman
79
AmThe
Fry
82
83
FryAmEggman
The
86
Fry
Am
89
FryTheEggman
91
Am
Fry
94
The
FryAmEggman
97
98
Fry
AmThe

เอาท์พุท:

6 3,Fry 4,Am 5,The 6,Eggman

การป้อนข้อมูล:

DeliciousTartApplePie
DeliciousCreamPancakeStrawberry
DeliciousProfiterole
DeliciousCream
DeliciousPancake
DeliciousCreamStrawberryTart

เอาท์พุท:

95 1,Delicious 2,Cream 3,Pancake 4,Strawberry 5,Tart 19,Apple 95,Pie 97,Profiterole

คุณจะได้รับฉันรหัสที่ใช้ในการสร้างปัจจัยการผลิตที่นี่


รายการขึ้นไป 100 เสมอหรือไม่
Dennis

@Dennis ใช่ขอบด้านบนจะเป็น 100 เสมอ
absinthe

15
เป็นเพียงเกียรติที่ได้เป็นหนึ่งในตัวอย่างของคุณ
NinjaBearMonkey

นี่เป็นเวอร์ชันที่ดีกว่าสำหรับความท้าทายของคุณมากกว่าตอนแรกใน sandbox :)
Beta Decay

1
@NinjaBearMonkey ฉันคิดว่าการเลือกชื่อที่มีหลายคำในนั้นทำให้เราเป็นตัวอย่างที่ดีกว่า ขอบคุณที่รวมฉันด้วย @Pryrha! :)
FryAmTheEggman

คำตอบ:


10

Pyth, 73 ไบต์

jd+J-101lK.zjL\,Sm,_-F>2+_Jf}d@KTUKd{smtcdf-@dTGUdf>T\:K

นั่นเป็นสิ่งที่ยากมาก ฉันคิดว่าฉันได้ครอบคลุมทุกกรณีรวมถึงทุกอย่างในตัวอย่างของ @ MartinBüttnerและไม่มีตัวอย่างปัจจัยซ้ำ

NinjaBearMonkey , อร่อย

ในระดับสูงโปรแกรมแรกจะค้นหาคำทั้งหมดโดยการตัดสตริงตามตัวอักษรของตัวพิมพ์ใหญ่

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

หลังจากนั้นมันเป็นเพียงการจัดรูปแบบและการพิมพ์


5

สกาล่า, 350 ตัวอักษร

(s:String)⇒{def g(a:Int,b:Int):Int=if(b==0)a.abs else g(b,a%b);val(j,q)=(s.lines:\100→Map.empty[String,Int]){case(l,(n,m))⇒if(l(0).isDigit)(n-1,m)else(n-1,m++(Seq(Seq(l(0)))/:l.tail){case(x,c)⇒if(c.isUpper)Seq(c)+:x else (x(0):+c)+:x.tail}.map{t⇒val w=t.mkString;w→g(m.getOrElse(w,n),n)})};s"${j+1}"+q.map{case(k,v)=>s" $v,$k"}.toSeq.sorted.mkString}

ไม่ชนะ ... แต่เป็นคำถามที่ดี

ผลการทดสอบ:

scala> (s:String)⇒{def g(a:Int,b:Int):Int=if(b==0)a.abs else g(b,a%b);val(j,q)=(s.lines:\100→Map.empty[String,Int]){case(l,(n,m))⇒if(l(0).isDigit)(n-1,m)else(n-1,m++(Seq(Seq(l(0)))/:l.tail){case(x,c)⇒if(c.isUpper)Seq(c)+:x else (x(0):+c)+:x.tail}.map{t⇒val w=t.mkString;w→g(m.getOrElse(w,n),n)})};s"${j+1}"+q.map{case(k,v)=>s" $v,$k"}.toSeq.sorted.mkString}
res0: String => String = <function1>

scala> res0("""DeliciousTartApplePie
     | DeliciousCreamPancakeStrawberry
     | DeliciousProfiterole
     | DeliciousCream
     | DeliciousPancake
     | DeliciousCreamStrawberryTart""")
res1: String = 95 1,Delicious 2,Cream 3,Pancake 4,Strawberry 5,Tart 95,Apple 95,Pie 97,Profiterole

scala> res0("""FryEggman
     | 7
     | Am
     | Fry
     | The
     | 11
     | FryAmEggman
     | 13
     | 14
     | FryThe
     | Am
     | 17
     | FryEggman
     | 19
     | AmThe
     | Fry
     | 22
     | 23
     | FryAmEggman
     | The
     | 26
     | Fry
     | Am
     | 29
     | FryTheEggman
     | 31
     | Am
     | Fry
     | 34
     | The
     | FryAmEggman
     | 37
     | 38
     | Fry
     | AmThe
     | 41
     | FryEggman
     | 43
     | Am
     | FryThe
     | 46
     | 47
     | FryAmEggman
     | 49
     | The
     | Fry
     | Am
     | 53
     | FryEggman
     | The
     | Am
     | Fry
     | 58
     | 59
     | FryAmTheEggman
     | 61
     | 62
     | Fry
     | Am
     | The
     | FryEggman
     | 67
     | Am
     | Fry
     | The
     | 71
     | FryAmEggman
     | 73
     | 74
     | FryThe
     | Am
     | 77
     | FryEggman
     | 79
     | AmThe
     | Fry
     | 82
     | 83
     | FryAmEggman
     | The
     | 86
     | Fry
     | Am
     | 89
     | FryTheEggman
     | 91
     | Am
     | Fry
     | 94
     | The
     | FryAmEggman
     | 97
     | 98
     | Fry
     | AmThe""")
res2: String = 6 3,Fry 4,Am 5,The 6,Eggman

4

Python 2 366 340 331 ไบต์

โปรแกรมนี้รับอินพุตผ่าน stdin

วิธีการใหม่:

คำนวณค่าของคำของเหตุการณ์หนึ่งคำโดยระยะทางจากจุดสิ้นสุดของบรรทัด ยกตัวอย่างเช่น (จากตัวอย่างสุดท้าย): DeliciousTartApplePieพายคำนวณเป็น: และแอปเปิ้ล:[95,19,5,1][0][95,19,5,1][1]

import sys
import re
d=[(i,re.findall('[A-Z][a-z]*',l)[::-1])for i,l in enumerate(sys.stdin)]
e=101-len(d)
print e," ".join(`x`+','+`y`[1:-1]for x,y in sorted({next((j-i for j,t in d if j>i and w in t),[x for x in range(i+e,0,-1)if(i+e)%x==0][d[i][1].index(w)]):w for w,i in{w:i for i,l in d[::-1]for w in l}.items()}.iteritems()))

วิธีเก่า:

import sys
import re
l=[(i,re.findall('[A-Z][a-z]*',l))for i,l in enumerate(sys.stdin)]
e=101-len(l)
d={}
for i,s in l:
 for w in s[::-1]:
  if w not in d.values():
   d[next((j-i for j,t in l[i+1:]if w in t),next(m for m in range(i+e,0,-1)if(i+e)%m==0and m not in d))]=w 
print e," ".join(`x`+','+`y`[1:-1]for x,y in sorted(d.iteritems()))

การใช้งาน:

python FizzBuzzReverseSolver.py < Sample1.txt

คำอธิบาย (ของวิธีการแบบเก่า):

  • โดยทั่วไปโปรแกรมจะสร้างรายการหมายเลขบรรทัดและรายการคำ (เช่น [(0, []), (1, ['Ninja']), (2, ['Bear']), ...](เช่น
  • สำหรับแต่ละคำในทุกบรรทัด (เริ่มต้นจากท้ายบรรทัด):
    • ค้นหาคำที่เกิดขึ้นต่อไปและใส่ความแตกต่างและคำในพจนานุกรมที่กำหนดไว้ล่วงหน้า
    • หากไม่พบให้ใส่ปัจจัยที่ใหญ่ที่สุดของหมายเลขบรรทัด (รวมถึงตัวเอง) ที่ไม่มีอยู่ในพจนานุกรมและคำลงในพจนานุกรม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.