Bộ giải ngược FizzBuzz


32

Tóm tắt nội dung: Đưa ra đầu ra của chương trình FizzBuzz tổng quát, trả về danh sách các yếu tố và từ được sử dụng cho chương trình.

Mô tả thử thách

Hãy tưởng tượng một chương trình FizzBuzz tổng quát, đưa vào như một danh sách các yếu tố và từ để sử dụng và số để bắt đầu. Ví dụ, nếu đầu vào của chương trình này là

3 2,Ninja 5,Bear 7,Monkey

Chương trình sẽ in ra các số từ 3để 100thay thế số chia hết cho 2với Ninja, số chia hết 5với Bearvà số chia hết cho 7với Monkey. Đối với con số mà có thể phân chia thì nhiều hơn một trong những điều khoản, chương trình sẽ nối các từ, in những thứ như NinjaBearhoặc BearMonkeyhoặc NinjaMonkeyhoặc NinjaBearMonkey. Đây là đầu ra của đầu vào đó:

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

Lưu ý rằng bất cứ khi nào chương trình cần kết hợp các từ lại với nhau, nó luôn đi từ số thấp nhất đến số cao nhất . Vì vậy, nó sẽ không in ra một cái gì đó như MonkeyBear(vì Monkey là một số lượng cao hơn so với Bear).

Chương trình của bạn nên dùng trong các đầu ra của chương trình FizzBuzz khái quát hóa như đầu vàođầu ra các đầu vào cho chương trình FizzBuzz khái quát hóa. Nói cách khác, viết "chương trình đảo ngược" cho chương trình FizzBuzz tổng quát. Chẳng hạn, được đưa ra khối mã ở trên làm đầu vào, chương trình của bạn sẽ xuất ra 3 2,Ninja 5,Bear, 7,Monkey.

Có một số quy tắc mà các từ sẽ luôn tuân theo:

  • Sẽ luôn luôn có thể nói chính xác các yếu tố và từ là từ đầu vào.
  • Mỗi từ sẽ bắt đầu bằng chữ in hoa và sẽ không chứa bất kỳ chữ in hoa hoặc chữ số nào khác.
  • Mỗi yếu tố là duy nhất.

Đầu vào và đầu ra mẫu

Đầu vào:

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

Đầu ra:

6 6,Calvins 8,Hobbies

Đầu vào:

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

Đầu ra:

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

Đầu vào:

DeliciousTartApplePie
DeliciousCreamPancakeStrawberry
DeliciousProfiterole
DeliciousCream
DeliciousPancake
DeliciousCreamStrawberryTart

Đầu ra:

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

Bạn có thể lấy mã tôi đã sử dụng để tạo đầu vào ở đây .


Có phải danh sách luôn luôn lên đến chính xác 100?
Dennis

@Dennis Có, giới hạn trên luôn là 100.
absinthe

15
Đó chỉ là một vinh dự được là một trong những ví dụ của bạn.
NinjaBearMonkey

Đây là phiên bản thử thách của bạn tốt hơn nhiều so với ban đầu trong hộp cát :)
Beta Decay

1
@NinjaBearMonkey Tôi cho rằng việc chọn tên có nhiều từ trong đó làm cho chúng tôi trở thành những ví dụ tốt hơn. Cảm ơn vì đã bao gồm tôi quá @Pyrrha! :)
FryAmTheEggman

Câu trả lời:


10

Bình thường, 73 byte

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

Đó chắc chắn là một khó khăn. Tôi nghĩ rằng tôi đã bao gồm tất cả các trường hợp cạnh, bao gồm tất cả mọi thứ trong ví dụ của @ MartinBüttner và ví dụ không có yếu tố lặp lại.

NinjaBearMonkey , Ngon

Ở cấp độ cao, đầu tiên chương trình tìm thấy tất cả các từ bằng cách cắt các chuỗi chữ cái trên chữ in hoa.

Sau đó, các hàng được ánh xạ tới việc mỗi chuỗi có xuất hiện trong hàng hay không và mỗi yếu tố có thể được kiểm tra để xem liệu nó có tạo ra cùng một thứ tự hay không. Nếu có, yếu tố này được thêm vào danh sách yêu tinh, đó là kiểm tra xem yếu tố đã có chưa. Nếu nó chưa có mặt, yếu tố được sử dụng. Các chuỗi được sắp xếp theo sự xuất hiện đầu tiên trong đầu vào, điều này phân biệt thứ tự các chuỗi mà mỗi chuỗi chỉ xuất hiện một lần trong cùng một hàng.

Sau đó, nó chỉ là định dạng và in ấn.


5

Scala, 350 ký tự

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

không chiến thắng ... nhưng câu hỏi hay.

kết quả kiểm tra:

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

Con trăn 2 365 340 331 byte

Chương trình này nhận đầu vào thông qua stdin.

Cách tiếp cận mới:

Tính hệ số của các từ chỉ một lần xuất hiện theo khoảng cách từ cuối dòng. Ví dụ: (từ mẫu cuối cùng): DeliciousTartApplePiePie được tính là: [95,19,5,1][0]và Apple là : [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()))

Cách tiếp cận cũ:

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()))

Sử dụng:

python FizzBuzzReverseSolver.py < Sample1.txt

Giải thích (về cách tiếp cận cũ):

  • Nói chung, chương trình tạo ra một danh sách số dòng và danh sách các từ (ví dụ [(0, []), (1, ['Ninja']), (2, ['Bear']), ...].
  • Đối với mỗi từ trong mỗi dòng (bắt đầu từ cuối dòng):
    • Tìm sự xuất hiện tiếp theo của từ và chèn sự khác biệt và từ đó vào một từ điển được xác định trước.
    • Nếu không tìm thấy, hãy chèn yếu tố lớn nhất của số dòng (bao gồm cả chính nó) không tồn tại trong từ điển và từ vào từ điển.
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.