Le défi
Construire un N-Nivelé Set Cantor .
L'ensemble ternaire Cantor est créé en supprimant à plusieurs reprises les tiers médians ouverts d'un ensemble de segments de ligne.
Le programme reçoit un paramètre N
(un nombre entier) puis imprime (en console ou de manière similaire) un ensemble de Cantor de N niveaux. L'impression ne peut contenir que des caractères undescore ( _
) et blancs. Le paramètre peut être positif ou négatif et le signe indique l'orientation de construction du Cantor Set: si N > 0
le Cantor Set est construit vers le bas et si N < 0
le Cantor Set est construit vers le haut. Si N = 0
alors le programme imprime une seule ligne ( _
).
Par exemple:
N = 2
_________
___ ___
_ _ _ _
N = -2
_ _ _ _
___ ___
_________
N = 3
___________________________
_________ _________
___ ___ ___ ___
_ _ _ _ _ _ _ _
N = -3
_ _ _ _ _ _ _ _
___ ___ ___ ___
_________ _________
___________________________
Critères gagnants
Comme c'est un défi de golf de code, le code le plus court gagne.
Modifié: modifiez 0 entrée par la suggestion d'Ugoren.
_
(mais imprimez-le vers le bas lorsque vous obtenez -0).Réponses:
GolfScript,
49 4240 caractèresMerci à hammar pour 42-> 40.
Ma meilleure tentative à ce jour d'une approche plus théorique des nombres est malheureusement beaucoup plus longue:
ou
et je soupçonne que la longueur de
base
etzip
rendra impossible de rattraper.la source
~.abs.@/\.3\?'_'*\{.3%..,' '*\++}*](%n*
est de 39 caractères, mais se bloque en entrée0
. :-(n/abs(n)
pour l'obtenirsignum(n)
.Python,
116 113 104103 caractèresUn algorithme plus ancien avec 113 caractères
la source
Rubis (97)
Basé sur la version python de Steven Rumbalski:
Tentatives précédentes, toutes deux de même longueur (112)
Créez des lignes à partir de pièces:
Commencez par une ligne, faites-y des trous:
la source
Perl, 93 caractères
Je pensais que j'essaierais de voir à quel point la solution GolfScript de Peter Taylor se porterait sur Perl. Les fonctionnalités notables incluent l'utilisation de
sort
au lieu dereverse
pour enregistrer trois caractères, en utilisant le fait qu'un espace trie avant_
.la source
Lisp commun,
217210 caractèresÉtendu:
Je pense que si le code Lisp parvient à battre n'importe quel décompte initial pour une autre langue (C, 219), je vais bien :)
la source
C (
163161 caractères)Emprunte quelques astuces de la réponse d' Ugoren , mais la logique de base est assez différente. Je ne pouvais pas suivre sa boucle for, donc il pourrait être possible de s'hybrider et d'en sauver quelques autres.
la source
C,
219193179143 143136131 caractèresJ'ai suivi une autre des idées de Petyer Taylor, plus une amélioration de la mienne, j'ai économisé 6 autres.
Intégré quelques conseils de @PeterTaylor, plus copié sa fonction principale, avec de légères modifications, qui sauvent un personnage (est-il juste de le copier? Étant donné qu'aucun de nous ne gagnera celui-ci, je suppose que ce n'est pas trop mal).
J'ai pensé à une amélioration significative du fonctionnement de ma récursivité, et après avoir vu la réponse de Peter Taylor, je l'ai implémentée pour reprendre la tête. En relisant sa réponse, j'ai vu que j'avais fait presque exactement ce qu'il avait fait. Cela ressemble donc à l'hybridation qu'il a suggérée.
Également simplifié la boucle
main
, en gardant la même longueur.Et a pris l'astuce de Peter pour imprimer la nouvelle ligne, au lieu de
puts("")
- enregistre un caractère.Supprimé
int
de la déclaration de variable - un avertissement, mais enregistre 4 caractères.Le nouvel algorithme ne calcule pas 3 ^ x à l'avance, mais utilise une seule boucle pour imprimer 3 ^ x caractères.
Peut en enregistrer un de plus en le définissant
int*v
, mais le 64 bits ne fonctionnera pas.Le nombre de caractères exclut les espaces (qui peuvent être supprimés).
Algorithme plus ancien, 219 caractères:
la source
i
paramètre, car l'utilisation du global interférerait avecmain
.l--
va interférer aveco>=l
, et je vais devoir le remplacer par>
(alors pourquoi dois-je l'écrire comme si c'était une mauvaise chose?) Je pourrais aussi vous copiermain
, ce qui est plus simple et plus court que le mien.i
- j'ai raté le fait que je ne l'utilise vraiment plus (je pensais que tu veux dire que je ne le passe pas).p
semble tout à fait optimal maintenant, et le vôtremain
était meilleur (je ne suis pas sûr qu'il soit optimal, mais je ne peux pas l'améliorer davantage). Donc, à l'exception d'une nouvelle structure de programme ingénieuse, la seule façon de procéder était de copier l'un ou l'autre code de l'autre.J,
44393837 octetsUtilise l'itération pour construire l'ensemble suivant en commençant par 1 (représentant
_
) initialement.Usage
Explication
la source
@.
peut-être, combiné avec$:
, pourrait être utile ici? Par exemple quelque chose comme(zero case)`(positive case)`(negative case)@.*
, ou même peut-être":@_:`(positive case)`(|."1@$:)@.*
.R ,
141 139137 octetsEssayez-le en ligne!
-15 octets merci aussi à Giuseppe d'utiliser
'('
comme fonction d'identité;write
au lieu d'cat
imprimer la sortie; utilisation intelligente de%x%
.-2 octets grâce à Kirill L. en utilisant
c
au lieu de'('
comme fonction d'identité.la source
%x%
? Il pourrait y avoir des problèmes avec la prise de lignes alternées peut-être ...kron
aussi! J'imagine que cela devrait pouvoir descendre jusqu'à 125 octets si nous pouvons trouver la bonne approche.`(`
comme fonction d'identité afin que vous puissiez utiliserwrite
directement au lieu decat
et unefor
boucle. 141 octets(
pourrait être utilisé de cette façon, ou que celaif
pourrait être utilisé pour sélectionner parmi deux fonctions. Et je vais commencer à utiliser l'écriture ... enregistre beaucoup de "\ n".Python,
177164 caractèresla source
input
asint
. Vos deux dernières lignes pourraient être raccourcies enprint"\n".join(r[::N>0 or-1])
Perl, 113 caractères
Étendu:
la source
JavaScript 121 octets
Fonction récursive intérieure, puis s'occuper de la sortie arrière si nécessaire
Moins golfé
Tester
la source
Lot,
265262242236235 octetsEdit:
1219 octets enregistrés grâce à @ l4m2. 8 octets enregistrés en supprimant la%a%
variable inutile .la source
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 octets
Essayez-le en ligne!
la source
Python 2 , 102 octets
Essayez-le en ligne!
la source
Prolog (SWI) ,
265232213 octetsEssayez-le en ligne!
la source
PowerShell , 111 octets
Essayez-le en ligne!
Moins golfé:
la source