Решение неравенств с положительными целыми числами


16

Напишите программу или функцию, которая принимает непустой список математических неравенств , использующих оператор less than ( <). Каждая строка в списке будет иметь вид

[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ɪʜᴀɴ Нет, не позволяет.
Увлечения Кэлвина

Как мы узнаем, когда заканчивается ввод? Есть пустая строка или что-то?
Ханнес Карппила

@Да. Вы можете предположить, что есть завершающий перевод строки.
Увлечения Кэлвина

Ответы:


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<

Онлайн демо

Это грубая сила всех перестановок различных маркеров, фильтровальная для тех назначений чисел 0с n-1которым подчиняется все ограничения, а затем форматирует их, увеличивая число и представляют первый. Это наверняка найдет решение, если оно есть, потому что это по сути топологическая сортировка.

Спасибо Рето Коради за 3 знака и Мартину Бюттнеру за 1.


@RetoKoradi, дох! В самом деле.
Питер Тейлор,

2

Mathematica, 83 байта

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

Вводит в виде списка неравенств. Либо выводит список назначений, либо, Nullесли это невозможно.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.