La constante de Champernowne es un número que se construye concatenando los primeros n
números, con n
tendencia al infinito. Se parece a esto:
0.123456789101112131415161718192021222324252627282930...
Ahora, te describiré el número de Rien . Puede considerarse como una minimización de la constante de Champernowne como un número entero. Me referiré al número de Rien con los primeros n
dígitos como Ri ( n ). Así es como se formula:
- Los primeros
n
números naturales (la secuencia {1,2,3, ...}) se concatenan. - Este resultado se ordena de acuerdo con el valor del dígito. Así
1..12
se vería así011111223456789
. - Desde la Rien número no puede tener ceros a la izquierda, que mover toda
0
s para que sean significativos, mientras que mantener el número reducido al mínimo, lo que resulta en, por ejemplo,101111223456789
. Este es Ri ( n ), en este caso, Ri (12).
Aquí hay algunos resultados para Ri ( n ):
n Ri ( n ) 1 1 2 12 3 123 7 1234567 9 123456789 10 10123456789 15 101111111223344556789 34 10001111111111111222222222222223333333334444555666777888999 42 100001111111111111122222222222222233333333333333444444455556666777788889999 45 100001111111111111122222222222222233333333333333344444444444555556666777788889999 55 10000011111111111111122222222222222223333333333333333444444444444444455555555555566666777778888899999 100 10000000000011111111111111111111222222222222222222223333333333333333333344444444444444444444555555555555555555556666666666666666666677777777777777777777888888998888888888889999999999999999998888888888889999999999999999888888888888999999999999999999888888888899999999999999999988888888888899999999999999998888888888889999999999999999998888888888999999999999999999888888888888999999999999999999889988998899999999999999999988888888888899999999999999999988888888889999999999999999998888888888889999999999999999 999100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
Objetivo Dado un número 1 ≤ n
<10000 como entrada (a través de argumentos, STDIN o hardcoding si su idioma no admite entrada convencional), salida / retorno Ri ( n
).
Este es un código de golf , por lo que gana el código más corto en bytes. Puede usar un idioma que se haya creado después de este concurso, siempre que no haya sido creado para responder a este desafío. (Por supuesto, puede usarlo, si proporciona una solución interesante, pero marque su respuesta como no competitiva).
Implementación de referencia
Probé esto en IE, por lo que realmente no debería haber un problema. Si no es un problema, hay una solución fácil: conseguir un navegador cuerdo.
function min(n) {
var seq = [];
for(var i = 1; i <= n; i++) seq.push(i);
seq = seq.join("").split("").map(Number);
var to;
if(seq.indexOf(1) >= 0) to = seq.splice(seq.indexOf(1), 1);
seq.sort(function(a, b) {
return a - b;
});
if(to) seq = to.concat(seq);
return seq.join("");
}
t.onchange = t.onkeyup = function() {
h.innerHTML = min(this.value)
}
* {
font-family: Consolas, monospace;
}
input {
border: 2px dotted #aaaaaa;
border-radius: 5px;
margin: 10px;
}
<input id="t" type="number">
<div id="h">
Tabla de clasificación
El Fragmento de pila al final de esta publicación genera el catálogo a partir de las respuestas a) como una lista de la solución más corta por idioma yb) como una tabla de clasificación general.
Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:
## Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
## Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
0
es el número de Rien .1
s delante de los0
s, ¿sí?Respuestas:
Pyth, 8
Hace una lista,
[1, .. , input]
luego elimina la primera, une y ordena, y antepone un 1.Banco de pruebas
fuente
Perl,
4442413331 bytesYaaay, primera publicación!
Gracias a primo por el ahorro de 2 bytes.
Como lo hicieron otros, eliminar 1 y anteponerlo manualmente hace el trabajo.
Pruébalo en línea
fuente
print 1,sort"@{[2..<>]}"=~/\d/g
Japt,
1412 bytesPruébalo en línea!
Cómo funciona
fuente
Retina , 78 bytes
Es hora de mostrar algunas características nuevas de Retina (todavía no es muy competitivo, pero antes de hoy probablemente habría estado más cerca de los 300 bytes).
Pruébalo en línea.
Explicación
Si bien es posible convertir entre decimal y unario bastante convenientemente ahora, esto todavía es bastante largo porque tengo que convertir varias veces hacia adelante y hacia atrás porque algunas operaciones son más factibles en decimal que en unario y viceversa.
Comencemos convirtiendo la entrada a unario. Esto funciona haciendo coincidir la entrada y luego usando
$*1
las repeticiones1
tantas veces (esta característica de repetición es nueva a partir de hoy).A continuación, generamos un rango de
1
aN
en unario. Le expliqué por qué esto funciona en mi respuesta de FizzBuzz .Convertimos cada número en el rango de nuevo a decimal para que podamos trabajar con los dígitos decimales. Esto se realiza haciendo coincidir cada uno de los números unarios de modo que cada uno
1
genere una captura separada. Luego reemplazamos eso con el número de capturas del grupo uno, usando la nueva sintaxis de conteo de captura$#1
.Esto elimina los
1
espacios iniciales y todos los espacios de la cadena, por lo que solo nos quedan los dígitos (excepto un solo1
).Convertimos de nuevo a unario y lo agregamos
1
a cada dígito (para asegurar que incluso0
sea un no vacío). También insertamos un espacio delante de cada dígito para asegurarnos de que estén separados.Emparejamos repetidamente un número pequeño precedido por un número mayor y los intercambiamos. Eso es burbuja en Retina. :)
Aaa y de vuelta al decimal.
Finalmente, insertamos un solo
1
en el frente para dar cuenta del que hemos eliminado anteriormente.fuente
Haskell, 44 bytes
Unfortunately
sort
is inData.List
, that's 17 bytes!fuente
JavaScript (ES6),
65625452 bytesSaved 3 bytes thanks to edc65
Builds a string of all numbers from 2 to
x
, then splits, sorts, joins, and adds a 1 to the beginning. This may still be golfable; suggestions welcome!fuente
Array(x-1).map((_,y)=>y+2)
?Array(n).fill().map(...
(see ES6 tips)n=>1+[...[...Array(n-1)].map(_=>++n,n=1).join``].sort().join``
(1 byte shorter, it's the split).split()
felt so odd...n=>1+[...[...Array(n+1).keys()].slice(2).join``].sort().join``
CJam, 9
Try it online
Alternatively:
fuente
Mathematica, 52 bytes
Once again, string processing happened...
fuente
IntegerDigits
threads over lists so you don't need map it.APL (17)
Explanation:
Test:
fuente
∊
would flatten the array and give you a string. That's good to know.Python 2, 60 bytes
fuente
ClojureScript, 48 bytes
Same as all of the others, pretty much. REPL available here.
fuente
Ruby, 48 bytes
An anonymous function. Basically just Rubyfied some of the other answers here..
fuente
Brachylog,
7641 bytesTakes a number as input.
This solution works with the few changes I made to the built-in Findall predicate
f
. OP is apparently OK with using languages older than the answer so I think this is fine (the changes I made were intented a long time ago, I just motivated myself to do it because of this challenge).Explanation
fuente
Smalltalk, 76 bytes
As usual in Smalltalk, conceptually very terse, but textually very verbose...
Add this as a class method for
String
and call like this, e.g. for 20,String f: 20
fuente
Bash + GNU utilities, 58
Try it online.
fuente
Bash,
3534 bytesThis builds on the answers of @DigitalTrauma and @OlivierDulac. Try it online with Ideone.
How it works
seq 2 $1
prints all integers from 2 to the one specified on the command line.fold -1
wraps all lines with width 1, i.e., places each character on its own line.-1
seems to be an undocumented feature.sort
sorts the characters by their numeric value.printf %d 1`...`
prepends a 1 to the first line and prints each line as an integer (%d
), with no separation.This takes advantage of Bash's curious printf implementation, which repeats the format string over and over, until all arguments are consumed.
fuente
JavaScript ES6,
4946 BytesThanks to edc65 for 2 bytes
fuente
Julia, 33 bytes
This is a lambda function that accepts an integer and returns a string. To call it, assign it to a variable.
We construct the range
2:n
, which will be empty forn
< 2, join it into a string, splat the string into an array of characters, sort them, join it into a string, and prepend 1.fuente
APL, 21 bytes
This is an unnamed monadic function that accepts an integer on the right and returns a string. To call it, assign it to a variable.
Explanation:
Try it online
fuente
Python 2, 60 bytes
Indexing for the win. :-)
Python 2, 60 bytes
Just an alternative.
fuente
Milky Way 1.6.4, 22 bytes (not competing)
I had to add a sorting opcode for this challenge.
Explanation
fuente
Seriously, 10 bytes
Hex Dump:
Try It Online
Explanation:
fuente
Bash and GNU tools,
5852 bytesfuente
PowerShell,
6159 bytesTakes input
param($a)
and then uses it to index into an array with[$a-eq1]
. If true, we index the second element and output1
. Otherwise, we concatenate"1"
with thejoin
ed array created by 1) defining a new range2..$a
that has been itselfjoin
ed together, 2) casting that as a char-array, and 3) sending it through theSort-Object
cmdlet, all of which is then output.Edit1 -- Saved 2 bytes by moving the inner
-join
operator.fuente
Gogh,
97 bytesYou can run this using:
fuente
Jelly, 8 bytes
Try it online!
How it works
fuente
Oracle SQL 11.2,
222211 bytesUn-golfed
fuente
MATL, 17 bytes
Uses current version (7.0.0) of language/compiler.
Inspired by FryTheEgggman's answer.
EDIT (July 29, 2016): You can try it online with some modifications to conform to changes in the language.
Example
Explanation
fuente
05AB1E, 6 bytes
Note: This submission uses features that postdate this challenge and is therefore not competitive
Code:
Explanation:
Uses ISO 8859-1 encoding
fuente
Mathcad, 86 "bytes"
The function s(n) uses a for loop to build up the Champernowne "integer" by converting each number to its string form and concatenating them together. The string is then converted to its equivalent vector of ASCII codes and sorted. The function then swaps any leading zeros with the first one, finally converting the vector back to a string.
To check the function, I put the test cases into a vector vn, then applied s to vn using the vectorize operator. I then check the results against the given test case values.
Mathcad is mathematical application based on 2D worksheets comprised of "regions" each of which can be text, a mathematical expression, program, plot or scripted component.
A mathematical or programming instruction is picked from a palette toolbar or entered using a keyboard shortcut. For golfing purposes, an operation ("byte") is taken to be the number of keyboard operations necessary to create a name or expression (for example, to set the variable a to 3, we would write a:=3. The definition operator := is a single keypress ":", as are a and 3 giving a total of 3 "bytes". The programming for operator requires typing ctl-shft-# (or a single click on the programming toolbar) so again is equivalent to 1 byte.
fuente