Vamos criar uma grade N × N de espaços e sublinhados que podem ser usados para determinar visualmente se um número é primo. (N pode ser qualquer número inteiro positivo.)
Essa grade possui três regras simples:
- A enésima coluna contém o padrão repetido de n - 1 sublinhados seguido por um espaço. Esse padrão inicia na primeira linha e é interrompido, possivelmente no meio do padrão, na linha N. (Linhas e colunas são indexadas 1).
- A primeira coluna é substituída por todos os sublinhados em vez de todos os espaços.
- Se ocorrer um espaço em algum lugar, o índice da linha é igual ao índice da coluna, sendo substituído por um sublinhado.
Exemplo: N = 10
1
1234567890 <-- column indices
1__________
2__________
3__________
4_ ________
5__________
6_ _______
7__________
8_ _ ______
9__ _______
10_ __ _____
^ row indices
Os índices são apenas para maior clareza. A grade simples (o que seu programa deve gerar) é:
__________
__________
__________
_ ________
__________
_ _______
__________
_ _ ______
__ _______
_ __ _____
Notar que:
- A primeira coluna é todos os sublinhados.
- A segunda coluna coloca espaço sublinhado, espaço sublinhado, etc., exceto o sublinhado na linha 2.
- A terceira coluna apresenta sublinhado, espaço sublinhado, espaço sublinhado, etc., exceto o sublinhado na linha 3.
- etc.
Observe também que, além de 1, apenas as linhas com números primos têm sublinhados em todas as colunas.
Como os sublinhados abrangem toda a largura da fonte, cada linha numerada principal forma uma linha contínua e sólida. Portanto, verificar se um número é primo ou não é bastante fácil visualmente; basta verificar se sua linha é sólida em todas as colunas. (De fato, basta olhar para a raiz quadrada do índice de linha, mas produzir essa grade parece menos elegante.)
Programa
Escreva um programa que desenhe essas grades dadas N via stdin (ou alternativa mais próxima). A saída vai para stdout (ou alternativa mais próxima) e deve conter apenas espaços, sublinhados e novas linhas, com uma nova linha à direita opcional.
O código mais curto vence.
n
linha th, torne ok
th caractere um espaço sek
for um divisorm
que não seja 1 oum
.Respostas:
CJam,
332827 bytesExperimente online.
Como funciona
Exemplo de execução
fonte
Ruby,
7773 caracteresAlguns truques que usei:
O
..
operador tem quase a menor precedência de todos os operadores no Ruby, portanto,(1..n=gets.to_i)
apenas funciona.Em vez de adicionar uma
a!=1
condição extra ao verificar se o caractere deve ser um espaço em vez de um sublinhado (como a primeira linha é toda sublinhada), iniciei o intervalo2
e acrescentei um extra?_
.A linha A pode se tornar a linha B:
porque eu tenho que ter um espaço extra entre
b
e?
na linha A, mas isso não é necessário entre0
e?
na linha B.b?
é um método Ruby válido, mas0?
não é.puts
juntará automaticamente matrizes com novas linhas para você, eliminando a necessidade de um extra*"\n"
.Saída para
n=100
:Agora, incluindo o vermelho extra especial Special Mega-Highlight © Highlight-Magic ™ Extended Edition ©: (clique na miniatura para ampliar)
Rubi com cor, 110 caracteres
fonte
' '
. Provavelmente atrapalha seu marcador de sintaxe, mas ainda funciona corretamente. Além disso,a%b<1
*''
funcionará da mesma maneira que ingressar, e você pode procurar por, ema<b
vez de,a!=b
já que nenhum fator de a é maior que a. Também pode haver economia ao cortar em uma sequência de dois caracteres com o resultado de algumas contas matemáticas em eb em vez de usar um ternário.J - 28 car
Explicado por explosão:
O que isso parece:
fonte
Python 2,
7671Não tenho certeza se ele pode ficar mais curto do que isso ... Essas palavras-chave:
range
,input
eprint
custam muito.fonte
i>j>1and i%j<1
pori>j>1>i%j
i%j<1<j<i
:-P. Então talvez não fique mais curto.i%j<1
. Isso implicai>=j
.i>j
, nãoi>=j
evitar espaços em branco na diagonal.APL (28)
Explicação:
⍳2⍴⎕
: leia um número N e faça uma matriz de coordenadas N por N(
...)/¨
: para cada par de coordenadas, aplique a seguinte função:0=|⍨
: ymod
x = 0 e≠
: x não é igual a y, e1≠⊢
: x não é1
.1+
: Adicione1
à matriz de bits resultante porque as matrizes APL começam em 1.'_ '[
...]
: substitua cada1
um por um sublinhado e2
por um espaço.fonte
Perl,
6961Versão atualizada (obrigado, Dennis !)
Versão original:
fonte
join
nem2..$n
entre parênteses. 2. Com o-n
switch, você pode usar em$_
vez de$n
. 3._
é uma palavra de ordem válida, portanto não precisa de aspas. 4. Você pode usar em$"
vez de" "
. 5. Você pode usar em|
vez de||
.-n
coisa porque queria manter um programa independente e não tenho que dizer$^N=1
. O uso de_
como uma palavra de barra funcionou no caso de,$i==_
mas não funcionou no caso de,$i%_
porque o analisador pensou que%_
era um hash.#!/bin/perl -n
geralmente é contado como 1 byte), mas isso depende obviamente de você. Não tenho idéia do que$^N=1
faz ... 2.$i==_
não funcionará corretamente; testará se$i == "_"
. O que eu quis dizer é usar em_
vez de"_"
, ie,say _
e$i==$_?_:$"
._
="_"
agora. Infelizmente, ele funciona no último caso, mas gera um erro próximo ao,say
porque parece achar que é uma manipulação de arquivo.CJam, 27 bytes
Experimente online.
Essa abordagem atinge a mesma contagem de bytes que minha outra resposta, mas achei que valeria a pena postar de qualquer maneira. Em vez de marcar múltiplos adequados em cada linha, ele faz exatamente o que a especificação diz.
Como funciona
Exemplo de execução
fonte
C, 143
C não é, obviamente, a escolha certa do idioma para isso. Mas, para completar, eis uma maneira possível de fazê-lo no C. Funciona para valores de n até 1048575. Lê n da entrada padrão.
É muito rápido, no entanto.
O tempo de execução para n = 1.000.000 (que produz uma grade de 1.000.000.000.000 de elementos) é de aproximadamente 55 minutos no meu sistema.
O tempo de execução para n = 1000 (que produz uma grade de 1.000.000 de elementos) é menor que 1/100 segundo.
fonte
int
, para que você possa usarchar x[1<<20];n,i,j;main...
. 3.for(scanf("%d",&n);i++<n;)
salva dois bytes acimascanf("%d",&n);for(;++i<=n;)
.