Memecahkan ketidaksetaraan yang kurang dari dengan bilangan bulat positif

16

Tulis program atau fungsi yang menggunakan daftar ketidaksetaraan matematika yang kosong yang menggunakan operator kurang dari ( <). Setiap baris dalam daftar akan memiliki formulir

[variable] < [variable]

di mana a [variable]bisa berupa string nonempty dari huruf kecil huruf az. Seperti dalam matematika dan pemrograman normal, variabel dengan nama yang sama identik.

Jika bilangan bulat positif dapat ditetapkan untuk setiap variabel sehingga semua ketidaksetaraan terpenuhi, maka cetak atau kembalikan daftar variabel dengan tugas tersebut. Setiap baris dalam daftar ini harus memiliki formulir

[variable] = [positive integer]

dan semua variabel harus muncul tepat satu kali dalam urutan apa pun.

Perhatikan bahwa mungkin ada banyak kemungkinan solusi bilangan bulat positif untuk set ketidaksetaraan. Salah satunya adalah output yang valid.

Jika tidak ada solusi untuk ketidaksetaraan, maka jangan menghasilkan apa pun atau mengeluarkan nilai palsu (terserah Anda).

Kode terpendek dalam byte menang.

Contohnya

Jika inputnya adalah

mouse < cat
mouse < dog

maka semua ini akan menjadi output yang valid:

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

Jika inputnya adalah

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

maka tidak ada tugas yang mungkin karena itu intinya rickon < rickon, sehingga tidak ada output atau output palsu.

Lebih banyak contoh dengan solusi:

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

Lebih banyak contoh tanpa solusi: (dipisahkan oleh garis kosong)

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
Hobi Calvin
sumber
2
Sangat terkait erat
Peter Taylor
Adakah batasan pada runtime?
Downgoat
@ Vɪʜᴀɴ Tidak ada lmits.
Calvin Hobbies
Bagaimana kita tahu kapan input berakhir? Apakah ada garis kosong atau sesuatu?
Hannes Karppila
@Iya. Anda dapat mengasumsikan ada baris baru yang tertinggal.
Hobi Calvin

Jawaban:

4

Pyth, 39 byte

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

Cobalah online: Demonstrasi

Brute-force melalui semua permutasi yang mungkin (dan menafsirkannya sebagai penyortiran), memeriksa apakah mereka cocok dengan ketidaksetaraan, dan menetapkan nilai-nilai tersebut 1, 2, ...., n.

Penjelasan

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
Jakube
sumber
3

CJam ( 53 52 49 byte)

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

Demo online

Ini brute-kekuatan semua permutasi dari token yang berbeda, penyaringan bagi mereka tugas dari nomor 0untukn-1 yang menaati semua kendala, dan kemudian format mereka, incrementing nomor, dan hadiah yang pertama. Ini pasti untuk menemukan solusi jika ada, karena pada dasarnya semacam topologi.

Terima kasih kepada Reto Koradi untuk 3 karakter dan Martin Büttner untuk 1.

Peter Taylor
sumber
@RetoKoradi, doh! Memang.
Peter Taylor
2

Mathematica, 83 byte

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

Mengambil input sebagai daftar ketidaksetaraan. Entah menampilkan daftar tugas atau Nulljika tidak mungkin.

LegionMammal978
sumber