Учитывая число N , нарисуйте выровненную по левому краю N x N доску чисел, оставив 1 пустым (как пробел) (я покажу диаграммы с N = 5)
2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
Ваша задача - построить Сито Эратосфена, шаг за шагом. Сначала начните с 2. Это простое число, поэтому оставьте его там и замените все остальные числа, делимые на 2, соответствующим количеством пробелов.
2 3 5
7 9
11 13 15
17 19
21 23 25
Затем перейдите к следующему номеру без печати ( 3
в данном случае) и сделайте то же самое.
2 3 5
7
11 13
17 19
23 25
И так далее, пока вы не дойдете до N .
Сначала необходимо распечатать всю сетку, и каждый раз, когда вы переходите к новому номеру, печатайте доску со снятыми кратными числами. Убедитесь, что вы печатаете пустую строку между ними!
Примеры
Текст в скобках ()
только для справки, вам не нужно его печатать
N = 2:
2 (complete grid)
3 4
2 (remove multiples of 2)
3
N = 3:
2 3 (complete grid)
4 5 6
7 8 9
2 3 (remove multiples of 2)
5
7 9
2 3 (remove multiples of 3)
5
7
Помните, это код-гольф , поэтому выигрывает код с наименьшим количеством байтов.
N=10
,100
не простое, поэтому будут удалены в какой - то момент. Должны ли все числа быть дополнены до 3 символов, потому что100
имеет 3 цифры?Ответы:
Желе , 34 байта
Попробуйте онлайн!
Как это устроено
источник
Perl,
250243231202157 байтПроверьте текущий гольф онлайн! (не забудьте запустить как
perl -M5.010 main.pl
)Каждое из двух буквальных символов новой строки сохраняет 1 байт вместо \ n.
Пример вывода (ввод 7):
Я уверен, что не очень хорошо играл в гольф, поэтому, когда я вернусь домой, я еще раз посмотрю на это, чтобы увидеть, насколько я могу побриться.
Отредактируйте 1: -7 байт (изменив «print sprintf» на очевидный «printf»)
Редактировать 2: 12 байтов были сохранены, явно используя $ d в одном месте, где она была вызвана, вместо создания отдельной переменной, путем объединения некоторых объявлений и устранения одного из моих условий для
next
оператора внутри первогоforeach
цикла, добавив пробел где-то еще , Дополнительные 29 байтов были выведены путем преобразования двух циклов for в один цикл, исключив два объявления переменных и превративunless
операторы в операторы if-not. Объявление, аmy$e=$n*$n;
затем замена трех экземпляров $ n * $ n на $ e (что позволило мне отбросить парен для одного из них), привело к получению ± 0 байт, но я все равно сохранил его.Редактировать 3: Благодаря @Dada, еще 40 байтов были выведены из игры (объявления переменных, «foreach» становится «для», неявный $ _ в нескольких местах и сокращение размера оператора printf). Дополнительный 1 байт был сброшен путем превращения
if!($c%$p||$c==$p||$p==1)
вif!($p~~[(1,$_)]||$_%$p)
. К сожалению, [] вокруг массива необходимо, потому что оператор smartmatch ~~ все еще экспериментален и, похоже, не работает должным образом с реальными массивами, но вместо этого работает с ссылками на них. Еще 4 байта были удалены путем удаления двух точек с запятой и пустого набора кавычек после последнегоsay
.источник
my
). Используйте-p
флаг, чтобы иметьN
внутри$_
вместо использования$n=<>
. Напишитеfor
вместоforeach
(эта инструкция является эквивалентом). Удалите круглые скобки вокруг условия,if
которое находится в позиции модификатора оператора (например,if!$c%$n
вместоif(!$c%$n)
. Для инициализации не нужно использовать круглые скобки@a
:.@a=0..$e
Вы можете перейти кfor
переменной и$_
использовать вместо нее. Записатьprintf"%*s",1+length$e,$a[$c]
(документ `` sprintf` для подробностей об этом)*
)$"
вместо" "
.say""
вместоprint"\n"
(у вас есть буквальный символ новой строки в вашем коде, но я не могу написать его в комментарии) (вы добавите, чтобы добавить-M5.010
в командную строку, но это не считается в счетчике байтов). Вы, вероятно, можете использовать0..$e=$n*$n
чтобы сохранить один байт при инициализации$e
. Посмотрите на советы Perl гольфу , он содержит много полезных советов. Но приятно видеть нового игрока в Perl, добро пожаловать! :) (и простите мои орфографические ошибки, возможно, я слишком быстро написал свой предыдущий комментарий)if!$c%$n
, то! Оператор имеет приоритет над оператором%, так что технически это будетif((!$c)%$n)
ложью для всего, кроме $ c = 0 (что мне не нужно). Что касается других ваших советов, я посмотрю, что я могу сделать! Большое спасибо!!
, я не был на моем компьютере, чтобы проверить это. Вы должны быть в состоянии получить до 160 символов, я думаю.PHP, 155 байт
@Crypto -3 байта спасибо @Titus -6 байтов спасибо
Попытайся
Впервые я использую печать в состоянии после цикла
Сломать
Предыдущая версия 174 байта
источник
!($d<2||$a[$d]>0)
=>$d>1&&$a[$d]<1
$l=strlen($m)+1
до$l=log10($m)+2
$i=$d*$x=$d>1
вместо$i=$d<2?0:$d
и$x
для двух других случаев$d>1
$n*$n>=$i+=$d
вместо($i+=$d)<=$m=$n**2
и$n*$n
для другого случая$m
Groovy,
201195191 байтЭто абсолютный кластер ... Выравнивание по левому краю убило мой счетчик байтов. Но эй, это работает. Вот вывод для 4:
Ungolfed:
источник
Perl
115114113112 байтВключает +1 для
-a
Запустить с номером ввода на STDIN:
sieving.pl
:Нужен достаточно свежий Perl, что
-a
подразумевает-n
. Если ваш Perl слишком стар, добавьте-n
опцию.Печатает завершающий символ новой строки, который разрешен.
источник
Python 2,
199 202201 байт+3 байта (я не останавливался рано)
-1 байт благодаря @Oliver (пропустил пробел)
repl.it
источник
1
иfor
JavaScript (ES6),
190189 байтНепосредственно печатает на консоль.
демонстрация
Показать фрагмент кода
источник
Пакет, 464 байта
Это было несколько трудоемко. Объяснение: Начинается с возведения в квадрат,
n
чтобы можно было вычислить желаемую ширину столбцаc
и соответствующее количество отступовp
, используя цикл:l
. Затем внешний цикл от1
доn
запускается один раз для каждой сетки, вызывая подпрограмму:i
. Сначала проверяется значение, чтобы увидеть, является ли оно 1 или простым; если нет, то эта сетка пропускается. Внутренний цикл от1
доn*n
затем обрабатывает строки и столбцы сетки, вызывая подпрограмму:j
. Каждое значение проверяется, чтобы увидеть, является ли оно одним из простых чисел, найденных до сих пор, или если ни одно из найденных простых чисел не разделило его. Если это так, то значение объединяется с выходным буфером, который затем дополняется до желаемой ширины столбца. Буфер распечатывается и очищается каждыйn
линии, и дополнительная пустая строка добавляется в конце сетки.:f
Этикетке обозначает фактор проверки подпрограммы; f (x, y) добавляет 1 кf
каждому целому числу от 2 доx
деленияy
, исключаяy
себя.источник
R
195191185204 байтаСпасибо @Billywob за сохранение 6 дополнительных байтов!
С отступом, с новыми строками:
Использование:
источник
^
- единственный, который не векторизован при генерации последовательностей, используя:
которые вы можете использовать, например,1:2^2
чтобы получить1 2 3 4
. Во-вторых, если вы определите,a=b=1:n^2
вы можете позже использоватьfor(j in b)
вместо определения другого вектора для зацикливания. Должен сэкономить вам пару байтов.J 125 байтов
Это явно, не молчаливый J, но должен быть способ молчаливо сыграть в гольф.
использование
источник
Mathematica, 133 байта
источник
PHP,
155150147145142140 байтсломать
источник
$a[$i]="";
вместо того,unset($a[$i]);
чтобы сохранить 4 байта$i%$k<1
вместо того!($i%$k)
сохранения одного байта