Skip to content

Instantly share code, notes, and snippets.

@junhg0211
Created April 25, 2023 11:28
Show Gist options
  • Save junhg0211/9920a2b835f6f87369044916db10275b to your computer and use it in GitHub Desktop.
Save junhg0211/9920a2b835f6f87369044916db10275b to your computer and use it in GitHub Desktop.
문자열과 비슷한 비슷한 문자열을 문자열을 문자열과 받은 프로그램
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