Inspirado por la desafortunada clasificación de un número de dígitos sin usar una matriz , pero pensé que era un código de golf mejor que la pregunta SO.
Dado un entero positivo, clasifique los dígitos en ese entero.
¡La puntuación más baja gana!
- Comience con 0 puntos.
- Agrega un punto por personaje.
- Agregue 20 puntos por cada matriz que use.
- Agregue 10 puntos por cada cadena de caracteres múltiples en su código. (Excepto la entrada inicial siempre que se convierta a un entero sin ninguna otra operación realizada en él).
- Agregue 32 puntos si la cantidad máxima de dígitos que su programa puede manejar está limitada por su programa (en oposición a la máquina).
- Resta 10 puntos si tu código puede cambiar la dirección del orden dado otro argumento (lo que quieras, pero por ejemplo 0 para el orden descendente y 1 para el ascendente).
Cada idioma es diferente, pero la idea es evitar cualquier tipo de piratería iterativa de dígitos.
Ejemplo:
Entrada : 52146729
Salida : 97654221 o 12245679
Notas:
- Utilice las capacidades de clasificación incorporadas que proporciona su lenguaje de programación, pero si esa función de clasificación involucra cadenas o matrices, ¡tome la pena!
- Puede escribir la solución como una función que toma un número entero directamente, o como un programa que toma un argumento de argv, un archivo o secuencia y lo convierte en un número entero. Siempre y cuando lo convierta a un entero de inmediato y descarte la entrada char * original sin realizar ninguna otra operación, no se aplica ninguna penalización.
- Las penalizaciones se aplican no solo a los literales de cadena en el texto de su programa, sino a cualquier parte de su función de programa que posiblemente ingrese o genere una cadena o iterable. Por ejemplo, JavaScript
String.prototype.split
tiene al menos una cadena como entrada (this
) y una matriz como salida, por lo que +30 por usar eso. - He tratado de hacer que estas reglas guíen el principio del diseño del algoritmo, no la E / S inicial / final (de ahí la nota n. ° 2). No creo que la penalización deba aplicarse
int(input())
incluso siinput
la firma dice que devuelve una cadena, siempre que esa expresión sea el punto de entrada inicial del programa. Del mismo modo, si el resultado final del programa esprint(x)
yx
debe ser una cadena, la penalización no se aplica a la última operación de conversión de cadenas. Dicho todo esto, nunca dije explícitamente que esto tenía que ser un programa o de dónde debía venir o ir la E / S. Una función que toma unint
y devuelve unint
serviría, y no sufriría estas ambigüedades.
code-challenge
sorting
kojiro
fuente
fuente
" "
Cuenta como una cadena de caracteres múltiples ? Un solo personaje no se consideraría como "multi" ...Respuestas:
GolfScript,
114(4 + 10 (cadena) - 10 (opción inversa))
Entrada en STDIN.
El formato de entrada es este:
1
ordenar normalmente,-1
revertir. 4 caracteres: 10 para la opción inversa = puntaje de -6.La entrada es técnicamente una cadena, por lo que no estoy seguro de si eso cuenta para +10. Estoy interpretando la regla como "una cadena declarada en su programa" (ya que dice "en su código").
Respuesta anterior (puntaje de 11):
fuente
~
se convierte inmediatamente a entero. Pero luego se convierte de nuevo en una cadena con`
. ¿Convertir en una cadena cuenta? Porque a veces la cadena puede no tener varios caracteres (entrada de 1 dígito)chr
), está bien.Haskell 106
ejemplo:
Una respuesta que no esquiva la pregunta.
Se solicitó una explicación, aquí no tiene golf. Es un tipo de burbuja muy ineficiente.
Existen respuestas más cortas en Haskell, equivalentes a algunas de las otras publicadas, por ejemplo:
... puntúa 52 + 20 = 72, o esto, puntúa 45 + 20 = 65:
... pero el espíritu de la pregunta, sin matrices, cadenas o caracteres, es más interesante.
fuente
Integer.MAX_VALUE
-toma unint
. El mío, y algunos de los otros, aceptan entradas de cualquier tamaño, el tipo de entradas
esInteger
equivalenteBigDecimal
en Java. Sin embargo, eso no es lo que entendí que significaba la pregunta, pensé que estaba penalizando las respuestas que 'clasifican' solo números de un dígito.Conjunto C + x86, 636
Sé que esto no va a ganar, pero se sintió tan poco natural y retorcido que tuve que compartirlo. Sin matrices ni cadenas (siempre que no cuente los argumentos de entrada). El número de dígitos está limitado por el rango de 32 bits.
Así que aquí hay una pequeña explicación sobre lo que hice:
Pensé que haría esto sin usar ninguna matriz o cadena, y luego me vino a la mente la recursión, pero, por supuesto, con la recursión no podría intercambiar valores de otras llamadas recursivas ... y fue cuando me di cuenta de que Había un camino. Al vincular mi programa C con una función de ensamblaje, podría saltar en la pila y devolver un puntero al puntero base de la llamada deseada, eso es lo que hace la función "recursionStackAt". Por supuesto, recursionStackAt es una función muy fea, su resultado no solo depende de la entrada o del estado del programa, sino también de la persona que llama. Tenga en cuenta que eso es lo que me hizo cambiar los índices de 0 a 1.
Sin más preámbulos, aquí está el código:
Y, por supuesto, el código de ensamblaje x86 (AT&T sintax, por cierto) para la función recursionStackAt:
Algunos ejemplos en la salida: (1 significa aumentar y 0 disminuir)
Aquí está la versión ofuscada (que es ilegible pero funciona bien):
http://pastebin.com/XkYt9DLy (código C) http://pastebin.com/h0S0dfeU (código x86)
Entonces, si LibreOffice no miente, mi código ofuscado consta de 646 caracteres (sin espacios, ¿debería contarlos?) Y con todas las demás condiciones cumplidas, obtengo un -10 para la opción de aumento / disminución.
Ah, y para compilar esto deberías hacer (en sistemas tipo Unix)
Tenga en cuenta que el indicador -m32 es solo si está en una máquina de 64 bits. También necesita las bibliotecas de 32 bits para compilarlo.
fuente
Bash (eco) (0 + 7 + 0 + 0 + 32-10) = 29
Sorta:
Uso:
Use "-e" para ordenar en reversa:
EDITAR: cambió "cat" a "echo" para que realmente funcione. EDITAR 2: Se agregó "$ *" y se colocó en el script "sorta"
fuente
-e
podría usarse como argumento para la salida inversa.Python3
Mi script presenta:
Sin matrices
Sin cadenas
La complejidad es O (n): utilicé el conteo (modificado por mí para no usar matrices, sino números primos para contar las ocurrencias)
Sin limitaciones de tamaño.
Caracteres:
260234fuente
P
se puede escribirlambda l:((((29-6*l%2,19-2*l%2)[l<9],13-2*l%2)[l<7],2*l-1)[l<5],2)[l==1]
, eliminando bastantes caracteres. Puede que lo haya estropeado un poco, pero la idea es usar una versión anidada del ternario de Python de la vieja escuela (antes de que Python tuviera un ternario)(false_result, true_result)[boolean]
.Bash + coreutils, 14 (24 caracteres - 10 para reversa)
Creo que esto podría estar doblando un poco las reglas, pero aquí va, es viernes ...
Supongo que el uso de bibliotecas estándar está permitido. Mi interpretación de la biblioteca estándar para
bash
escoreutils
:Entrada de stdin. En uso:
fuente
bash
la idea de enteros (declare -i). Editadotr
no le gusta su sintaxis, lo que le costaría un carácter en esos sistemas). De todos modos, diría que estas son todas las operaciones de cadena en el fondo.declare -i
no hace que un nombre sea un entero, solo hace que el shell use contexto aritmético en el RHS de las expresiones de asignación.C - 64 caracteres, 64 puntos
Quizás te preguntes cómo hago que esto funcione sin ningún encabezado. Simple, compilar con:
Sin golf:
También decidí incluir la clasificación de los personajes, solo porque podía.
Pruebas de funcionamiento:
fuente
main(int a,char**b){b++;qsort(*b,strlen(*b),1,strcmp);puts(*b);}
que es más corto de todos modos.c(*a
, mi versión de gcc insistió en que teníamos que hacerlo en suc(char*a
lugar.función c (arco little-endian),
131108 caracteresNingún desafío de clasificación está completo sin una respuesta de sueño . Este tardará hasta 10 segundos en regresar, pero funciona, y creo que está completamente dentro de las especificaciones. Esta función toma un único parámetro int y devuelve un int con los dígitos decimales ordenados:
nuevas líneas y sangría agregadas para facilitar la lectura
Llame de la siguiente manera:
fuente
?:
lugar deif-else
.fork()?c++:(sleep(d),exit(d));
(,)
.Java: 262 puntos
Sí, sí, lo sé, es inútil, pero aún así ...
Análisis (marcado):
StringBuffer
(lo usé porque es más corto queStringBuilder
) (puntaje = 262 + 10 = 272)Uso:
Cuando intenta compilar el
G.java
archivo en el símbolo del sistema, genera muchos problemas (errores). Entonces, la solución?Entonces, esta clase debería ser invocada por un
main()
método de cualquier otra clase (o incluso esa clase misma). Lo pongo en otra clase, así que no lo agrego a mi cuenta de personajes. Compile la otra clase de manera similar (sin usarcmd
). Ahora elmain()
método en la otra clase debería ser algo como:Excluyendo espacios innecesarios, comentarios y saltos de línea, son otros 93 caracteres. No lo agrego a mi personaje porque esto es solo para demostración a través de la consola.
Salida:
CERO,
0
es decir, se considera. Suponiendo que la clase externa esHelper.java
, y se ha compilado con éxito, algunos ejemplos a través de la consola son:Cuando se cambia a
0
ie, descendente ...NOTAS
G.java
. Esa es la clase principal .Integer.MAX_VALUE
porque ese es el tamaño máximo que cualquier matriz puede contener (en Java).fuente
TeX / LaTeX (332)
Si el código real se coloca en un paquete
s
, entonces el archivo principal de LaTeX se ve agradable y fácil. El número solo se da como matemática. Si el número es negativo, se invierte el orden de clasificación. El código del paquetes
también se puede usar con TeX simple, ejemplo más abajo.El paquete
s
(una línea, los extremos de la línea no son necesarios):Resultado:
Puntuación: sin esperanza
Usando TeX simple con
etex
opdftex
, el archivo se puede reducir a:<contents of s.sty>\rm\shipout\hbox{$<number>$}\bye
Bytes: 318 bytes (
s.sty
) + 24 bytes para el resto sin el númeroLas matrices no se utilizan: 0
No veo cadenas de caracteres múltiples: 0
El número no está limitado por el algoritmo. El número TeX más grande es 2 31 - 1 = 2147483647. El ejemplo usa un número de 66 dígitos, mucho más grande: 0
Si se da un signo menos, el orden de clasificación se revierte a descendente: −10
0 + 318 + 24 + 0 + 0-10 = 332
Algoritmo:
Los dígitos se convierten en caracteres activos en modo matemático. Cada dígito recuerda y recoge cada uso en una macro. Después del modo matemático, las macros salen con los dígitos en orden ascendente.
El cambio de dirección se realiza mediante texto de derecha a izquierda, una función de e-TeX.
Versión degolfed del código en
s.sty
Reproducción
Hay algunos compiladores de LaTeX en línea, una lista se puede encontrar aquí . Probé el primer elemento de la lista, el servlet LaTeX en sciencesoft.at . Se puede usar sin firmar y también puede crear URL permanentes: fuente y resultado como imagen .
fuente
C - 65
El observador astuto notará que este algoritmo de clasificación se ejecuta en tiempo O (n) en el número de dígitos
n
.El observador pragmático notará que este algoritmo de clasificación se ejecuta en el tiempo proporcional al rango de enteros con signo en la plataforma, que muta el estado global que debe reinicializarse entre las ejecuciones, y que se han hecho muchos otros sacrificios a favor de la brevedad.
La versión sin golf no es exactamente equivalente, pero transmite mejor el algoritmo real involucrado.
Aquí hay un arnés de prueba para la función:
fuente
Haskell - 96
96 caracteres, sin matrices, sin cadenas, sin límite de enteros, no se puede revertir
Ejemplos:
Este es un tipo de inserción, realizado directamente en los enteros mismos. Esto es similar a la otra entrada de Haskell que es de tipo burbuja, aunque juro que estaba trabajando en eso antes de verla.
Breve guía:
d
divide un número en unidades y decenas, es decir:d 135
es el par(13,5)
a%x
se ordena la inserción de un dígitoa
en el númerox
a&x
ordenax
insertando el dígito de las unidadesa
y recurriendo al resultado y al restos x
ordena x al iniciar la&
recursividad en 0 yx
El truco es que el segundo argumento de
%
y&
no esx
directamente, sinox
divMod'd usandod
fuente
Python3.3 61 puntos
Este programa toma la entrada como una cadena, que cuenta como una cadena porque no se cambia a un entero de inmediato. +10
La cadena se ordena en una matriz +10
Esta matriz se une en una cadena +10
Nota: Lo que se
''
usa para unir el contenido de la matriz no es una cadena de caracteres múltiples, por lo que no se agrega +10 a la partitura.El programa consta de 31 caracteres. +31
31 + 10 + 10 + 10 = 61 puntos
fuente
print(int(''.join(sorted(input()))))
, pero el reparto al número entero solo agregó puntos y no hizo que el código siguiera las reglas más de cerca. Realmente no me mantuve fiel al desafío, supongo. Pero sí afirma que la entrada puede ser una cadena, y la salida puede ser una cadena (para declaraciones de impresión), y no dice nada al respecto:]J, 10 caracteres (+ 1 cadena) puntaje = 20
Uso:
Funciona para todos los números de 32 bits.
Explicación:
/:~
ordenar&.
bajo":
formato. Mi versión anterior también usaba una matriz, pero son costosos, así que ahora solo necesito usar una cadena y ordenar los caracteres alfabéticamente.":
convierte el número que se ingresa en una cadena y/:~
clasifica los dígitos en orden ascendente. Debido a que la ordenación se realiza en formato 'bajo', cuando finaliza la ordenación, la cadena se convierte de nuevo en un número. Agregar la capacidad de revertir probablemente costaría más de lo que ahorra, por lo que no me molesté.Se podría argumentar que dado que J, como APL y K, es un lenguaje basado en una matriz, la entrada única es una matriz de 1 elemento, pero elegí no tener una visión tan dura al calcular mi puntaje.
El límite de 32 bits lo impone J, en lugar de mi programa. Más alto y J cambia los números a notación científica. No queda claro a partir de la pregunta si la penalización de 32 puntos se aplica en este caso, pero incluso si se aplican las dos penalizaciones anteriores (no creo que deberían), el puntaje sube a 72 y aún así supera cómodamente a la gran mayoría de los demás respuestas
fuente
Python 2.7: 174
Funciona creando un diccionario que asigna los 10 dígitos a 0. Luego itera sobre la longitud del número (
log10(i)
), extrae cada dígito ((i / (10 ** c)) % 10
) e incrementa el contador de ese dígito en el diccionario. Finalmente, crea una cadena hecha al iterar sobre los 10 dígitos, y para cada dígito produciendo una instancia del dígito como una cadena.Podría cambiar la última línea con
print"".join(d[n]*str(n)for n in xrange(10))
16 caracteres menos, pero usaría cadenas de caracteres múltiples.fuente
i=int(input())
puede ser iguali=input()
queinput()
evalúa automáticamente el número.C (hasta C90)
o C ++,7866 puntosLa función para ordenar un entero se llama
s
.Puntuación:
int
) (+0)Versión antigua (78 puntos, funciona también con C ++ y versiones C más modernas)
fuente
C # - 179
Sin golf
Prueba
Normal:
Invertido:
Puntos: (Espero haber entendido bien el sistema de puntos; no dude en corregirlo)
C # con LINQPAD - 123
Prueba
Normal:
Invertido:
Puntos:
fuente
Java 1469
Una solución libre de cadenas y matrices en Java. 1437 caracteres + 32 porque solo toma hasta Long.MAX_VALUE como entrada. Al usar Double, podría ir a más de 300 dígitos, pero eso sería demasiado tedioso para implementar. Cualquier cosa más grande que eso necesitaría BigInteger y AFAIK que usa matrices internamente. Si usa menos de 19 dígitos para la entrada, la salida tendrá ceros a la izquierda. La entrada negativa dará todos los ceros y cualquier cosa que no sea un número causará una excepción.
Para el tipo que usé lo más fácil que se me ocurrió, es bastante ineficiente. (debe ser O (n * n))
Sé que esto realmente no se compara con las soluciones en otros idiomas, pero creo que al menos es lo más corto que puedo obtener en Java. (si alguien sabe cómo hacer esto aún más corto, siéntase libre de editar / comentar)
fuente
AWK - 101
El archivo 'x':
La carrera:
La única matriz utilizada es ARGV y esto no es de ayuda en la clasificación, solo es el acceso a los parámetros de la línea de comandos y estos valores están en variables que no son de la matriz donde realmente se necesitan para los cálculos. Creo que esto no contará en contra de esta solución. El siguiente cálculo no tiene en cuenta la matriz ARGV:
111 (caracteres) - 10 (puede hacer reversa)
fuente
No veo nada sobre las funciones de clasificación en la pregunta, así que ... (Voy a eliminar la respuesta si se dobla o rompe las reglas, hágamelo saber)
JavaScript
5696JavaScript
69109 (reversible)Se puede jugar un poco con las funciones de flecha de EcmaScript 6 :
ES6
5090ES6
63103 (reversible) (73-10)fuente
prompt
devuelve una cadena (que no convierte inmediatamente en un entero): +10;split
devuelve una matriz: +20;sort
realiza una ordenación in situ (por lo que sigue siendo la misma matriz);join
devuelve una nueva cadena, +10. Total: 96.SED 67 Chars (puntaje 67 o 107)
Esto usa un tipo de burbuja por brevedad. La puntuación sería 107 si cada patrón de expresión regular y reemplazo cuentan como una cadena (es decir, 67 + (10 * 4))
Número de dígitos manejados limitados por la memoria (y probablemente paciencia)
fuente
Función Python lambda (reversible), 69
n
(entrada) y''.join(...)
(+20)sorted(...)
(+20)d
(-10)Función Python lambda (no reversible), 67
EDITAR: la entrada debe ser una cadena. Estoy considerando la pena de usar esa cadena directamente.
fuente
raw_input([prompt]) -> string
, por lo quesorted(raw_input())
es +10. Ademássorted -> new sorted list
, entonces +20. Entonces,S.join -> string
entonces +10 nuevamente. La notación de corte también implica cadenas, por lo que +10 (cualquier otra cosa que admita la notación de corte podría ser +20). Entonces calculo 73 y 108, respectivamente.print
s en lugar dereturn
ing?lambda
aquí.)print
es más corto y no requiere envoltorios. No sabía que permitirías funciones lambda. Algo así como cuando me leí eso ¿Es correcto ahora?''.join(sorted(str(n)))
. ¿podría decirme por qué esto no se considerará como una respuesta? Soy un poco nuevoLisp común - 126
La versión no golfizada (tanto estilística como léxica, pero funcionalmente idéntica):
Los dígitos de un número negativo se tratan como que tienen un valor negativo, y los dígitos se ordenan menos significativos primero (es decir, little-endian). Ejemplos:
Hay 136 caracteres en la versión de golf, incluido el espacio en blanco. No utiliza cadenas ni matrices, y maneja enteros de precisión arbitraria, incluidos los enteros negativos. La ordenación se parametriza en un predicado binario que define un ordenamiento total en los enteros
[-9, 9]
, incluidos, entre otros,<
y>
:Esto le da un puntaje de 126.
fuente
JavaScript 416/185
Sin matrices, sin cadenas, sin restricciones de longitud arbitrarias ...
Pero ordenar arriba / abajo habría usado más de 10 caracteres ^^ Pero me pareció interesante la idea de contar dígitos e imprimirlos; tal vez alguien pueda usar esta idea en GolfScript y ganar el premio ;-)
El mismo código más corto, usando eval: (pero eso probablemente se consideraría usando cadenas ...)
fuente
C (222)
Puntos:
-10 (ordena al revés si el número (argv [1]) es negativo)
= 222 puntos
Se necesitaban banderas para deshacerse de las 1000 advertencias del compilador:
gcc -Wno-implicit-function-declaration -Wno-return-type -Wno-implicit-int -Wno-char-subscripts -o count2 counta2.c
"Mejor" legible:
Algo descabellado:
fuente
"%""i"
lugar de"%i"
? Se compilan para lo mismo, por lo que solo está desperdiciando dos caracteres.¿Hay alguna razón por la que ya no veo esta solución?
Rubí
No estoy seguro de cómo calificar esto. La división generaría una matriz, pero más allá de eso no estoy seguro ... 38 caracteres + 2x20 para las matrices? ¿O debería incluir todos los arreglos que la clasificación podría crear internamente?
fuente
VBScript - 76 (¿96?)
66 caracteres + 10 para el uso de cadena
n
(no sé si el uso de la
replace
función y lastring
función que devuelve n cantidad de caracteres x se cuenta como una cadena adicional).Cuenta la cantidad de un cierto dígito comparando la longitud de la cadena original con la misma cadena con el cierto dígito reemplazado. Luego adjunta esa cantidad de dígitos a n.
fuente
Python 3 sleepsort (168)
Sin absolutamente ninguna lista o bucle, solo generadores.
Probablemente podría mejorarse.
fuente
Raqueta 97
97 puntos (87 +20 para dos cadenas, -10 para ordenar, sin matrices)
Utiliza listas de caracteres, por lo que debe asignarle una función de comparación de caracteres como
char<?
ochar>?
. Siento que esto también pasa desapercibido ya que no es mucho más que agregar espacios y aumentar los nombres de las variables. Mi versión anterior es quizás más honorable :)Versión antigua sin cadenas:
110 puntos (120 bytes (utf-8) - 10 para permitir cambiar el orden de clasificación. No utiliza cadenas ni matrices)
Sin golf:
Lo probé con el número 100,000 de Fibonacci:
Y lo mismo en orden opuesto:
fuente