El reto
Construye un conjunto de Cantor N-Nivelado .
El conjunto ternario de Cantor se crea eliminando repetidamente los tercios medios abiertos de un conjunto de segmentos de línea.
El programa recibe un parámetro N
(un número entero) y luego imprime (en la consola o de manera similar) un conjunto Cantor de N niveles. La impresión solo puede contener undescore ( _
) y espacios en blanco. El parámetro puede ser positivo o negativo y el signo indica la orientación de construcción del conjunto de Cantor: si N > 0
el conjunto de Cantor se construye hacia abajo y si N < 0
el conjunto de Cantor se construye hacia arriba. Si N = 0
entonces el programa imprime una sola línea ( _
).
Por ejemplo:
N = 2
_________
___ ___
_ _ _ _
N = -2
_ _ _ _
___ ___
_________
N = 3
___________________________
_________ _________
___ ___ ___ ___
_ _ _ _ _ _ _ _
N = -3
_ _ _ _ _ _ _ _
___ ___ ___ ___
_________ _________
___________________________
Criterios ganadores
Como es un desafío de código de golf, gana el código más corto.
Editado: Modificar 0 entradas por sugerencia de ugoren.
_
(pero imprimirlo hacia abajo cuando se obtiene -0).Respuestas:
GolfScript,
49 4240 caracteresGracias a hammar por 42-> 40.
Mi mejor intento hasta ahora en un enfoque más teórico de los números es lamentablemente mucho más largo:
o
y sospecho que la longitud de
base
yzip
hará que sea imposible ponerse al día.fuente
~.abs.@/\.3\?'_'*\{.3%..,' '*\++}*](%n*
es de 39 caracteres, pero se bloquea en la entrada0
. :-(n/abs(n)
para obtenerlasignum(n)
.Python,
116 113 104103 caracteresAlgoritmo más antiguo con 113 caracteres
fuente
Rubí (97)
Basado en la versión python de Steven Rumbalski:
Intentos anteriores, ambos de la misma longitud (112)
Construir líneas a partir de piezas:
Comience con una línea, haga agujeros en ella:
fuente
Perl, 93 caracteres
Pensé que trataría de ver qué tan bien la solución GolfScript de Peter Taylor se portaría a Perl. Las características notables incluyen el uso de en
sort
lugar dereverse
guardar tres caracteres, usando el hecho de que un espacio se clasifica antes_
.fuente
Lisp común,
217210 caracteresExpandido:
Me imagino que si el código Lisp logra superar cualquier conteo inicial para otro idioma (C, 219), estoy bien :)
fuente
C (
163161 caracteres)Toma prestados un par de trucos de la respuesta de ugoren , pero la lógica central es bastante diferente. No pude seguir su ciclo for, por lo que es posible hibridar y guardar algunos más.
fuente
C,
219193179143136131 caracteresSeguí otra de las ideas de Petyer Taylor, más una mejora mía, ahorré 6 más.
Integró algunos consejos de @PeterTaylor, más copió su función principal, con ligeros cambios, que salvan a un personaje (¿es justo copiarlo? Dado que ninguno de nosotros ganará este, supongo que no está tan mal).
Pensé en una mejora significativa en cómo funciona mi recursión, y después de ver la respuesta de Peter Taylor, la implementé para recuperar el liderazgo. Al leer su respuesta nuevamente, vi que hice casi exactamente lo que él hizo. Así que esto parece la hibridación que sugirió.
También simplificó el bucle
main
, manteniendo la misma longitud.Y tomó el truco de Peter para imprimir una nueva línea, en lugar de
puts("")
: guarda un personaje.Eliminado
int
de la declaración de variables: una advertencia, pero guarda 4 caracteres.El nuevo algoritmo no calcula 3 ^ x por adelantado, pero usa un solo bucle para imprimir 3 ^ x caracteres.
Puede guardar uno más definiendo
int*v
, pero 64 bits no funcionará.El recuento de caracteres excluye los espacios en blanco (que se pueden eliminar).
Algoritmo anterior, 219 caracteres:
fuente
i
parámetro, porque usar el global interferiríamain
.l--
interferiráo>=l
y tendré que reemplazarlo por>
(entonces, ¿por qué lo escribo como si fuera algo malo?) También podría copiartemain
, que es más simple y más corto que el mío.i
: extrañé el hecho de que realmente ya no lo uso (pensé que querías decir que no lo paso).p
parece bastante óptimo ahora, y tumain
fue mejor (no estoy seguro de que sea óptimo, pero no puedo mejorarlo más). Entonces, a excepción de una nueva e ingeniosa estructura de programa, la única forma de hacerlo era si cualquiera de nosotros copiaba el código del otro.J,
44393837 bytesUtiliza la iteración para construir el siguiente conjunto comenzando con 1 (que representa
_
) inicialmente.Uso
Explicación
fuente
@.
tal vez, combinada con$:
, podría ser útil aquí? Por ejemplo, algo como(zero case)`(positive case)`(negative case)@.*
, o tal vez":@_:`(positive case)`(|."1@$:)@.*
.R ,
141 139137 bytesPruébalo en línea!
-15 bytes gracias también por el uso de Giuseppe
'('
como función de identidad;write
en lugar decat
imprimir la salida; uso inteligente de%x%
.-2 bytes gracias a Kirill L. utilizando en
c
lugar de'('
como la función de identidad.fuente
%x%
? Puede haber algunos problemas con tomar filas alternas quizás ...kron
también! Me imagino que esto debería poder reducirse a 125 bytes si podemos encontrar el enfoque correcto.`(`
como la función de identidad para poder usarlowrite
directamente en lugar decat
unfor
bucle. 141 bytes(
podría usarse de esta manera, o queif
podría usarse para seleccionar entre dos funciones. Y comenzaré a usar escribir ... ahorra mucho "\ n".Python,
177164 caracteresfuente
input
asint
. Sus últimas dos líneas podrían acortarse aprint"\n".join(r[::N>0 or-1])
Perl, 113 caracteres
Expandido:
fuente
JavaScript 121 bytes
Función recursiva interna, luego cuide la salida hacia atrás si es necesario
Menos golf
Prueba
fuente
Lote,
265262242236235 bytesEditar: Guardado
1219 bytes gracias a @ l4m2. Se guardaron 8 bytes al eliminar la%a%
variable innecesaria .fuente
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
Pruébalo en línea!
fuente
Python 2 , 102 bytes
Pruébalo en línea!
fuente
Prólogo (SWI) ,
265232213 bytesPruébalo en línea!
fuente
Potencia Shell , 111 bytes
Pruébalo en línea!
Menos golfizado:
fuente