программа схватки oneliner - PullRequest
       39

программа схватки oneliner

2 голосов
/ 14 ноября 2009

Это то время года, когда программисты хотят перетасовать список таким образом, чтобы ни один элемент не находился на своей первоначальной позиции (по крайней мере, в Нидерландах мы отмечаем Sinterklaas и выбираем соломинки для решения, кто пишет, кто стих). У кого-нибудь есть хороший Python единственный оператор для этого?

Итак, пример ввода: range(10)

Пример вывода: [2,8,4,1,3,7,5,9,6,0]

Неверный вывод будет [2,8,4,1,3,5,7,9,6,0], потому что 5 находится в исходном положении. Это означало бы, что человек 5 должен написать стихотворение самому себе, и это не так весело.

edit Многие люди повторяют задание столько раз, сколько необходимо, чтобы везет и считают, что на самом деле решение является удовлетворительным. Это плохой подход, так как в теории это может занять бесконечно много времени. Барт действительно предлагает лучший подход, но по той или иной причине я не могу понять это…

edit Под oneliner я подразумеваю отдельное утверждение . Как видно, Python также может сжимать несколько операторов в одной строке. Я этого не знал. В настоящее время есть очень хорошие решения, использующие только точку с запятой для имитации многострочного поведения в одной строке. Отсюда: «Вы можете сделать это в одном утверждении?»

Ответы [ 11 ]

0 голосов
/ 15 ноября 2009

Извините, это не однострочник, но это работает

import random
def sinterklaas(n):
    l=[]
    for a in range(n):
        l.append(-1)

    i = 0
    while i < 10:
        index = random.randint(0,n-1)
        if l[index] == -1 and index != i:
        l[index] = i
            i += 1

Приветствия

...