2036 - Numele animalutului lui Arpsod: Difference between revisions
Andrada378 (talk | contribs) Pagină nouă: De ziua lui, vrăjitorul Arpsod a primit în dar un animăluț mic și pufos. Evident, acesta dorește să îi dea un nume. Pentru a fi protejat de răul și blaturile existente în Univers, Arpsod a decis să îi dea un nume strict legat de numărul său protector. Cunoscând numărul protector, numele animăluțului se va determina astfel: Va fi un șir de litere MARI ale alfabetului latin, de lungime minimă cu proprietatea că suma diferențelor în modul a literelor veci... |
Andrada378 (talk | contribs) |
||
(One intermediate revision by the same user not shown) | |||
Line 1: | Line 1: | ||
== Enunț == | |||
De ziua lui, vrăjitorul Arpsod a primit în dar un animăluț mic și pufos. Evident, acesta dorește să îi dea un nume. Pentru a fi protejat de răul și blaturile existente în Univers, Arpsod a decis să îi dea un nume strict legat de numărul său protector. Cunoscând numărul protector, numele animăluțului se va determina astfel: Va fi un șir de litere MARI ale alfabetului latin, de lungime minimă cu proprietatea că suma diferențelor în modul a literelor vecine este egală cu numărul lui Arpsod. | De ziua lui, vrăjitorul Arpsod a primit în dar un animăluț mic și pufos. Evident, acesta dorește să îi dea un nume. Pentru a fi protejat de răul și blaturile existente în Univers, Arpsod a decis să îi dea un nume strict legat de numărul său protector. Cunoscând numărul protector, numele animăluțului se va determina astfel: Va fi un șir de litere MARI ale alfabetului latin, de lungime minimă cu proprietatea că suma diferențelor în modul a literelor vecine este egală cu numărul lui Arpsod. | ||
Line 11: | Line 12: | ||
Deci codul numelui FLAFFY este 41 | Deci codul numelui FLAFFY este 41 | ||
== Cerința == | |||
Arpsod vă oferă onoarea de a afla numele micuțului său animăluț. | Arpsod vă oferă onoarea de a afla numele micuțului său animăluț. | ||
== Date de intrare == | |||
În fișierul nume1.in, pe prima și singura linie, se va afla P, numărul protector dat de Arpsod. | În fișierul nume1.in, pe prima și singura linie, se va afla P, numărul protector dat de Arpsod. | ||
== Date de ieșire == | |||
În fișierul nume1out.txt, pe prima și singura linie se va afișa un șir de litere MARI ale alfabetului latin, cu proprietățile cerute în enunț. | |||
În fișierul | |||
== Restricții și precizări == | |||
Dacă șirul afișat are proprietățile de mai sus și este și minim lexicografic, primiți punctajul integral pe acel test. | * 1 ≤ P ≤ 4.000.000 | ||
* A = 1, B = 2, C = 3… Z = 26 | |||
* În cazul în care șirul afișat are suma corectă și număr minim de caractere, primiți 20% din punctajul pe acel test. | |||
* Dacă șirul afișat are proprietățile de mai sus și este și minim lexicografic, primiți punctajul integral pe acel test. | |||
* Un șir A este mai mic lexicografic decât un șir B dacă pe prima poziție unde A[i] ≠ B[i], A[i] < B[i]. | |||
== Exemplu: == | |||
'''nume1in.txt''' | |||
''' | |||
19 | 19 | ||
Line 43: | Line 36: | ||
808 | 808 | ||
'''nume1out.txt''' | |||
AT | AT | ||
Line 49: | Line 42: | ||
ARAZAZAZAZAZAZAZAZAZAZAZAZAZAZAZAY | ARAZAZAZAZAZAZAZAZAZAZAZAZAZAZAZAY | ||
== Explicație == | |||
În primul exemplu: A = 1, T = 20, |A – T| = |1 – 20| = 19 | În primul exemplu: A = 1, T = 20, |A – T| = |1 – 20| = 19 | ||
'''''<u>Rezolvare</u>'''''<syntaxhighlight lang="python"> | '''''<u>Rezolvare</u>'''''<syntaxhighlight lang="python"> | ||
def pot_pune(trebuie, c, last, lungime_optima, lungime_curenta): | def pot_pune(trebuie, c, last, lungime_optima, lungime_curenta): | ||
suma = abs(ord(last) - ord(c)) | |||
ramase = lungime_optima - lungime_curenta - 1 | ramase = lungime_optima - lungime_curenta - 1 | ||
if ramase > 0: | if ramase > 0: | ||
suma += max(abs(ord(c) - ord('A')), abs(ord(c) - ord('Z'))) | |||
ramase -= 1 | ramase -= 1 | ||
suma += ramase * 25 | |||
return suma >= trebuie | |||
return | |||
def validare_date(P): | |||
if 1 <= P <= 4000000: | |||
return True | |||
else: | |||
print("Eroare: P trebuie să fie în intervalul [1, 4.000.000]") | |||
return False | |||
def main(): | def main(): | ||
with open("nume1in.txt", "r") as fin, open("nume1out.txt", "w") as fout: | with open("nume1in.txt", "r") as fin, open("nume1out.txt", "w") as fout: | ||
P = int(fin.readline().strip()) | |||
if not validare_date(P): | |||
return | |||
N = int(fin.readline().strip()) | N = int(fin.readline().strip()) | ||
lungimea_optima = (N // 25) + 1 + (N % 25 != 0) | lungimea_optima = (N // 25) + 1 + (N % 25 != 0) | ||
last = 'A' | last = 'A' | ||
lungime_curenta = 1 | lungime_curenta = 1 | ||
fout.write('A') | fout.write('A') | ||
suma = 0 | suma = 0 | ||
while lungime_curenta < lungimea_optima: | while lungime_curenta < lungimea_optima: | ||
for i in range(ord('A'), ord('Z') + 1): | for i in range(ord('A'), ord('Z') + 1): | ||
i = chr(i) | i = chr(i) | ||
if pot_pune(N - suma, i, last, lungimea_optima, lungime_curenta): | if pot_pune(N - suma, i, last, lungimea_optima, lungime_curenta): | ||
if lungime_curenta == lungimea_optima - 1 and suma + abs(ord(last) - ord(i)) != N: | if lungime_curenta == lungimea_optima - 1 and suma + abs(ord(last) - ord(i)) != N: | ||
continue | continue | ||
suma += abs(ord(last) - ord(i)) | suma += abs(ord(last) - ord(i)) | ||
fout.write(i) | fout.write(i) | ||
lungime_curenta += 1 | lungime_curenta += 1 | ||
last = i | last = i | ||
break | break | ||
if __name__ == "__main__": | if __name__ == "__main__": | ||
main() | main() | ||
</syntaxhighlight> | </syntaxhighlight> |
Latest revision as of 10:58, 5 January 2024
Enunț[edit | edit source]
De ziua lui, vrăjitorul Arpsod a primit în dar un animăluț mic și pufos. Evident, acesta dorește să îi dea un nume. Pentru a fi protejat de răul și blaturile existente în Univers, Arpsod a decis să îi dea un nume strict legat de numărul său protector. Cunoscând numărul protector, numele animăluțului se va determina astfel: Va fi un șir de litere MARI ale alfabetului latin, de lungime minimă cu proprietatea că suma diferențelor în modul a literelor vecine este egală cu numărul lui Arpsod.
Concret: dacă avem numele FLAFFY, obținem:
|F – L| + |L – A| + |A – F| + |F – F| + |F – Y| =
= |6 – 12| + |12 – 1| + |1 – 6| + |6 – 6| + |6 – 25|=
= 6 + 11 + 5 + 0 + 19 = 41
Deci codul numelui FLAFFY este 41
Cerința[edit | edit source]
Arpsod vă oferă onoarea de a afla numele micuțului său animăluț.
Date de intrare[edit | edit source]
În fișierul nume1.in, pe prima și singura linie, se va afla P, numărul protector dat de Arpsod.
Date de ieșire[edit | edit source]
În fișierul nume1out.txt, pe prima și singura linie se va afișa un șir de litere MARI ale alfabetului latin, cu proprietățile cerute în enunț.
Restricții și precizări[edit | edit source]
- 1 ≤ P ≤ 4.000.000
- A = 1, B = 2, C = 3… Z = 26
- În cazul în care șirul afișat are suma corectă și număr minim de caractere, primiți 20% din punctajul pe acel test.
- Dacă șirul afișat are proprietățile de mai sus și este și minim lexicografic, primiți punctajul integral pe acel test.
- Un șir A este mai mic lexicografic decât un șir B dacă pe prima poziție unde A[i] ≠ B[i], A[i] < B[i].
Exemplu:[edit | edit source]
nume1in.txt
19
808
nume1out.txt
AT
ARAZAZAZAZAZAZAZAZAZAZAZAZAZAZAZAY
Explicație[edit | edit source]
În primul exemplu: A = 1, T = 20, |A – T| = |1 – 20| = 19
Rezolvare<syntaxhighlight lang="python"> def pot_pune(trebuie, c, last, lungime_optima, lungime_curenta):
suma = abs(ord(last) - ord(c)) ramase = lungime_optima - lungime_curenta - 1
if ramase > 0: suma += max(abs(ord(c) - ord('A')), abs(ord(c) - ord('Z'))) ramase -= 1
suma += ramase * 25
return suma >= trebuie
def validare_date(P):
if 1 <= P <= 4000000: return True else: print("Eroare: P trebuie să fie în intervalul [1, 4.000.000]") return False
def main():
with open("nume1in.txt", "r") as fin, open("nume1out.txt", "w") as fout: P = int(fin.readline().strip()) if not validare_date(P): return
N = int(fin.readline().strip()) lungimea_optima = (N // 25) + 1 + (N % 25 != 0) last = 'A' lungime_curenta = 1 fout.write('A')
suma = 0
while lungime_curenta < lungimea_optima: for i in range(ord('A'), ord('Z') + 1): i = chr(i)
if pot_pune(N - suma, i, last, lungimea_optima, lungime_curenta): if lungime_curenta == lungimea_optima - 1 and suma + abs(ord(last) - ord(i)) != N: continue
suma += abs(ord(last) - ord(i)) fout.write(i) lungime_curenta += 1 last = i break
if __name__ == "__main__":
main()
</syntaxhighlight>