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) No edit summary |
||
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 |
Revision as of 00:12, 3 January 2024
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.
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
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.
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ț.
Restricții și precizări
- 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
808
nume1out.txt
AT
ARAZAZAZAZAZAZAZAZAZAZAZAZAZAZAZAY
Explicație
Î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>