Ці шахти завжди є суцільними лініями


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 через stdin (або найближчу альтернативу). Вихідні дані переходять до stdout (або найближчої альтернативи) і повинні містити лише пробіли, підкреслення та нові рядки з необов'язковим зворотним новим рядком.

Виграє найкоротший код.


Я не розумію, як це визначає просте число
Філіп Бартузі,

5
@FilipBartuzi Можливо, перевірити en.wikipedia.org/wiki/Sieve_of_Eratosthenes

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

6
Треба сказати, що мені особливо не подобається вимога "без затримки нового рядка". На деяких мовах це дуже важко, в інших - неможливо, і це впливає лише на програми, які друкуються до STDOUT.
Денніс

4
Опис мені було важко зрозуміти. Ось як би я це описав: Почніть з сітки з N рядків з N підкреслення. Для першого nрядка зробіть 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 | 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-Colorful Red © Highlight-Magic ™ ® Розширене видання ©: (клацніть мініатюру для збільшення)

Рубін з кольором, 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
Схоже, це має бути фрактал ...
Бета-розпад

Видаліть простір усередині потрійного до ' '. Це, мабуть, зіпсує ваш синтаксис-маркером, але він все ще працює належним чином. Також,a%b<1
Чорнило про вартість

*''буде працювати так само, як приєднання, і ви можете перевірити a<bзамість того, що a!=bжоден коефіцієнт a не перевищує a. Можливо, також можна заощадити від перерізання в дво символьний рядок з результатом деякої математики на a і b замість використання потрійного.
гістократ

5

J - 28 char

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

Пітон 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: Класно! Насправді я вперше використовую ці об'єднані порівняння.
Фалько

Я написав цей точний код символу для символу до найменувань var, включаючи 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-by-N
  • (... )/¨: для кожної пари координат застосуйте таку функцію:
    • У комірці повинно бути пробіл, якщо:
    • 0=|⍨: y modx = 0, і
    • : x не дорівнює y, і
    • 1≠⊢: x ні 1.
    • 1+: Додайте 1до отриманої бітової матриці, оскільки масиви APL починаються з 1.
  • '_ '[... ]: замініть кожну 1підкреслення та 2пробіл.

Мабуть, 28 - це чарівне число гольфу тут.

2

Перл,    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. Ви можете використовувати | замість ||.
Денніс

@Dennis - Дякую! Я застосував кілька таких. Я цього не робив -n, тому що хотів утримати його автономною програмою і не треба говорити $^N=1. Використання _як голослова спрацювало у випадку, $i==_але не спрацювало у випадку, $i%_тому що думка синтаксичного аналізатора %_- хеш.
Тодд Леман

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

@Dennis - о-о-лайно, ти маєш рацію. Я вніс редагування, ввів через матрицю діагональну лінію. Соромно за те, що я цього не спіймав. Виправлено. Я бачу, про що ти маєш на увазі _= "_"зараз. На жаль, він працює в останньому випадку, але дає мені помилку поруч із тим, 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, очевидно, не є правильним вибором мови для цього. Але для повноти, ось один із можливих способів зробити це в 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 (що створює сітку 1000 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.