O desafio
Construir uma N-nivelado Cantor Set .
O conjunto ternário Cantor é criado excluindo repetidamente os terços médios abertos de um conjunto de segmentos de linha.
O programa recebe um parâmetro N
(um número inteiro) e depois imprime (no console ou de maneira semelhante) um conjunto de N níveis Cantor. A impressão pode conter apenas caracteres de undescore ( _
) e com espaços. O parâmetro pode ser positivo ou negativo e o sinal indica a orientação de construção do conjunto de cantores: se N > 0
o conjunto de cantores for construído para baixo e se N < 0
o conjunto de cantores for construído para cima. Se N = 0
então, o programa imprime uma única linha ( _
).
Por exemplo:
N = 2
_________
___ ___
_ _ _ _
N = -2
_ _ _ _
___ ___
_________
N = 3
___________________________
_________ _________
___ ___ ___ ___
_ _ _ _ _ _ _ _
N = -3
_ _ _ _ _ _ _ _
___ ___ ___ ___
_________ _________
___________________________
Critérios de vitória
Como é um desafio de código de golfe, o código mais curto vence.
Editado: Modifique 0 entrada por sugestão de ugoren.
_
(mas imprimi-lo para baixo ao obter -0).Respostas:
GolfScript,
49 4240 caracteresCom agradecimentos a hammar por 42-> 40.
Infelizmente, minha melhor tentativa de uma abordagem mais teórica dos números é muito mais longa:
ou
e desconfio que o tamanho
base
ezip
o impossibilitem de alcançar.fonte
~.abs.@/\.3\?'_'*\{.3%..,' '*\++}*](%n*
tem 39 caracteres, mas trava na entrada0
. :-(n/abs(n)
issosignum(n)
.Python,
116 113 104103 caracteresAlgoritmo mais antigo com 113 caracteres
fonte
Rubi (97)
Baseado na versão python de Steven Rumbalski:
Tentativas anteriores, com o mesmo comprimento (112)
Crie linhas a partir de peças:
Comece com uma linha, faça furos nela:
fonte
Perl, 93 caracteres
Pensei em tentar ver como a solução GolfScript de Peter Taylor seria portada para Perl. Recursos notáveis incluem o uso de em
sort
vez dereverse
salvar três caracteres, usando o fato de que um espaço é classificado anteriormente_
.fonte
Lisp comum,
217210 caracteresExpandido:
Eu acho que se o código Lisp conseguir superar qualquer contagem inicial para outro idioma (C, 219), estou indo bem :)
fonte
C (
163161 caracteres)Empresta alguns truques da resposta de ugoren , mas a lógica principal é bem diferente. Não consegui seguir o loop for dele, portanto, é possível hibridar e economizar um pouco mais.
fonte
C,
219193179143136131 caracteresSegui outra das idéias de Petyer Taylor, além de uma melhoria minha, economizando mais 6.
Integrou algumas dicas do @PeterTaylor, além de copiar sua função principal, com pequenas alterações, que salvam um personagem (é justo copiá-lo? Como nenhum de nós vencerá esse, acho que não é tão ruim).
Pensei em uma melhoria significativa em como minha recursão funciona e, depois de ver a resposta de Peter Taylor, implementei-a para recuperar a liderança. Ao ler sua resposta novamente, vi que fiz quase exatamente o que ele fez. Então isso parece a hibridização que ele sugeriu.
Também simplificou o loop
main
, mantendo o mesmo comprimento.E levou o truque de Peter para imprimir nova linha, em vez de
puts("")
- salva um personagem.Removido
int
da declaração da variável - um aviso, mas salva 4 caracteres.O novo algoritmo não calcula 3 ^ x antecipadamente, mas usa um único loop para imprimir 3 ^ x caracteres.
Pode salvar mais um definindo
int*v
, mas 64 bits não funcionará.A contagem de caracteres exclui o espaço em branco (que pode ser removido).
Algoritmo mais antigo, 219 caracteres:
fonte
i
parâmetro, porque o uso global interfeririamain
.l--
interferiráo>=l
e terei de substituí-lo por>
(por que o escrevo como se fosse uma coisa ruim?) Também poderia copiar vocêmain
, que é mais simples e mais curto que o meu.i
- eu perdi o fato de que eu realmente não o uso mais (pensei que você quis dizer que não passo).p
parece ótimo agora e o seumain
foi melhor (não tenho certeza de que é ótimo, mas não posso melhorá-lo ainda mais). Portanto, exceto por uma nova estrutura de programa engenhosa, o único caminho a seguir era copiarmos o código do outro.J,
44393837 bytesUsa a iteração para criar o próximo conjunto começando com 1 (representando
_
) inicialmente.Uso
Explicação
fonte
@.
talvez, combinada com$:
, possa ser útil aqui? Por exemplo, algo como(zero case)`(positive case)`(negative case)@.*
, ou mesmo talvez":@_:`(positive case)`(|."1@$:)@.*
.R ,
141139137 bytesExperimente online!
-15 bytes também graças ao uso de Giuseppe
'('
como função de identidade;write
em vez decat
imprimir a saída; uso inteligente de%x%
.-2 bytes graças a Kirill L. usando em
c
vez de'('
como a função de identidade.fonte
%x%
? Pode haver alguns problemas com a tomada de linhas alternadas talvez ...kron
também! Eu imagino que isso possa diminuir para 125 bytes, se conseguirmos encontrar a abordagem correta.`(`
como função de identidade para poder usarwrite
diretamente em vez decat
e umfor
loop. 141 bytes(
poderia ser usado dessa maneira, ou queif
poderia ser usado para selecionar duas funções. E começarei a usar a gravação ... economiza muito "\ n".Python,
177164 caracteresfonte
input
comoint
. Suas duas últimas linhas poderia ser reduzido paraprint"\n".join(r[::N>0 or-1])
Perl, 113 caracteres
Expandido:
fonte
JavaScript 121 bytes
Função recursiva interna e, em seguida, cuide da saída para trás, se necessário
Menos golfe
Teste
fonte
Lote,
265262242236235 bytesEdit: Salvo
1219 bytes graças a @ l4m2. Economizou 8 bytes removendo a%a%
variável desnecessária .fonte
set c=%n%,-1,0 [LF] if %n% lss 0 set c=0,1,%a% [LF] for /l %%i in (%c%)do call:l %%i
?JavaScript (Node.js) , 148 bytes
Experimente online!
fonte
Python 2 , 102 bytes
Experimente online!
fonte
Prolog (SWI) ,
265232213 bytesExperimente online!
fonte
PowerShell , 111 bytes
Experimente online!
Menos golfe:
fonte