Давайте создадим N × N сетку пробелов и подчеркиваний, которые можно использовать для визуального определения, является ли число простым числом. (N может быть любым положительным целым числом.)
Эта сетка имеет три простых правила:
- N-й столбец содержит повторяющиеся символы n - 1 подчеркивания, за которыми следует один пробел. Этот шаблон начинается в первой строке и останавливается, возможно, в середине шаблона в строке N. (Строки и столбцы индексируются 1).
- Первый столбец заменяется всеми подчеркиваниями вместо пробелов.
- Если где-то появляется пробел, индекс строки равен индексу столбца, он заменяется подчеркиванием.
Пример: N = 10
1
1234567890 <-- column indices
1__________
2__________
3__________
4_ ________
5__________
6_ _______
7__________
8_ _ ______
9__ _______
10_ __ _____
^ row indices
Индексы только для ясности. Сама простая сетка (что должна вывести ваша программа):
__________
__________
__________
_ ________
__________
_ _______
__________
_ _ ______
__ _______
_ __ _____
Заметить, что:
- Первый столбец подчеркивания.
- Второй столбец идет с подчеркиванием, подчеркиванием и т. Д., За исключением подчеркивания в строке 2.
- В третьем столбце подчеркивание подчеркивается пробелом, подчеркивание подчеркивается пробелом и т. Д., За исключением подчеркивания в строке 3.
- и т.п.
Также обратите внимание, что кроме 1, только простые пронумерованные строки имеют подчеркивания в каждом столбце.
Поскольку подчеркивания охватывают всю ширину шрифта, каждая строка с простыми номерами образует непрерывную сплошную линию. Так что проверить, является ли число простым или нет, визуально довольно просто; просто проверьте, является ли его линия сплошной по всем столбцам. (На самом деле достаточно взглянуть на квадратный корень индекса строки, но вывод этой сетки кажется менее элегантным.)
программа
Напишите программу, которая будет рисовать эти сетки с заданным N через стандартный ввод (или ближайшую альтернативу). Выходные данные отправляются на стандартный вывод (или ближайшую альтернативу) и должны содержать только пробелы, подчеркивания и новые строки с необязательным завершающим символом новой строки.
Самый короткий код выигрывает.
n
строке th сделайтеk
символ th пробелом, еслиk
его делительm
не равен 1 илиm
.Ответы:
CJam,
332827 байтПопробуйте онлайн.
Как это устроено
Пример запуска
источник
Рубин,
7773 персонажаНекоторые трюки, которые я использовал:
..
Оператор имеет почти самый низкий приоритет всех операторов в Ruby, так(1..n=gets.to_i)
просто работает.Вместо добавления дополнительного
a!=1
условия при проверке, должен ли символ быть пробелом вместо подчеркивания (поскольку первая строка - все подчеркивания), я просто начал диапазон2
и добавлял дополнительный?_
.Линия A может стать линией B:
потому что у меня должен быть дополнительный пробел между
b
и?
в строке A, но это не нужно между0
и?
в строке B.b?
является допустимым методом Ruby, но0?
это не так.puts
автоматически объединяет массивы с новыми строками для вас, устраняя необходимость в дополнительных*"\n"
.Выход для
n=100
:Теперь, включая Extra-Special ™ Mega-Colourful Red © Highlight-Magic ™ ® Extended Edition ©: (нажмите на изображение, чтобы его увеличить)
Рубин с цветом, 110 символов
источник
' '
. Возможно, он испортил вашу подсветку синтаксиса, но все равно работает правильно. Кроме того,a%b<1
*''
будет работать так же, как объединение, и вы можете проверитьa<b
вместо,a!=b
так как ни один из факторов больше, чем. Также может быть экономия от нарезки на двухсимвольную строку с результатом некоторой математики на a и b вместо использования троичного.J - 28 символов
Объяснил взрывом:
На что это похоже:
источник
Python 2,
7671Не уверен , что, если он может получить любое короче , чем это ... Эти ключевые слова:
range
,input
иprint
стоит довольно много.источник
i>j>1and i%j<1
наi>j>1>i%j
i%j<1<j<i
переменных , включая :-P. Так что, может быть, это действительно не становится короче.i%j<1
. Это подразумеваетi>=j
.i>j
,i>=j
чтобы не было пробелов по диагонали.APL (28)
Объяснение:
⍳2⍴⎕
: прочитать число N и составить координатную матрицу размером N на N(
...)/¨
: для каждой пары координат примените следующую функцию:0=|⍨
: ymod
x = 0 и≠
: x не равно y, и1≠⊢
: х нет1
.1+
: Добавить1
к результирующей битовой матрице, потому что массивы APL начинаются с 1.'_ '[
...]
: заменить каждый1
символ подчеркиванием и2
пробелом.источник
Perl,
6961Обновленная версия (спасибо, Денис !)
Оригинальная версия:
источник
join
ни2..$n
необходимость 2. С-n
переключателем вы можете использовать$_
вместо$n
. 3._
является допустимым голым словом, поэтому оно не нуждается в кавычках. 4. Вы можете использовать$"
вместо" "
. 5. Вы можете использовать|
вместо||
.-n
, потому что хотел сохранить программу в отдельности и не сказать ничего$^N=1
. Использование_
в качестве голого слова работало в случае,$i==_
но не работало в случае,$i%_
потому что парсер считал%_
хеш.#!/bin/perl -n
обычно считается за 1 байт), но это, очевидно, зависит от вас. Я понятия не имею, что$^N=1
... 2.$i==_
не будет работать должным образом; это будет проверять, если$i == "_"
. То, что я имел в виду, использует_
вместо"_"
, то есть,say _
и$i==$_?_:$"
._
="_"
сейчас. К сожалению, это работает в последнем случае, но выдает ошибку рядом с тем,say
потому что кажется, что это файловый дескриптор.CJam, 27 байтов
Попробуйте онлайн.
Этот подход достигает того же количества байтов, что и мой другой ответ, но я подумал, что в любом случае стоит опубликовать. Вместо того, чтобы отмечать правильные кратные значения в каждой строке, он делает именно то, что говорит спецификация.
Как это устроено
Пример запуска
источник
С, 143
С явно не правильный выбор языка для этого. Но для полноты, вот один из возможных способов сделать это на C. Работает для значений n до 1048575. Считывает n из стандартного ввода.
Это очень быстро, однако.
Время выполнения для n = 1 000 000 (что дает сетку из 1 000 000 000 000 элементов) в моей системе составляет приблизительно 55 минут.
Время выполнения для n = 1000 (который создает сетку из 1 000 000 элементов) составляет менее 1/100 секунды.
источник
int
, так что вы можете использоватьchar x[1<<20];n,i,j;main...
. 3.for(scanf("%d",&n);i++<n;)
сохраняет два байтаscanf("%d",&n);for(;++i<=n;)
.