用正整数解决小于不等式


16

编写一个程序或函数,该程序或函数包含使用小于运算符()的非空数学不等式列表<。列表中的每一行都具有以下形式:

[variable] < [variable]

其中a [variable]可以是任何小写az字符的非空字符串。与普通数学和编程一样,具有相同名称的变量是相同的。

如果可以为每个变量分配一个正整数,以便满足所有不等式,则可以打印或返回带有此类分配的变量列表。此列表中的每一行都应具有以下形式:

[variable] = [positive integer]

并且所有变量必须以任何顺序恰好出现一次。

请注意,对于不等式集合可能有许多可能的正整数解。其中任何一个都是有效输出。

如果不解决不平等问题,则不输出任何内容或输出虚假值(由您决定)。

以字节为单位的最短代码获胜。

例子

如果输入是

mouse < cat
mouse < dog

那么所有这些都是有效的输出:

mouse = 1
cat = 2
dog = 2
mouse = 37
cat = 194
dog = 204
mouse = 2
cat = 2000000004
dog = 3

如果输入是

rickon < bran
bran < arya
arya < sansa
sansa < robb
robb < rickon

那么就不可能进行赋值,因为它归结为rickon < rickon,所以没有输出或虚假的输出。

解决方案的更多示例:

x < y

x = 90
y = 91

---

p < q
p < q

p = 1
q = 2

---

q < p
q < p

p = 2
q = 1

---

abcdefghijklmnopqrstuvwxyz < abcdefghijklmnopqrstuvwxyzz

abcdefghijklmnopqrstuvwxyz = 123456789
abcdefghijklmnopqrstuvwxyzz = 1234567890

---

pot < spot
pot < spot
pot < spots

pot = 5
spot = 7
spots = 6

---

d < a
d < b
d < c
d < e

d = 1
a = 4
b = 4
c = 5
e = 4

---

aa < aaaaa
a < aa
aaa < aaaa
aa < aaaa
a < aaa
aaaa < aaaaa
aaa < aaaaa
a < aaaaa

aaaa = 4
aa = 2
aaaaa = 5
a = 1
aaa = 3

---

frog < toad
frog < toaster
toad < llama
llama < hippo
raccoon < science
science < toast
toaster < toad
tuna < salmon
hippo < science
toasted < toast

raccoon = 1
frog = 2
toaster = 3
toasted = 4
toad = 5
llama = 6
hippo = 7
science = 8
toast = 9
tuna = 10
salmon = 11

没有解决方案的更多示例:(以空行分隔)

z < z

ps < ps
ps < ps

q < p
p < q

p < q
q < p

a < b
b < c
c < a

d < a
d < b
d < c
d < d

abcdefghijklmnopqrstuvwxyz < abcdefghijklmnopqrstuvwxyz

bolero < minuet
minuet < bolero

aa < aaaaa
a < aa
aaa < aaaa
aa < aaaa
aaaaa < aaaa
a < aaa
aaaa < aaaaa
aaa < aaaaa
a < aaaaa

g < c
a < g
b < a
c < a

g < b
a < g
b < a
c < a

g < b
a < g
b < a
c < b

g < c
a < g
b < a
c < b

geobits < geoborts
geobrits < geoborts
geology < geobits
geoborts < geology


运行时有限制吗?
Downgoat

@Vɪʜᴀɴ不容错过。
加尔文的爱好2015年

我们如何知道输入何时结束?是否有空行或其他东西?
汉尼斯·卡皮拉2015年

@是。您可以假设有尾随换行符。
加尔文的爱好

Answers:


4

Pyth,39个字节

V>1f.A<MxMLTN.pS{s=Nm%2cd).zVNjd[H\==hZ

在线试用:演示

蛮力分析所有可能的排列(并将它们解释为排序),检查它们是否与不等式匹配,然后为其分配值1, 2, ...., n

说明

f.A<MxMLTN.pS{s=Nm%2cd).z  
                 m     .z  map each input line d to:
                    cd)       split d by spaces
                  %2          and remove the second element
               =N          save this list of pairs to N
              s            combine these pairs to a big list of variable names
             {             set (remove duplicates)
          .pS              generate all permutations
f                          filter for permutations T, which satisfy:
     xMLTN                    replace each variable in N by their index in T
 .A<M                         check if each pair is ascending

V>1...VNjd[H\==hZ          implicit: Z = 0
 >1                        remove all but the last filtered permutation (if any)
V                          for each permutation N in ^ (runs zero times or once):
      VN                      for each variable H in N:
          [                      generate a list containing:
           H                        H
            \=                      "="
              =hZ                   Z incremented by 1 (and update Z)
        jd                       join this list by spaces and print

3

CJam(53 52 49字节)

qS-N/'<f/:A:|e!{A{1$1$&=!},!*},:ee{()" = "\N}f%1<

在线演示

此蛮力力不同的令牌的所有排列,用于滤波的数字那些分配0n-1其服从所有约束的,然后将它们格式化,递增的数字,并提出了第一个。可以肯定找到一个解决方案,因为它本质上是一种拓扑排序。

感谢Reto Koradi提供的3个字符,以及MartinBüttner提供的1 个字符。


@RetoKoradi,do!确实。
彼得·泰勒

2

Mathematica,83个字节

Quiet@Check[Equal@@@FindInstance[Join[#,#>0&/@(v=Sequence@@@#)],v,Integers][[1]],]&

将输入作为不等式列表。输出作业列表,或者Null如果不可能,则输出。

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.