Эти простые числа всегда сплошные линии


12

Давайте создадим N × N сетку пробелов и подчеркиваний, которые можно использовать для визуального определения, является ли число простым числом. (N может быть любым положительным целым числом.)

Эта сетка имеет три простых правила:

  1. N-й столбец содержит повторяющиеся символы n - 1 подчеркивания, за которыми следует один пробел. Этот шаблон начинается в первой строке и останавливается, возможно, в середине шаблона в строке N. (Строки и столбцы индексируются 1).
  2. Первый столбец заменяется всеми подчеркиваниями вместо пробелов.
  3. Если где-то появляется пробел, индекс строки равен индексу столбца, он заменяется подчеркиванием.

Пример: N = 10

           1
  1234567890 <-- column indices
 1__________
 2__________
 3__________
 4_ ________
 5__________
 6_  _______
 7__________
 8_ _ ______
 9__ _______
10_ __ _____
 ^ row indices

Индексы только для ясности. Сама простая сетка (что должна вывести ваша программа):

__________
__________
__________
_ ________
__________
_  _______
__________
_ _ ______
__ _______
_ __ _____

Заметить, что:

  • Первый столбец подчеркивания.
  • Второй столбец идет с подчеркиванием, подчеркиванием и т. Д., За исключением подчеркивания в строке 2.
  • В третьем столбце подчеркивание подчеркивается пробелом, подчеркивание подчеркивается пробелом и т. Д., За исключением подчеркивания в строке 3.
  • и т.п.

Также обратите внимание, что кроме 1, только простые пронумерованные строки имеют подчеркивания в каждом столбце.

Поскольку подчеркивания охватывают всю ширину шрифта, каждая строка с простыми номерами образует непрерывную сплошную линию. Так что проверить, является ли число простым или нет, визуально довольно просто; просто проверьте, является ли его линия сплошной по всем столбцам. (На самом деле достаточно взглянуть на квадратный корень индекса строки, но вывод этой сетки кажется менее элегантным.)

программа

Напишите программу, которая будет рисовать эти сетки с заданным N через стандартный ввод (или ближайшую альтернативу). Выходные данные отправляются на стандартный вывод (или ближайшую альтернативу) и должны содержать только пробелы, подчеркивания и новые строки с необязательным завершающим символом новой строки.

Самый короткий код выигрывает.


Я не понимаю, как это определяет простое число
Филипп Бартузи

5
@FilipBartuzi Может быть проверить en.wikipedia.org/wiki/Sieve_of_Eratosthenes

«N-й столбец содержит повторяющуюся последовательность символов n - 1 подчеркивания, за которой следует один пробел». Так не должен ли столбец n = 1 быть всеми пробелами, а не подчеркиванием?
алгоритм

6
Должен сказать, что мне не особо нравится требование «не заканчивать перевод строки». Это очень сложно в некоторых языках, совершенно невозможно в других, и это влияет только на программы, которые печатают в STDOUT.
Деннис

4
Описание было трудно понять. Вот как я бы это описал: Начните с сетки из N строк из N подчеркиваний. В nстроке th сделайте kсимвол th пробелом, если kего делитель mне равен 1 или m.
Кейси Чу

Ответы:


7

CJam, 33 28 27 байт

q~,:)_f{f{md\1=+'_S?}0'_tN}

Попробуйте онлайн.

Как это устроено

q~        " Read one line from STDIN and evaluate it.                                     ";
,:)       " For “N”, push [ 1 ... N ].                                                    ";
_         " Push a copy.                                                                  ";
f{        " For each “I in [ 1 ... N ], push “I   [ 1 ... N ]”; then:                     ";
  f{      " For each “J in [ 1 ... N ], push “J   I”; then:                               ";
    md\   " Push “J % I   J / I”.                                                         ";
    1=+   " Calculate “J % I + (J / I == 1)”.                                             ";
    '_S?  " Push an underscore if the result is truthy and a space otherwise.             ";
  }       "                                                                               ";
  0'_t    " Replace the first character of the resulting array by an underscore.          ";
  N       " Push a newline.                                                               ";
}         "                                                                               ";

Пример запуска

$ cjam solid-primes.cjam <<< 10
__________
__________
__________
_ ________
__________
_  _______
__________
_ _ ______
__ _______
_ __ _____
$ cjam solid-primes.cjam <<< 100 | md5sum # trailing newline
e4396b316989813dada21141b569ccf9  -

Я отправлю объяснение, когда я закончу играть в гольф.
Деннис

9
33 байта, а вы еще не закончили игру в гольф ??

5

Рубин, 77 73 персонажа

puts (1..n=gets.to_i).map{|a|?_+(2..n).map{|b|a!=b&&a%b==0? ' ':?_}.join}

Некоторые трюки, которые я использовал:

  • ..Оператор имеет почти самый низкий приоритет всех операторов в Ruby, так (1..n=gets.to_i)просто работает.

  • Вместо добавления дополнительного a!=1условия при проверке, должен ли символ быть пробелом вместо подчеркивания (поскольку первая строка - все подчеркивания), я просто начал диапазон 2и добавлял дополнительный ?_.

  • Линия A может стать линией B:

    A | a%b==0&&a!=b ? ' ':?_
    B | a!=b&&a%b==0? ' ':?_
    

    потому что у меня должен быть дополнительный пробел между bи ?в строке A, но это не нужно между 0и ?в строке B. b?является допустимым методом Ruby, но 0?это не так.

  • putsавтоматически объединяет массивы с новыми строками для вас, устраняя необходимость в дополнительных *"\n".

Выход для n=100:

____________________________________________________________________________________________________
____________________________________________________________________________________________________
____________________________________________________________________________________________________
_ __________________________________________________________________________________________________
____________________________________________________________________________________________________
_  _________________________________________________________________________________________________
____________________________________________________________________________________________________
_ _ ________________________________________________________________________________________________
__ _________________________________________________________________________________________________
_ __ _______________________________________________________________________________________________
____________________________________________________________________________________________________
_   _ ______________________________________________________________________________________________
____________________________________________________________________________________________________
_ ____ _____________________________________________________________________________________________
__ _ _______________________________________________________________________________________________
_ _ ___ ____________________________________________________________________________________________
____________________________________________________________________________________________________
_  __ __ ___________________________________________________________________________________________
____________________________________________________________________________________________________
_ _  ____ __________________________________________________________________________________________
__ ___ _____________________________________________________________________________________________
_ ________ _________________________________________________________________________________________
____________________________________________________________________________________________________
_   _ _ ___ ________________________________________________________________________________________
____ _______________________________________________________________________________________________
_ __________ _______________________________________________________________________________________
__ _____ ___________________________________________________________________________________________
_ _ __ ______ ______________________________________________________________________________________
____________________________________________________________________________________________________
_  _  ___ ____ _____________________________________________________________________________________
____________________________________________________________________________________________________
_ _ ___ _______ ____________________________________________________________________________________
__ _______ _________________________________________________________________________________________
_ ______________ ___________________________________________________________________________________
____ _ _____________________________________________________________________________________________
_   _ __ __ _____ __________________________________________________________________________________
____________________________________________________________________________________________________
_ ________________ _________________________________________________________________________________
__ _________ _______________________________________________________________________________________
_ _  __ _ _________ ________________________________________________________________________________
____________________________________________________________________________________________________
_  __  ______ ______ _______________________________________________________________________________
____________________________________________________________________________________________________
_ _ ______ __________ ______________________________________________________________________________
__ _ ___ _____ _____________________________________________________________________________________
_ ____________________ _____________________________________________________________________________
____________________________________________________________________________________________________
_   _ _ ___ ___ _______ ____________________________________________________________________________
______ _____________________________________________________________________________________________
_ __ ____ ______________ ___________________________________________________________________________
__ _____________ ___________________________________________________________________________________
_ _ ________ ____________ __________________________________________________________________________
____________________________________________________________________________________________________
_  __ __ ________ ________ _________________________________________________________________________
____ _____ _________________________________________________________________________________________
_ _ __  _____ _____________ ________________________________________________________________________
__ _______________ _________________________________________________________________________________
_ __________________________ _______________________________________________________________________
____________________________________________________________________________________________________
_     ___ _ __ ____ _________ ______________________________________________________________________
____________________________________________________________________________________________________
_ ____________________________ _____________________________________________________________________
__ ___ _ ___________ _______________________________________________________________________________
_ _ ___ _______ _______________ ____________________________________________________________________
____ _______ _______________________________________________________________________________________
_  __ ____ __________ __________ ___________________________________________________________________
____________________________________________________________________________________________________
_ _ ____________ ________________ __________________________________________________________________
__ ___________________ _____________________________________________________________________________
_ __ _ __ ___ ____________________ _________________________________________________________________
____________________________________________________________________________________________________
_   _ _  __ _____ _____ ___________ ________________________________________________________________
____________________________________________________________________________________________________
_ __________________________________ _______________________________________________________________
__ _ _________ _________ ___________________________________________________________________________
_ _ ______________ __________________ ______________________________________________________________
______ ___ _________________________________________________________________________________________
_  __ ______ ____________ ____________ _____________________________________________________________
____________________________________________________________________________________________________
_ _  __ _ _____ ___ ___________________ ____________________________________________________________
__ _____ _________________ _________________________________________________________________________
_ ______________________________________ ___________________________________________________________
____________________________________________________________________________________________________
_   _  ____ _ ______ ______ _____________ __________________________________________________________
____ ___________ ___________________________________________________________________________________
_ ________________________________________ _________________________________________________________
__ _________________________ _______________________________________________________________________
_ _ ___ __ __________ _____________________ ________________________________________________________
____________________________________________________________________________________________________
_  _  __  ____ __ ___________ ______________ _______________________________________________________
______ _____ _______________________________________________________________________________________
_ _ __________________ ______________________ ______________________________________________________
__ ___________________________ _____________________________________________________________________
_ ____________________________________________ _____________________________________________________
____ _____________ _________________________________________________________________________________
_   _ _ ___ ___ _______ _______ _______________ ____________________________________________________
____________________________________________________________________________________________________
_ ____ ______ __________________________________ ___________________________________________________
__ _____ _ _____________________ ___________________________________________________________________
_ _  ____ _________ ____ ________________________ __________________________________________________

Теперь, включая Extra-Special ™ Mega-Colourful Red © Highlight-Magic ™ ® Extended Edition ©: (нажмите на изображение, чтобы его увеличить)

Рубин с цветом, 110 символов

puts (1..n=gets.to_i).map{|a|x=(2..n).map{|b|a!=b&&a%b==0? ' ':?_}.join;x.index(' ')??_+x :"\e[41m_#{x}\e[0m"}

Расширенная версия


1
Похоже, это должен быть фрактал ...
Beta Decay

Удалите пространство в тройной до ' '. Возможно, он испортил вашу подсветку синтаксиса, но все равно работает правильно. Кроме того,a%b<1
Value Ink

*''будет работать так же, как объединение, и вы можете проверить a<bвместо, a!=bтак как ни один из факторов больше, чем. Также может быть экономия от нарезки на двухсимвольную строку с результатом некоторой математики на a и b вместо использования троичного.
гистократ

5

J - 28 символов

1('_ '{~0==+&|:1&=+|/~)@:+i.

Объяснил взрывом:

1(                    )@:+i.  NB. on vector 1..n, do
                   |/~        NB. take the table "column modulo row"
               1&=+           NB. add 1 to column 1
          =                   NB. identity matrix of size 10
            &|:               NB. transpose both tables (now table is row mod col)
           +                  NB. add them
  '_ '{~0=                    NB. space if cell=0 else underscore

На что это похоже:

   1('_ '{~0==+&|:1&=+|/~)@:+i.25
_________________________
_________________________
_________________________
_ _______________________
_________________________
_  ______________________
_________________________
_ _ _____________________
__ ______________________
_ __ ____________________
_________________________
_   _ ___________________
_________________________
_ ____ __________________
__ _ ____________________
_ _ ___ _________________
_________________________
_  __ __ ________________
_________________________
_ _  ____ _______________
__ ___ __________________
_ ________ ______________
_________________________
_   _ _ ___ _____________
____ ____________________

4

Python 2, 76 71

r=range(1,input()+1)
for i in r:print''.join("_ "[i%j<1<j<i]for j in r)

Не уверен , что, если он может получить любое короче , чем это ... Эти ключевые слова: range, inputи printстоит довольно много.


3
Вы можете заменить i>j>1and i%j<1наi>j>1>i%j
seequ

@ Sieg: Круто! На самом деле, я впервые использую эти сравнения.
Фалько,

Я написал этот точный код символьно-символьный, вплоть до имен i%j<1<j<iпеременных , включая :-P. Так что, может быть, это действительно не становится короче.
xnor

На самом деле, я думаю (не проверено), вы можете сделать i%j<1. Это подразумевает i>=j.
Seequ

@Sieg: Да, но нам нужно i>j, i>=jчтобы не было пробелов по диагонали.
Фалько

3

APL (28)

'_ '[(1+(1≠⊢)∧≠∧0=|⍨)/¨⍳2⍴⎕]

Объяснение:

  • ⍳2⍴⎕: прочитать число N и составить координатную матрицу размером N на N
  • (... )/¨: для каждой пары координат примените следующую функцию:
    • В ячейке должен быть пробел, если:
    • 0=|⍨: y modx = 0 и
    • : x не равно y, и
    • 1≠⊢: х нет 1.
    • 1+: Добавить 1к результирующей битовой матрице, потому что массивы APL начинаются с 1.
  • '_ '[... ]: заменить каждый 1символ подчеркиванием и 2пробелом.

Видимо, 28 - это волшебный номер для игры в гольф.

2

Perl,    69   61

Обновленная версия (спасибо, Денис !)

$n=<>;for$i(1..$n){say"_".join"",map{$i%$_|$i==$_?_:$"}2..$n}

Оригинальная версия:

$n=<>;for$i(1..$n){say"_".join("",map{$i%$_||$i==$_?"_":" "}(2..$n))}

1
1. Ни скобки, joinни 2..$nнеобходимость 2. С -nпереключателем вы можете использовать $_вместо $n. 3. _является допустимым голым словом, поэтому оно не нуждается в кавычках. 4. Вы можете использовать $"вместо " ". 5. Вы можете использовать | вместо ||.
Деннис

@ Денис - Спасибо! Я применил несколько из них. Я этого не делал -n, потому что хотел сохранить программу в отдельности и не сказать ничего $^N=1. Использование _в качестве голого слова работало в случае, $i==_но не работало в случае, $i%_потому что парсер считал %_хеш.
Тодд Леман

1
1. Вы можете хранить его самостоятельно с помощью шебанга ( #!/bin/perl -nобычно считается за 1 байт), но это, очевидно, зависит от вас. Я понятия не имею, что $^N=1... 2. $i==_не будет работать должным образом; это будет проверять, если $i == "_". То, что я имел в виду, использует _вместо "_", то есть, say _и $i==$_?_:$".
Деннис

@ Денис - ооооооо, ты прав. Правка, которую я сделал, ввела диагональную линию через матрицу. Позор мне, что я не уловил это. Исправлена. Я понимаю, что вы имеете в виду _= "_"сейчас. К сожалению, это работает в последнем случае, но выдает ошибку рядом с тем, sayпотому что кажется, что это файловый дескриптор.
Тодд Леман

2

CJam, 27 байтов

q~:I,{__I?'_*S+I*I<'_t}%zN*

Попробуйте онлайн.

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

Как это устроено

q~:I                         " Read an integer I from STDIN.                              ";
    ,{                }%     " For each J ∊ {1,...,I}:                                    ";
          '_*S+              " Push J - 1 underscores followed by a space.                ";
               I*I<          " Repeat the pattern to complete I characters.               ";
       _I?                   " For the first row, replace all spaces with underscores.    ";
      _            '_t       " Replace the Jth character by an underscore.                ";
                        zN*  " Transpose rows and columns; separate with linefeeds.       ";

Пример запуска

$ cjam prime-lines.cjam <<< 10; echo
__________
__________
__________
_ ________
__________
_  _______
__________
_ _ ______
__ _______
_ __ _____
$ cjam prime-lines.cjam <<< 100 | md5sum # no trailing newline
83c7b974e1510f482322456a9dbb461f  -

1

С, 143

С явно не правильный выбор языка для этого. Но для полноты, вот один из возможных способов сделать это на C. Работает для значений n до 1048575. Считывает n из стандартного ввода.

#include <stdio.h>
main(){int n,i=0,j;scanf("%d",&n);char x[1<<20];x[n+1]=0;
for(;++i<=n;){for(j=0;++j<=n;)x[j]=i%j|i==j|j==1?95:32;puts(x+1);}}

Это очень быстро, однако.

  • Время выполнения для n = 1 000 000 (что дает сетку из 1 000 000 000 000 элементов) в моей системе составляет приблизительно 55 минут.

  • Время выполнения для n = 1000 (который создает сетку из 1 000 000 элементов) составляет менее 1/100 секунды.


4
1. Включение не требуется для некоторых компиляторов (например, GCC), поэтому вы можете удалить его. 2. Глобальные переменные инициализируются в 0 и по умолчанию int, так что вы можете использовать char x[1<<20];n,i,j;main.... 3. for(scanf("%d",&n);i++<n;)сохраняет два байта scanf("%d",&n);for(;++i<=n;).
Деннис
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.