Karar haritamı normalleştir


11

Bir metin bloğunu işleyen ve yeni metni döndüren bir işlev veya program yazın. En küçük geçerli program kazanır.

Metin bloğundaki her satır aşağıdaki biçime sahip olacaktır:

12:34,56

İlk sayı satır kimliğidir, diğer iki virgülle ayrılmış sayı diğer satırlara referanstır.

Giriş metninde sayılar 0'dan büyük veya 0'a eşit herhangi bir tamsayı olabilir. Tüm sayılar ASCII kodlu ondalık basamakta olacak ve baştaki sıfırlar olmayacaktır. Yinelenen satır kimlikleri olmayacak. Referans olmayan satır kimlikleri olsa da, var olmayan satır kimlikleri için referans olmayacaktır.

Çıktı metninde en düşük numaralı satır metin bloğunun başına taşınacak ve 0 olarak yeniden numaralandırılacaktır. Bu satıra yapılan tüm referanslar da güncellenmelidir. Bu satırdaki ilk başvuru 0 veya 1 olmalıdır. İkinci başvuru yalnızca ilk başvuru 1 ise 2 olabilir. Aksi takdirde 0 veya 1 olmalıdır.

Tüm satırlar artan, artan sırada olmalıdır (atlanan sayılar yok). N satırına yalnızca n-1 satırına daha önce başvurulmuşsa veya geçerli satır kimliği n ise bir referansınız olabilir. Satır 0 dışında alt satır kimlikleri tarafından referans verilmeyen hiçbir satır olmamalıdır. Bu tür satırların son çıkıştan önce kaldırılması gerekir.

Giriş metninin her zaman doğru biçimde olduğunu varsayabilirsiniz.

Test girişi # 1:

45:73,24
78:24,78
89:24,73
73:45,3
72:3,24
3:24,24
24:3,89

yeniden sıralanmış:

3:24,24
24:3,89
89:24,73
73:45,3
45:73,24
78:24,78
72:3,24

yeniden numaralandırılmış:

0:1,1
1:0,2
2:1,3
3:4,0
4:3,1
78:1,78
72:0,1

Son çıktı için referanslandırılmamış satırlar kaldırıldı:

0:1,1
1:0,2
2:1,3
3:4,0
4:3,1

Tabii ki, programınız bu sırayı takip etmek zorunda değil, sadece doğru çıktıyı üretin. Çıktı tek bir metin bloğu veya dilinizdeki en yakın eşdeğer olmalıdır, yani doğrudan karakter çıktısı karakter içermemelidir. Doğrudan tüm bloğu döndürebilir (tercih edebilirsiniz) veya çıktısını alabilirsiniz. Çıktınızın başka bir işleve veya programa aktarılacağını varsayın.

Test girişi # 2

5:2,3
7:3,2
2:4,2
4:2,3
3:4,3

Çıktı:

0:1,0
1:0,2
2:1,2

Test girişi # 3

7:6,3
3:9,7
9:7,3
2:9,6
6:6,7

Çıktı:

0:1,2
1:3,4
2:2,3
3:2,4
4:1,3

Yanıtlar:


1

Python 3 , 226 215 211 209 179 bayt

def f(s):
 S=dict(map(eval,i.split(":"))for i in s.split("\n"));r="";L=[min(S)];i=0
 while L[i:]:a=S[L[i]];L+=set(a)-set(L);r+="%%d:%d,%d\n"%tuple(map(L.index,a))%i;i+=1
 return r

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.