Problemi 066
Kërkesa
Është një numër magjik me 16 letra ku letrat vendosen në një tabelë 4x4 dhe spektatorit i kërkohet të zgjedhë një letër dhe të thotë rreshtin në të cilin ndodhet. Pastaj “magjistari” i mbledh letrat, i pret, dhe i shpërndan përsëri në një tabelë 4x4. Spektatori thotë përsëri rreshtin në të cilin ndodhet letra që ka menduar, dhe magjistari gjen se cilën letër ka menduar.
Letrat i shënojmë me numra nga 1 deri në 16, dhe na jepet vendosja e letrave në fillim dhe rreshti që ka zgjedhur spektatori, si dhe vendosja e letrave herën e dytë dhe rreshti që ka zgjedhur spektatori. Bëni një program që gjen se cila ka qenë letra e menduar prej spektatorit. Nqs ju del se ka më shumë se një të tillë, i bie që magjistari ka bërë ndonjë gabim, kështu që programi duhet të nxjerrë “Bad magician!”. Nqs nuk del asnjë letër, i bie që spektatori duhet të jetë ngatërruar ose ka gënjyer, kështu që programi duhet të nxjerrë “Volunteer cheated!”,
Referenca: https://code.google.com/codejam/contest/2974486/dashboard#s=p0
Shembull
$ cat input.txt
3
2
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
3
1 2 5 4
3 11 6 15
9 10 7 12
13 14 8 16
2
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
2
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
2
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
3
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
$ python3 prog.py < input.txt
Case #1: 7
Case #2: Bad magician!
Case #3: Volunteer cheated!
Në rastin e parë letra e menduar ndodhet në rreshtin e dytë, dhe pastaj në rreshtin e tretë, kështu që i bie që të jetë letra 7.
Zgjidhja
for _ in range(int(input())):
# lexo rreshtin e pare dhe tabelen e pare
r1 = int(input())
M1 = []
for _ in range(4):
M1.append([int(i) for i in input().split()])
# lexo rreshtin e dyte dhe tabelen e dyte
r2 = int(input())
M2 = []
for _ in range(4):
M2.append([int(i) for i in input().split()])
# merr rreshtat e perzgjedhur dhe gjej prerjen e tyre
R1 = M1[r1 - 1]
R2 = M2[r2 - 1]
I = []
for i in R1:
if i in R2:
I.append(i)
# jep pergjigjen ne varesi te prerjes
if len(I) > 2:
print('Bad magician!')
elif len(I) == 0:
print('Volunteer cheated!')
else:
print(I[0])
Sqarime
Kemi shumë topa pingpongu të bardhë dhe të zinj dhe kemi krijuar dy rreshta me gjatësi N përkrah njëri-tjetrit. Këta rreshta i shënojmë si vargjet X dhe Y, të përbërë prej shkronjave W and B, ku W shënon një top të bardhë (white) kurse B një top të zi (black).
Tani duam të krijojmë një rresht të tretë Z në mënyrë që ham(X, Z) + ham(Y, Z) të jetë sa më e madhe. Funksioni ham(A, B) është Hamming Distance midis vargjeve A dhe B me të njëjtën gjatësi. Kjo distancë midis dy vargjeve është numri i pozicioneve ku këto vargje kanë shkronja të ndryshme. P.sh. ham(‘WBB’, ‘BBW’) është 2, meqenëse shkronjat e para dhe të treta janë të ndryshme.
Meqenëse mund të ketë zgjidhje të ndryshme, programi duhet të nxjerrë atë zgjidhje që është alfabetikisht më e vogël. P.sh. shkronja B është më e vogël se shkronja W sepse ndodhet përpara saj në alfabet.
Referenca: https://www.codechef.com/problems/ACBALL
Shembull
$ cat input.txt
1
WBWB
WBBB
$ python3 prog.py < input.txt
BWBW