История:
Люси спросила Джорджа, каков его счастливый номер. После некоторого размышления Джордж ответил, что у него есть несколько счастливых номеров. После некоторого недоразумения Люси спросила Джорджа, какие у него первые n
счастливые числа. Затем Джордж попросил вас, его приятель, написать ему программу, которая сделает всю работу за него.
Соревнование:
Вы напишите программу / функцию, которая получит из стандартного аргумента ввода / функции строку или целое число n
. Затем программа / функция вернет / выведет первые n
счастливые числа . Счастливые числа определяются через сито следующим образом.
Начните с положительных целых чисел:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, ...
Теперь удалите каждый второй номер:
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, ...
Второе оставшееся число - 3 , поэтому удалите каждое третье число:
1, 3, 7, 9, 13, 15, 19, 21, 25, ...
Теперь следующим оставшимся числом является 7 , поэтому удалите каждое седьмое число:
1, 3, 7, 9, 13, 15, 21, 25, ...
Далее убираем каждый девятый номер и так далее. Полученная последовательность - счастливые числа.
Выигрыш:
Как обычно для Codegolf, побеждает меньшее количество байтов.
Как обычно, заявки с использованием стандартных лазеек дисквалифицируются.
источник
Ответы:
Python 2, 79
Волшебство итерации по списку, поскольку цикл изменяет его!
Список
L
начинается со всех целых чисел1
до достаточно высокого значения. Код перебирает каждый элементr
изL
, принимая подсписок каждогоr
«го элемента и удаление каждого из этих значений. В результате удаленные значения не повторяются. В конце напечатайте первыеn
элементы.Выражение
map(A.remove,B)
- это трюк, который я долго ждал, чтобы использовать. Он вызываетA.remove
каждый элементB
, который вызываетB
удаление всех элементовA
. По сути, он принимает разницу в списке, хотя онB
должен быть подспискомA
. Требуется Python 2, так как Python 3 фактически не будет оценивать карту.Первый цикл должен быть в специальном случае для преобразования
r
из1
в2
, какr+=r<2
.Достаточно высокая верхняя граница
2**n
делает программу очень медленной для больших значенийn
. Использованиеn*n+1
достаточно, но стоит персонажа. Обратите внимание, чтоn*n
это не работает дляn=1
.источник
n**2
цифры, а не2**n
map
ваших чудесных применений . Мне было интересно, был ли лучший способ ...n**2+1
если делоn=1
не будет прощено.map(A.index,B)
найти индексы элементов B в A,map(A.count,B)
чтобы найти количество элементов B в A,map(A.extend,B)
чтобы добавить сплющенный список B к A. Разум поражает.Haskell,
7169 байтОпределяет функцию
f
. Выражение1:s[3,5..]3
оценивается как бесконечный список счастливых чисел иf
просто берет первоеn
из нихtake n
.Я мог сбрить 5 байтов с сита, используя параллельное понимание списка
но это потребовало бы передачи флага огромного компилятора
-XParallelListComp
в GHC, чтобы включить расширение.Объяснение сита
Основная идея состоит в том, что оно
s(n:k)p
создает(p-1)
счастливое числоn
, отбрасывает каждоеn
число из бесконечного хвостаk
(смещаетсяp
на счет ранее произведенных чисел) и возвращается к этому списку с накопителем(p+1)
. Вf
, мы инициализируем процесс с нечетными числами, начиная с3
, и придерживаемся1
вперед, получая в точности счастливые числа.источник
Python 2,
71 6967Сначала я думал, что это будет большой проблемой для нарезки массивов в Python. Однако я столкнулся с камнем преткновения, когда обнаружил, что для срезов с шагом, отличным от 1, может быть назначен только другой срез одинаковой длины. Но после поиска в Google «python remove slice» моя вера была восстановлена: я обнаружил странное
del
утверждение, которое отлично справляется с задачей.Старая версия
-2 байта благодаря Sp3000.
источник
> <> ,
121114111 байтУ меня есть только несколько слов, чтобы сказать ...
... "Мое сознание болит."
объяснение
> <> является двумерным эзотерическим языком программирования и определенно не подходит для этой задачи из-за отсутствия массивов. Фактически, единственный тип данных в> <> - это странное сочетание int / float / char, и все происходит в стеке стеков.
Вот краткое изложение:
Вот фиктивный пример, который примерно показывает, как работает просеивание (вот
k
счастливое число, с которым мы просеиваем):источник
nao
видимому, можно интерпретировать как «напечатать эту вещь сейчас».CJam - 25
Попробуйте онлайн
Объяснение:
Эта реализация не удаляет числа последовательно из массива, но вычисляет каждое число на основе того, сколько было бы удалено до него.
Для каждого индекса i (от 0 до n-1) и каждого предыдущего счастливого числа l в обратном порядке мы увеличиваем i на i / (l-1), за исключением того, что для l = 1 мы используем 1 вместо 0, а также добавляем 1 в конце.
Например, для i = 4 мы имеем первые 4 числа [1 3 7 9] и вычисляем:
4 + 4 / (9-1) = 4
4 + 4 / (7-1) = 4
4 + 4 / (3 -1) = 6
6 + 6/1 = 12
12 + 1 = 13
источник
Pyth:
2322 байтаПопробуйте онлайн: Pyth Compiler / Executor
Объяснение:
На самом деле при уменьшении вычисляется больше, чем
Q
счастливых чисел (команда удаления вызывается Q + 1 раз, Q-1 должно быть достаточно).источник
R, 58 байт
С переносами строк:
Предыдущая версия, 62 байта
Предыдущая версия, 78 байт
источник
n=as.numeric(readline())
наfunction(n){...}
. Это создает объект функции, который может быть назначен и вызван. Оставьте фигурные скобки вfor
петле.n=scan(n=1)
?CJam,
3230 байтПринимает участие от STDIN.
Объяснение кода :
Попробуйте онлайн здесь
источник
Python 2,
105101 байтПросто прямая реализация.
Pyth,
39363532 байтаАналогичен подходу выше, но вещи индексируются 0, а не 1. Попробуйте онлайн .
Спасибо @Jakube за указание на сохранение байтов.
источник
Mathematica, 80 байт
Прямая реализация определения. Как и некоторые другие ответы, начинается с диапазона от
1
до, а затем продолжает фильтрацию.n2
источник
Perl,
86817886:
UPDATE: очевидно,
grep{...}
лучше , чемmap{...?$_:()}
81:ОБНОВЛЕНИЕ: хорошо, фактически однострочник теперь. Я могу остановиться. (?) 78:
источник
Октава,
1398372Ungolfed:
источник
J,
6052 байтаПояснение (справа налево):
2,1+2*i.@*:@>:
кажется слишком долго , но я могу только сократить его на 1 байты подкачки*:
с!
созданием список растет в геометрической прогрессии.источник
JavaScript (ES6) 96
99Редактировать отсчет в первом цикле - спасибо @DocMax
Ungolfed
Тест в консоли Firefox / FireBug
Выход
источник
F=n=>{for(o=[1],i=n*n;--i;)o[i]=2*i+1;for(;++i<n;o=o.filter((x,j)=>++j%o[i]));return o.slice(0,n)}
Matlab, 104 байта
Спасибо @flawr за очень подходящие комментарии и предложения.
Пример из командной строки Matlab:
источник
Bash + coreutils, 136
Я надеялся играть в гольф больше, ну да ладно. Не каждый день, когда вы добавляете рекурсивную функцию в сценарий оболочки:
Выход:
Bash + coreutils, 104
Короче, используя более простую реализацию:
источник
Go, 326
Прямая реализация с использованием рутин и труб для изготовления сит.
источник
MATLAB, 62 символа
Сначала я неверно истолковал проблему - теперь моя пересмотренная версия на самом деле короче.
источник
Ракетка 196 байт
Выдает счастливые числа вплоть до:
Безголовая версия:
Тестирование:
Выход:
источник