Python Сравнение последовательных элементов в списке и удаление одного, если они совпадают - PullRequest
0 голосов
/ 30 июня 2018

Это попытка генератора рубика Cube scramble. Я иногда получаю повороты одного и того же лица, например, один за другим (R, R '). Я попытался исправить это с помощью цикла for и while, но это не сработало.

import random
def getscramble():
  moves = ["R","F","U","L","B","D"]
  scramble = []
  finascramble = []

  for x in range(25):
     scramble.append(random.choice(moves))


  for x in range(0,len(scramble)-1):
      if scramble[x] == scramble[x+1]:
        scramble[x] = random.choice(moves)

  for x in range(0,len(scramble)-1):
     if scramble[x] == "R" and scramble[x+1] == "L":
          scramble[x+1] = random.choice(moves)
     if scramble[x] == "U" and scramble[x+1]== "D":
          scramble[x+1] == random.choice(moves)
     if scramble[x] == "F" and scramble[x+1] == "B":
          scramble[x+1] == random.choice(moves)

  modifiers = ["","2","'"]

  for x in range(25):
    randy = random.randint(0,2)
    finascramble.append(scramble[x]+modifiers[randy])
  return " ".join(finascramble)

t = True
while t == True:
  again = input()
  if again == "s":
       print()
       print(getscramble())

Ответы [ 3 ]

0 голосов
/ 01 июля 2018

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

import random

moves = ("R", "F", "U", "L", "B", "D")
modifiers = ("", "2", "'")


def getscramble(n=25):

    scramble = random.choices(moves, k=n)

    def is_valid(c, c2):
        together = c + c2
        return (c != c2 and together not in
                ("RL", "UD", "FB", "LR", "DU", "BF"))

    for x in range(1, n):
        before = scramble[x - 1]
        current = scramble[x]
        while not is_valid(before, current):
            current = scramble[x] = random.choice(moves)

    for i, x in enumerate(random.choices(modifiers, k=n)):
        scramble[i] += x

    return " ".join(scramble)
0 голосов
/ 01 июля 2018

Вы не можете добавить список, если последнее добавленное значение было таким же.

Вот лучший цикл while, который делает то, что вы хотите:

i = len(scramble)
while i < 25:
    current_face = random.choice(moves)
    if i == 0:
        scramble.append(current_face)
    elif scramble[i - 1] == current_face:
        continue
    else:
        scramble.append(current_face)
    i += 1
    print(' '.join(scramble))

Этот цикл гарантирует, что список имеет фиксированную длину. Вы можете добавить свои модификаторы в этот список.

Но .. Если вы не женаты на концепции использования модификаторов, лучшее, что можно сделать ради случайности и простоты, - это использовать приведенный выше цикл с длинным списком со всеми возможными перестановками.

import random


def getscramble():
    moves = ["R", "F", "U", "L", "B", "D",
             "R'", "F'", "U'", "L'", "B'", "D'",
             "R2", "F2", "U2", "L2", "B2", "D2"]
    scramble = []

    i = len(scramble)
    while i < 25:
        curent_face = random.choice(moves)
        if i == 0:
            scramble.append(curent_face)
        elif (scramble[i - 1])[0] == curent_face[0]:
            continue
        else:
            scramble.append(curent_face)
        i += 1

     print(' '.join(scramble))


 getscramble()

Вывод вышеуказанного кода:

L' R D2 U L' U' F R2 L' U2 D' R' F' B2 F2 L2 R' D' L2 F' U2 F U2 R D

0 голосов
/ 30 июня 2018

Предлагаю вам это решение:

import random

MOVES = ['R', 'L', 'D', 'U', 'B', 'F']
MODFIERS = ['', '2', "'"]


def getScramble(length=25):
    return ''.join([random.choice(MOVES) for _ in range(length)])


def isValid(scramble):
    for seq in ['LR', 'DU', 'BF'] + [move * 2 for move in MOVES]:
        if seq in scramble or seq[::-1] in scramble:
            return False
    return True


while True:
    scramble = getScramble()
    if isValid(scramble):
        break

scramble = ' '.join([move + random.choice(MODFIERS) for move in scramble])
print(scramble)
...