Как перемешать буквы в строке с гласным, изолированным в Python - PullRequest
0 голосов
/ 26 сентября 2019

Я создаю функцию

  1. Принимает ввод в виде строки.
  2. Возвращает строку.
  3. Возвращаемая строка будет иметь то же количество слов, что и входная строка, и те же буквы, что и входная строка, но отдельные слова могут бытьразной длины.т.е.

    perm_lets("try this") == "ist thry"
    

является допустимым возвращаемым значением.Под «числом слов» в строке X мы подразумеваем длину списка X.split(' '), т.е. на единицу больше, чем количество пробелов в строке.«Слово» означает строку букв без пробелов.И, наконец,

Каждый гласный звук должен быть изолирован, т. Е. Непосредственно рядом с гласными, у которых есть не более пробелов и / или согласных.

Моя функция может перетасовывать только буквы входной строки.Я хотел бы знать, как изолировать гласную

    import random as rd
    def perm_lets(input_string):
        nS = ''.join(rd.sample(input_string,len(input_string)))
        print(nS)

Я ожидаю, что вывод perm_lets ("это цикл") будет что-то вроде "si olo pitahs ", но фактический результат равен " ph siioaos lt " (пробелы в неправильном месте и гласные не изолированы).

Ответы [ 3 ]

1 голос
/ 26 сентября 2019

Рандомизация методом грубой силы с дисквалификационными тестами:

import re
import random
import time

def perm_lets(s):
    s = list(s)
    start = time.perf_counter()
    while True:
        random.shuffle(s)
        p = ''.join(s)
        if '  ' in p: continue                            # no spaces together
        if p.startswith(' ') or p.endswith(' '): continue # don't start or end with space
        if re.search(r'[aeiou]{2}',p): continue           # no vowels together
        elapsed = time.perf_counter() - start
        return p,elapsed

print(perm_lets('this is a loop'))
print(perm_lets('i bid you adieu'))

Вывод (4 прогона):

('sopihats o i l', 0.0009378000000026532)
('ade udo ibiyi u', 0.07766600000000068)
('i o ha tpsislo', 0.00026450000000011187)
('o adebudu iyi i', 0.00632540000000148)
('o la sstipi ho', 5.2900000000022374e-05)
('udobida eyi i u', 0.3843909999999937)     # 1/3 of a second for a tough sentence
('ipa hts o soli', 0.00028810000000589753)
('idida e obu uyi', 0.18083439999999484)

Примечание: «adieu louie» не имеет решения.

0 голосов
/ 26 сентября 2019

Вы можете сделать это так же

  • отдельные гласные и согласные с помощью регулярных выражений
  • объединить каждую гласную в согласную
  • перемешать результат до тех пор, пока результат не запустится /заканчивается пробелом и не имеет двух пробелов вместе
import random
import re

def perm_lets(st):
    ls = re.findall(r"([aeiouAEIOU])|(.)", st)
    vs, cs = [c for c,_ in ls if len(c)>0], [v for _,v in ls if len(v)>0]

    positions = list(range(len(cs)))
    result = ""
    for v in vs:
        if len(positions)==0:
            cs.append(" "+v)
        else:
            p = random.choice(positions)
            positions.remove(p)
            cs[p//2] += v

    while True:
        random.shuffle(cs)
        result = "".join(cs)
        if not (result.startswith(" ") or result.endswith(" ") or "  " in result):
            break

    return result



print(perm_lets("this is a loop"))

print(perm_lets("teis iou")) # more vowels than consonants

Выход

tp so hal osii
si u tei o

0 голосов
/ 26 сентября 2019

Вот один из способов попробовать то, что вам нужно.Отделяет гласные от согласных, перетасовывает их для случайности, застегивает гласные и согласные в неудачной попытке выделить гласные (но это не удастся, если есть слишком много больше гласных, чем согласные), случайным образом выбирает длину слова, гарантируя минимум один символ на слово, ичто количество выходных слов совпадает с количеством входных слов.

Вы, вероятно, могли бы лучше изолировать гласные, создав при необходимости больше одиночных гласных слов.Однако, в зависимости от соотношения гласных и согласных и количества слов, всегда будут сценарии, в которых вы не можете одновременно выделить гласные и вывести нужное количество слов.

from itertools import chain, zip_longest
from random import randint, random, shuffle

s = 'this is a loop'

vowels = []
consonants = []
for char in s.replace(' ', ''):
    if char in 'aeiouAEIOU':
        vowels.append(char)
    else:
        consonants.append(char)

shuffle(vowels)
shuffle(consonants)
if len(vowels) > len(consonants) or random() > 0.5:
    a, b = vowels, consonants
else:
    a, b = consonants, vowels

letters = ''.join([c for c in chain.from_iterable(zip_longest(a, b)) if c])
words = []
for i in range(s.count(' '), -1, -1):
    x = randint(1, len(letters) - i)
    words.append(letters[:x])
    letters = letters[x:]

s = ' '.join(words)
print(s)
# EXAMPLE RANDOM OUTPUT:
# si hipa lo tos
...