Defino el enésimo ternario como un ternario que devuelve ny tiene la forma:
1 ? 2 ? 3 ? n - 1 ? n : 0 : 0 : 0 # n - 1 zeroes
Escriba una función o un programa completo que, con una entrada n, generará o devolverá el enésimo ternario. Código-Golf.
Casos de prueba
0 #=> undefined behaviour
1 #=> 1
2 #=> 1 ? 2 : 0
3 #=> 1 ? 2 ? 3 : 0 : 0
10 #=> 1 ? 2 ? 3 ? 4 ? 5 ? 6 ? 7 ? 8 ? 9 ? 10 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0
Creo que hay una especie de armonía zen en el ternario número 1000 .
Respuestas:
Pyth -
191817 bytesLos espacios me están matando, pensando en una mejor manera de manejarlos.
Simplemente une los números con a
" ? "
y luego concatena la segunda parte.Pruébelo en línea aquí .
fuente
CJam,
1818 bytesPruébalo en línea .
Explicación
fuente
:)
.Ruby, 31 bytes
Prueba:
fuente
array * string
==array.join string
... interesantef[0]
?irb(main):007:0> f[0] ArgumentError: negative argument from (irb):6:in * from (irb):6:in block in irb_binding from (irb):7:in [] from (irb):7 from /usr/bin/irb:11:in <main>
CJam, 19 bytes
Solo un comienzo ...
Cómo funciona
Pruébalo en línea aquí
fuente
Brainfuck, 305
(Sin el número de entrada de STDIN, vea editar en la parte inferior)
Utilicé este encantador algoritmo para imprimir un número, que ocupa 155 bytes del programa completo.
Funciona para entradas de hasta 32768 (limitación de 16 bits del algoritmo). No produce espacios finales y también funciona para la entrada
1
:Recorrido rápido:
Configuración (97 bytes)
Primera parte (181 bytes)
Segunda parte (27 bytes)
Si se permitiera asignar los 8 comandos Brainfuck a 3 bits, este programa ocuparía 114 bytes y otros 3 bits
Unario, ~ 4.08 * 10 ^ 275 bytes
Sería demasiado largo para aquí, pero es sólo 408452257862560239329948606295286361112603208650130608525040044700379331457759667646985586658469601803889628246410788572492437928714867190270708935427798983714797786123292750743771225096145575210320040188155473030775033228313350778616384531426430459309802833775612506568528463 ceros y funciona igual que el programa Brainfuck.
EDITAR : Me equivoqué, este programa no toma la entrada del usuario realmente, solo usa el valor actual del puntero como entrada. Para poder analizar un número, se requeriría mucho más y no puedo molestarme en hacerlo.
Por lo tanto, funciona con un valor ingresado directamente en el programa (agregando n veces "+" antes del programa) pero no con STDIN
fuente
JavaScript (ES6),
4239 bytesLa función externa
f
toma el valor de entrada y luego llama a la función internag
recursiva para construir la cadena desde el medio, utilizando el valor de entrada como máximo para probar el caso base.Sin golf:
fuente
Python
5655fuente
C # - 76
fuente
Haskell, 53 bytes
Cómo funciona: construya la cadena de adentro hacia afuera comenzando con una cadena vacía y haciendo un bucle de
n
abajo a2
con anteponer el número actual y a?
y agregar a: 0
. Finalmente poner un1
frente a todos.Un enfoque diferente (gracias a @Mauris ahora 9 bytes más corto):
Haskell,
6051 bytesCómo funciona: un literal
1
seguido? <x>
para cada<x>
en[2..n]
seguida por una constante: 0
para cada uno<x>
de[2..n]
.fuente
g n='1':((=<<[2..n])=<<[(" ? "++).show,\x->" : 0"])
(\_->" : 0")=<<[2..n]
con[2..n]>>" : 0"
Pyth, 17 bytes
Demostración.
fuente
Julia,
4431 bytesEsto crea una función sin nombre que acepta un entero como entrada y devuelve una cadena. Para llamarlo, dale un nombre, por ejemplo
f=n->...
.Primero unimos los enteros 1 a n , separando cada uno con
?
y espacios en una sola cadena. Luego agregamos a esto la cadena" : 0"
repetida n -1 veces.Ejemplos:
fuente
JavaScript ES7, 62 bytes
No sé si puedo jugar más al golf. Pero es una solución bastante sencilla
Solo Firefox:
ES5 equivalente:
fuente
CoffeeScript, 52 bytes
Explicación
fuente
SWI-Prolog, 90 bytes
Definitivamente no va a ganar, pero la
\+ (between(1,TopBound,N),\+do_something(N))
construcción es bastante interesante para repetir algo en una secuencia de enteros.fuente
Swift 145 (135 sin espacios en blanco)
¿Puedes creer que la parte de la subcadena es en realidad más larga que la parte para producir la expresión?
fuente
str[1]
ostr[0...5]
. Por supuesto, puede hacer una pequeña extensión, pero desearía que la biblioteca estándar habilitara estoPerl, 36 bytes
35
personajes+1
para-n
.Corre con:
fuente
Java, 71
No pude evitarlo después de comentar la respuesta de RCB . Así que aquí hay otro Java (71 como wow cuando Java no es el más largo)
fuente
Java,
12588 bytesOriginal
Con mejor formato y nombres de variables:
Mejorado: gracias a los comentarios de Jack Ammo a continuación:
fuente
e+=" : 0";
. A continuación, puede guardar 1 byte mediante el incremento posterior de i cuando se usa en lugar de en la línea forloop.for(int i=1;i<n;){s+=i+++" ? ";
Su declaración de devolución ya no necesitará el espacio agregado después de nreturn s+n+e;
. También puede guardar 1 byte usandoe=s
. Además, la declaración if al principio es innecesaria ya que la lógica del bucle for garantizará ese resultado de todos modos.JavaScript (ES6), 59 bytes
El mismo enfoque que mi respuesta CoffeeScript, usando la ayuda de cadenas de plantillas.
String.prototype.repeat
Cuesta demasiados personajes.Manifestación
Firefox solo por ahora, ya que es ES6.
fuente
K, 36 bytes
fuente
Pitón 2,
63605856Pruébalo aquí
Solución fácil: (63)
Editar : realmente quería probar una función recursiva. Aquí está: (56)
Editar : ¿Alguien sabe por qué esto no está funcionando? Intenté una lista con un índice de
c<n
, pero eso no funcionó debido a un error de desbordamiento de pila. Lo mismo con esto:fuente
0*
.rs , 77 bytes
Demostración en vivo y casos de prueba.
Explicación:
Expanda el número en una serie de N guiones bajos.
Repetidamente cree un rango de guiones bajos, separados por espacios. Por ejemplo, esto se convertiría
___
en_ __ ___
.Añadir al último conjunto de guiones bajos (de longitud N) N-1 instancias de
: 0
.Reemplace cada grupo de guiones bajos por su longitud, precedido por
?
, EXCEPTO por el primero.Reemplace el primero con el número 1.
Debido al formato, esto también se maneja
0
bien: solo imprime la cadena vacía.fuente
Swift,
7975 bytesf
se declara implícitamente como una función con unInt
parámetro que devuelve unString
Funciona
n >= 1
y se bloquea en tiempo de ejecución cuandon == 0
. No hay espacios en blanco al finalEditar: administrado para eliminar caracteres 2 * 2, porque la interpolación de cadenas no siempre es la más corta
Nota para editar: este código tarda una eternidad (no se detiene) en compilarse, pero definitivamente lo haría si el compilador pudiera manejarlo. Eche un vistazo a la versión anterior a esta edición para obtener una que compile
fuente
> <> , 32 + 3 = 35 bytes
Tenga en cuenta que hay un espacio final en la segunda línea. El +3 es para el
-v
bandera, por ejemplo, correr comoTomando la entrada como un punto de código como
es de 34 bytes, pero prefiero la versión anterior ya que es más fácil de probar y de todos modos no ganará.
Explicación
Hay bastante pseudo-recurrencia y abuso, así que echemos un vistazo.
La primera línea imprime la
"1 ? 2 ? ... n-1 ? "
pieza. La pila comienza solo con la entradan
, gracias a la-v
bandera, y hacemos lo siguiente:> <> es toroidal, por lo que lo anterior se ejecuta en un bucle hasta que la pila consiste
n
en la parte superior conn-1
ceros a continuación, en cuyo punto se mueve a la segunda línea.La primera vez que se ejecuta la segunda línea, se ejecuta la
n
instrucción, imprimiendon
en la parte superior de la pila. Esto deja solo losn-1
ceros, y hacemos lo siguiente, también en un bucle:fuente
" ? "ooo
Imprima el reverso de "?" (Pero bueno, palíndromos) ¿ está imprimiendo el reverso más corto que imprimiendo la cadena real?Scala
78715250 bytesfuente
Objetivo-C, 346 bytes
Poner
0
por elint
o cualquier cosa negativa aumentaNSRangeException
debido a laoutString
contenciónnil
. Esto debería ejecutarse en iOS 2.0 y versiones posteriores y en muchas de las últimas versiones de Mac OS X.Un desglose del código:
Declaración de función estándar en Objective-C.
Hace una cadena para que la salida vaya a
outString
, y la hace mutable. (En otras palabras, se puede leer y escribir.Agrega la primera parte de la cadena a la salida.
Limpia el comienzo de la cadena para asegurarse de que
? 1
se reemplaza con1
. Nota: si0
se dio, aquí es dondeNSRangeException
ocurriría, debido a que no hay un índice1
.Agrega la segunda parte de la cadena a la cadena.
Escupe la cuerda de nuevo usando
NSLog
y cierra la función.Salida:
La entrada
0
proporciona este registro de bloqueo:1
da esto:2
da esto:7
da esto:200
da esto:fuente
C,
8478 bytesC, aunque no es el más corto, como una función:
En el nombre de golf, el
int
especificador de tipo se deja fuera dei
,f
yn
debido a que es el valor predeterminado.i
puede no inicializarse porque es una variable global y su valor predeterminado es cero.f
no devuelve un valor, pero eso solo provoca una advertencia.printf
no es#include
'd. Para ejecutar, aquí hay una versión completa del programa:fuente
for(printf(...);--i;)
.C, 63 bytes
Función reutilizable, toma n como argumento.
Indiferente y comentado (bastante sencillo):
fuente
Lisp común, 84
Primero,
(loop for i from 1 to (read) collect i)
genera una lista de enteros de 1 a lo que sea que se ingrese, que se usa como el único argumento para la función. Pero la verdadera magia de esto está en la cadena de control que parece ruido de línea."~{~A ? ~}"
itera sobre la lista completa almacenada dentro del primer argumento, generando cada número con el?
para la primera mitad.~@*
restablece la lista de argumentos al primer argumento.~{~[~;~:;0~^ ? ~]~}
reitera sobre la lista, generando0 ?
para cada argumento consumido, pero sin generar nada si el argumento es 0 o 1.fuente