Dado um número N , desenhar uma alinhada à esquerda de N x N placa de números, deixando um espaço em branco (como um espaço) (I mostram diagramas com 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
Seu trabalho é construir a Peneira de Eratóstenes, passo a passo. Primeiro, comece com 2. É primo, então deixe lá e substitua todos os outros números divisíveis por 2 pelo número adequado de espaços.
2 3 5
7 9
11 13 15
17 19
21 23 25
Em seguida, vá para o próximo número não impresso ( 3
neste caso) e faça o mesmo.
2 3 5
7
11 13
17 19
23 25
E assim por diante, até chegar N .
Você precisa primeiro imprimir a grade completa e, sempre que acessar um novo número, imprima o quadro com os múltiplos removidos. Certifique-se de imprimir uma linha em branco no meio!
Exemplos
O texto entre parênteses ()
é apenas para referência, você não precisa imprimi-lo
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
Lembre-se de que isso é código-golfe , portanto o código com o menor número de bytes vence.
N=10
,100
não for primo, será removido em algum momento. Todos os números devem ser preenchidos com 3 caracteres, pois100
possuem 3 dígitos?Respostas:
Geléia , 34 bytes
Experimente online!
Como funciona
fonte
Perl,
250243231202157 bytesTeste o golfe atual online! (certifique-se de executar como
perl -M5.010 main.pl
)As duas novas linhas literais economizam 1 byte no lugar de \ n.
Saída de amostra (entrada de 7):
Tenho certeza de que não joguei muito bem, então, quando chegar em casa, darei outra olhada para ver o quanto posso me barbear.
Edite 1: -7 bytes (alterando "print sprintf" para o óbvio "printf")
Edit 2: Salva 12 bytes usando $ d explicitamente no local em que foi chamado, em vez de criar uma variável separada, combinando algumas declarações e eliminando uma das minhas condições para a
next
instrução dentro do primeiroforeach
loop, adicionando um espaço em outro lugar . Outros 29 bytes foram extraídos, refazendo dois loops em um único loop, eliminando duas declarações de variáveis e transformandounless
instruções em instruções if-not. Declararmy$e=$n*$n;
e substituir as três instâncias de $ n * $ n por $ e (permitindo que eu solte um paren para uma delas) acabou produzindo ± 0 bytes, mas eu a mantive mesmo assim.Edit 3: Graças a @Dada, outros 40 bytes foram eliminados (declarações variáveis, 'foreach' se tornando 'for', $ _ implícito em vários locais e diminuindo o tamanho da instrução printf). Um byte adicional foi raspado ao se transformar
if!($c%$p||$c==$p||$p==1)
emif!($p~~[(1,$_)]||$_%$p)
. Infelizmente, o [] ao redor da matriz é necessário, porque o operador smartmatch ainda é experimental e parece não funcionar corretamente em matrizes reais, mas sim em referências a elas. Mais 4 bytes foram removidos removendo dois pontos e vírgulas e um conjunto de aspas vazio após o últimosay
.fonte
my
). Use a-p
bandeira para terN
dentro em$_
vez de usar$n=<>
. Escreva emfor
vez deforeach
(esta instrução é equivalente). Soltar o parêntese em torno da condição doif
que estão em posição de modificador de declaração (por exemploif!$c%$n
, em vez deif(!$c%$n)
Não parêntese necessário para inicializar.@a
:@a=0..$e
. Você pode deixar cair afor
variável e$_
sim ser utilizado em vez de gravação.printf"%*s",1+length$e,$a[$c]
(O `` doc sprintf` para obter detalhes sobre que*
)$"
vez de" "
.say""
em vez deprint"\n"
(você tem uma nova linha literal no seu código, mas não posso escrevê-la no comentário) (você adicionará à-M5.010
linha de comando, mas isso não conta na contagem de bytes). Você provavelmente pode usar0..$e=$n*$n
para salvar um byte na inicialização de$e
. Dê uma olhada nas dicas de golfe perl , que contém muitas dicas úteis. Mas é bom ver um novo jogador de golfe perl, bem-vindo! :) (e perdoe os meus erros de ortografia, eu posso ter escrever o meu comentário anterior muito rápido)if!$c%$n
, o! O operador tem precedência sobre o operador%, portanto, tecnicamente, isso seriaif((!$c)%$n)
falso para algo diferente de $ c = 0 (o que eu não quero). Quanto às suas outras dicas, verei o que posso fazer! Muito obrigado!!
, eu não estava no meu computador para verificá-lo. Você deve ter 160 caracteres, eu acho.PHP, 155 bytes
@Crypto -3 Bytes Obrigado @Titus -6 Bytes Obrigado
Tente
Primeira vez que uso a impressão em uma condição de loop posterior
Demolir
Versão anterior 174 bytes
fonte
!($d<2||$a[$d]>0)
=>$d>1&&$a[$d]<1
$l=strlen($m)+1
para$l=log10($m)+2
$i=$d*$x=$d>1
vez de$i=$d<2?0:$d
e$x
para as outras duas ocorrências de$d>1
$n*$n>=$i+=$d
vez de($i+=$d)<=$m=$n**2
e$n*$n
para a outra ocorrência de$m
Groovy,
201195191 BytesEste é um cluster absoluto ... O alinhamento à esquerda matou minha contagem de bytes. Mas ei, isso funciona. Aqui está a saída para 4:
Ungolfed:
O que outras pessoas estão dizendo
fonte
Perl,
115114113112 bytesInclui +1 para
-a
Execute com o número de entrada no STDIN:
sieving.pl
:Precisa de um perl recente o suficiente para que isso
-a
implique-n
. Se o seu perl é muito antigo, adicione uma-n
opção.Imprime uma nova linha à direita que é permitida.
fonte
Python 2,
199 202201 bytes+3 bytes (eu não estava parando cedo)
-1 byte graças a @Oliver (perdeu um espaço)
repl.it
fonte
1
efor
JavaScript (ES6),
190189 bytesImprime diretamente no console.
Demo
Mostrar snippet de código
fonte
Lote, 464 bytes
Isso foi um pouco trabalhoso. Explicação: Inicia ao quadrado
n
para calcular a largura da coluna desejadac
e a quantidade apropriada de preenchimentop
, usando o loop:l
. O loop externo de1
atén
então é executado uma vez para cada grade, chamando a sub-rotina:i
. Primeiro, o valor é verificado para ver se é 1 ou prime; caso contrário, essa grade é ignorada. O loop interno de1
paran*n
manipula as linhas e colunas da grade, chamando a sub-rotina:j
. Cada valor é verificado para ver se é um dos números primos encontrados até agora ou se nenhum dos números primos encontrados até agora o divide. Nesse caso, o valor é concatenado para o buffer de saída, que é preenchido com a largura da coluna desejada. O buffer é impresso e limpo a cadan
linha, e uma linha em branco extra é adicionada ao final da grade. O:f
label indica a sub-rotina de verificação de fatores; f (x, y) adiciona 1 af
cada número inteiro entre 2 ex
que se dividey
, excluindo ay
si próprio.fonte
R,
195191185204 bytesGraças a @Billywob por 6 bytes extras salvos!
Recuado, com novas linhas:
Uso:
fonte
^
é o único que não é vetorizado ao gerar seqüências usando, o:
que significa que você pode usar, por exemplo,1:2^2
para obter1 2 3 4
. Em segundo lugar, se você definir,a=b=1:n^2
poderá usar mais tarde, emfor(j in b)
vez de definir outro vetor para repetir. Você deve economizar alguns bytes.J, 125 bytes
Isso é explícito, não J tácito, mas deve haver uma maneira de jogar tacitamente.
Uso
fonte
Mathematica, 133 bytes
fonte
PHP,
155150147145142140 bytesdemolir
fonte
$a[$i]="";
em vez deunset($a[$i]);
salvar 4 bytes$i%$k<1
em vez de!($i%$k)
salvar um byte