Created
April 25, 2023 11:28
-
-
Save junhg0211/9920a2b835f6f87369044916db10275b to your computer and use it in GitHub Desktop.
문자열과 비슷한 비슷한 문자열을 문자열을 문자열과 받은 프로그램
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from sys import stderr | |
from random import choice, randrange | |
Relations = dict[str, dict[str, int]] | |
def get_string() -> str: | |
""" 표준입력으로 받은 문자열을 반환한다. """ | |
string = '' | |
while True: | |
try: | |
string += (line := input()) + '\n' | |
except EOFError: | |
break | |
if '$' in line: | |
stderr.write("'$' cannot be contained.\n") | |
return | |
if string.endswith('\n'): | |
string = string[:-1] + '$' | |
else: | |
string = string + '$' | |
assert len(string) >= 2 | |
return '^' + string | |
def get_relations(string: str) -> Relations: | |
""" 문자열을 분석하여 글자간 연결 빈도를 반환한다. """ | |
relations = dict() | |
previous = string[0] | |
for i in range(1, len(string)): | |
letter = string[i] | |
if previous in relations: | |
relations[previous][letter] = relations[previous].get(letter, 0) + 1 | |
else: | |
relations[previous] = {letter: 1} | |
previous = letter | |
return relations | |
def get_letter(relations: Relations, letter: str) -> str: | |
""" 문자열 연결 빈도를 기반으로 하여 ``letter`` 다음에 올 것으로 예상되는 문자를 반환한다. """ | |
relation = relations.get(letter) | |
total = sum(relation.values()) | |
value = randrange(total) | |
for k, v in relation.items(): | |
value -= v | |
if value < 0: | |
return k | |
def generate_string(relations: Relations) -> str: | |
""" 문자열 연결 빈도를 통해 문자열을 생성한다. """ | |
string = ['^'] | |
while string[-1] != '$': | |
letter = get_letter(relations, string[-1]) | |
string.append(letter) | |
return ''.join(string[1:-1]) | |
def main(): | |
string = get_string() | |
relations = get_relations(string) | |
generated = generate_string(relations) | |
print(generated) | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment