FizzBu​​zz反向求解器


32

简介:给定通用FizzBu​​zz程序的输出,返回用于该程序的因子和单词的列表。

挑战说明

想象一下一个通用的FizzBu​​zz程序,该程序将要使用的因素和单词以及起始数字的列表作为输入。例如,如果该程序的输入是

3 2,Ninja 5,Bear 7,Monkey

该计划将从打印出来的数字3100,免去数整除2Ninja,数字整除5Bear和数字整除7Monkey。对于那些整除则超过这些术语中的一个号码,该程序将串联的话,印刷的东西,如NinjaBearBearMonkeyNinjaMonkeyNinjaBearMonkey。这是该输入的输出:

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高)。

你的程序应该采取在输出广义FizzBu​​zz程序作为输入输出输入给予广义FizzBu​​zz程序。换句话说,为广义的FizzBu​​zz程序编写一个“反向程序”。例如,给定上面的代码块作为输入,您的程序应输出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是的,上限始终为100。–
苦艾酒

15
荣幸地成为您的一个例子。
NinjaBearMonkey 2015年

与原始沙箱相比,这是您挑战的更好版本:)
Beta Decay

1
@NinjaBearMonkey我想选择名称中包含许多单词的名称可以使我们成为更好的例子。感谢您也包括我@Pyrrha!:)
FryAmTheEggman 2015年

Answers:


10

Pyth,73个字节

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

那肯定是艰难的。我认为我已经涵盖了所有极端情况,包括@MartinBüttner的示例中的所有内容,以及不重复因素的示例。

忍者熊猴子美味

在较高的级别上,该程序首先通过将大写字母上的字母字符串切碎来查找所有单词。

然后,将行映射到每个字符串是否出现在行中,并测试每个可能的因素以查看其是否产生相同的顺序。如果是这样,则将因子添加到全局列表,以检查该因子是否已存在。如果尚不存在,则使用系数。字符串按输入中的第一出现顺序排序,这消除了在同一行中仅出现一次的字符串的排序。

之后,它只是格式化和打印。


5

Scala,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接收输入。

新的方法:

通过距行尾的距离来计算仅一个出现的单词的因子。例如(来自上一个示例):DeliciousTartApplePiePie计算为:[95,19,5,1][0]和Apple为:[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']), ...]
  • 对于每一行中的每个单词(从行尾开始):
    • 查找单词的下一个出现位置,并将差异和单词插入预定义的词典中。
    • 如果找不到,请插入字典中不存在的行号(包括其本身)和字典中单词的最大因子。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.