Este desafío es escribir un programa o script que cuente la suma de todos los dígitos dentro de los enteros desde 1 hasta e incluyendo un número dado.
Entrada, un entero positivo. Salida, la suma de dígitos en ese número y todos los números más pequeños.
Ejemplos:
Input: 5
Integer Sequence: 1, 2, 3, 4, 5
Sum of Digits: 1 + 2 + 3 +4 + 5 = 15
Input: 12
Integer Sequence: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
Sum of Digits: 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 1 + 0 + 1 + 1 + 1 + 2 = 51
Para ser claros, esto es contar una suma de los dígitos , no los enteros. Para entradas de un solo dígito, esto será lo mismo. Sin embargo, las entradas mayores de 10 tendrán respuestas diferentes. Esta sería una respuesta incorrecta :
Input: 12
Output: 78
Otro ejemplo, para mostrar la diferencia:
Input: 10
Integer Sequence: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Sum of Integers (INCORRECT RESPONSE): 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55
Digit Sequence: 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0
Sum of Digits (CORRECT RESPONSE): 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 1 + 0 = 46
Un caso de prueba más grande (RESPUESTA CORRECTA):
Input: 1000000
Output: 27000001
Reglas y pautas:
- El código enviado debe ser un programa o script completo, no solo una función. Si el código requiere incluye, importaciones, etc., deben incluirse en el código publicado.
- El número debe ser ingresado por el usuario, no codificado. La entrada puede recibirse como un argumento de línea de comando, archivo, stdin o cualquier otro medio por el cual su idioma puede tomar la entrada del usuario.
- El código debe poder manejar correctamente las entradas al menos hasta
(2^64)-1
. - El código solo debería generar la suma.
- Los programas y scripts enviados deben ser fáciles de usar y no desperdiciar recursos informáticos (por ejemplo, no deben declarar matrices increíblemente grandes para contener cada carácter). No hay una bonificación o penalización estricta por esto, pero sean buenos programadores.
Tanteo:
El mecanismo de puntuación principal es por longitud de código. Los puntajes más bajos son mejores. También se aplican las siguientes bonificaciones y sanciones:
- -25 Bonificación si su código puede manejar todos los números positivos, por ejemplo:
1234567891234567891234564789087414984894900000000
- -50 Bonificación si su código puede manejar expresiones simples, por ejemplo
55*96-12
. Para calificar para este bono, el código debe manejar+ - / *
(suma, resta, división, multiplicación) operadores y hacer cumplir el orden de las operaciones. La división es una división entera regular.- El ejemplo dado (
55*96-12
) se evalúa como5268
. Su código debe devolver lo mismo para cualquiera de esas entradas: la respuesta correcta es81393
.
- El ejemplo dado (
- -10 Bonificación si su código califica para la bonificación -50 y puede manejar el
^
operador (exponente). - -100 de bonificación si su código califica para la bonificación de -50 y no utiliza
eval
o similar para manejar expresiones. - +300 Penalización si su código se basa en cualquier recurso web.
55*96-12
volver?Respuestas:
Perl 6: 108 - (25 + 50 + 100) + 0 = -67 puntos
Solución de golf (línea final basada en la gran solución de xfix ):
Solución sin golf:
La etapa de evaluación funciona mediante la iteración sobre cada símbolo de
*
,/
,+
,-
, encontrando al que se encuentra entre dos números enteros, y sustituyendo que el uso de la función que representa el símbolo.Más detalladamente: toma cada símbolo (por ejemplo
+
) y la función infija que se supone que representa (por ejemplo,&[+]
cuál es la abreviatura&infix:<+>
y la misma función que Perl 6 llama cuando ejecuta1 + 2
) y realiza una sustitución global (s:g[…] = …
que es como Perl 5s/…/…/ge
), que coincide con dos enteros separados por el símbolo ((\d+) $sym (\d+)
), y lo sustituye con la salida de la función infija correspondiente llamada con esos enteros (infix($0, $1)
).Finalmente, esta expresión evaluada se alimenta
say [+] (1..$expression)».comb
, lo que xfix explica muy bien en su solución .Perdón por llegar tan tarde a la fiesta ☺
EDITAR: Se eliminó el soporte para exponentes; De todos modos, tenía exactamente 10 caracteres y no asociaba correctamente.
fuente
my $g
que desee utilizar algo predeclarado (creo que$!
podría funcionar, pero no lo he probado).my$g=get;for <* / + -> {$g~~s:g[(\d+)$^s(\d+){}]=infix:[$^s] |@()};say [+] (1..$g)».comb
esto reduciría el puntaje a 88 caracteres o -97 puntosMathematica 30- (10 + 50) = -30
Acortado por 4 caracteres gracias a ybeltukov.
Range@n
devuelve los números del 1 aln
.Integerdigits@n
divide cada uno de esos números en sus dígitos.Total[n,2]
suma los dígitos. El 2 es para permitir la suma en diferentes niveles, es decir, listas de listas.Pruebas
Expresiones
fuente
Tr@Flatten
se puede reducir aTotal[...,2]
:IntegerDigits@Range@#~Total~2&
.C:
150138 - (100 + 50) = -12Robando vergonzosamente la respuesta de @Fors desde aquí para hacer la evaluación de la expresión: https://codegolf.stackexchange.com/a/11423/13877
Uso de la muestra:
Nota: la implementación de la expresión no asume ninguna precedencia del operador y consume valores a medida que los recibe; ex, en
1+2*3 = 9
lugar de lo típico7
.fuente
sed,
411283-25= 258No puedo molestarme más en jugar golf ahora mismo. :-) No se recomienda su uso incluso con números enteros remotamente grandes, pero técnicamente podría tratar con números enteros arbitrariamente grandes (sin embargo, es probable que se quede sin RAM bastante rápido, ya que (más o menos tengo que) codificar el número en unario).
Uso de la muestra
(Líneas de entrada con sangría para facilitar la lectura).
fuente
pitón, 55- (50 + 25 + 10) = -30
In-eficiente pero más corto y también capaz de manejar expresiones.
EDITAR: Gracias Wolframh y legoStormtroopr por los trucos: D
pitón, 149- (25 + 50 + 10) = 64
Mi primera version
entrada:
salida:
fuente
xrange
solución en1234567891234567891234564789087414984894900000000
xrange
: Deval(raw_input())
porinput()
. Elwhile
bucle podría serwhile t:s+=sum(map(int,
t));t-=1
.input()
lugar deeval(raw_input())
, comoinput
yaeval
es la expresión! ¡Esto significa que puede obtener el binus -10 para el símbolo de poder y el bono -100 por no usarloeval
!eval
y similares , así que creo que el -100 no contaríaPython - 108 caracteres menos 85 bonos, 23 golpes, maneja entradas muy muy muy grandes
La mayoría de estas soluciones parecen estar girando sobre todas las entradas menos que la entrada y sumando todas sus sumas de dígitos. Esto funciona, pero creo que es poco elegante, y cuestionaría si son realmente elegibles para la bonificación de 25 puntos, ya que no creo que puedan manejar la entrada
1234567891234567891234564789087414984894900000000
dentro de nuestras vidas. De hecho, en una entrada den
dígitos, estas soluciones tomanO(10^n)
tiempo. En su lugar, elegí arrojar algunas matemáticas a este problema.El conjunto de todos los
x
números de dígitos es isomorfo al conjunto{0,1,2,3,4,5,6,7,8,9}^x
. Para un fijo(n,sig)
hayx
diferentes valores parasig
,10^x-1
puntos con elsig
índice th establecido enn
, y la suma de todos los dígitos0-9
es 45. Todo esto se maneja mediantef
.g
es algo con lo que probablemente todos estamos familiarizadosmagic
toma todos los dígitos del número de entrada y los repite de menor a mayor importancia. Es más fácil rastrear esto con una entrada de ejemplo, por ejemplo1,234,567
.Para tratar con el rango
1,234,567-1,234,560
, debemos sumar todos los dígitos de1
a7
, y sumar7
veces la suma de los otros dígitos, para tratar con todos los números mayores que1,234,560
. Ahora tenemos que lidiar con el resto.Para lidiar con el rango
1,234,560-1,234,500
, agregamos el6
(val
) y colocamos el límite superior en1,234,559
. Al hacer el resto de la caída, veremos cada número de un solo dígito 6 veces (val*f(sig)
). Veremos todos los números desde0
hasta5
exactamente10
cada uno ((10**sig)*g(val-1)
). Veremos todos los otros dígitos en este número exactamente 60 veces ((val*10**sig)*sum(digits[sig+1:])
). Ahora hemos tratado con todos los números estrictamente mayores que1,234,500
. La misma lógica se aplicará inductivamente en todos los significados.Jugar al golf con gracias a WolframH reduce esta solución a
Y la suma de las sumas de dígitos de todos los enteros hasta
1234567891234567891234564789087414984894900000000
es265889343871444927857379407666265810009829069029376
El número más grande que he logrado lanzar en la versión de golf es 10 ^ 300, momento en el cual los flotadores comienzan a desbordarse y la inestabilidad numérica comienza a causar problemas. Con una función de exponenciación rápida de cuadrado y multiplicación, este problema desaparecería.
Y el soporte de LaTeX sería realmente útil ...
fuente
2.65889343871e+50
, que es una aproximación de punto flotante de la solución real. Aparentemente imprimiste enint(t)
lugar det
como en el código que diste. Eso está mal; La verdadera solución es265889343871444899381999757086453238874482500000214
. Simplemente evite usar flotadores, es decir, reemplácelos**(x-1)
por los más cortos**x/10
.d
(porque se usa dos veces). Eliminando a los demás (y usando algunos trucos) se llega ad=map(int,str(input()))\nprint sum(v*(10**s*((v-1)/2+sum(d[:~s]))-~s*9*10**s/2)for s,v in enumerate(d[::-1]))
(108 caracteres). Funciona bien en entradas de cualquier tamaño (comoint("1"*1000)
).10**-1
es0.1
, y a partir de ahí todo se convierte en flotadores.1/10
es0
(división entera), y todo puede permanecerint
s.TI-BASIC, 137 - (50 + 10 + 100) = -23
La entrada maneja números hasta
1E100
y evalúa automáticamente. Puede manejar expresiones.Aunque es una matriz increíblemente grande, no estoy desperdiciando recursos informáticos (esto se ejecuta desde una calculadora ).
fuente
eval
debe aprovechar la ventaja de no usar .Scala 66
fuente
C,
7774C,
150124-25 = 99Aquí hay una versión alternativa que técnicamente debería ser elegible para la bonificación de 25 para "cualquier" número entero positivo, pero es prácticamente lenta ya que el algoritmo es de tiempo lineal en su entrada. De todos modos, fue divertido escribir. Resta manualmente un número leído como caracteres ASCII. Esta versión tiene 150 caracteres. (¡Ahora con un código horrible, de discusión y de bucle!)
C,
229224 - (50 + 100) = 74Variación de manejo de expresiones. Implementos de precedencia de los operadores de acuerdo a las reglas típicas:
/ * - +
. Limitado a 97 tokens = 48 términos.fuente
GolfScript 18-50 = -32
Explicación: Supongamos que la entrada es "12":
Pila es
[0,1,2,3,...,12]
.Pila es
"01234...9101112"
.Pila es
"0 1 2 ... 1 0 1 1 1 2"
.Pila es
[0,1,2,...,9,1,0,1,1,1,2]
.La pila es 51, según lo deseado.
La entrada aquí podría ser cualquier expresión válida de GolfScript, que puede incluir exponentes. Por ejemplo:
Desde
2(5 + 5) - 8 = 12
. Creo que esto debería calificar para la bonificación, pero tal vez se esperaba que fuera solo si estaba en forma normal, no la notación polaca inversa de GolfScript.fuente
^
también??
^
, no?
o,pow
etc.Rubí, 37-50 = -13
¡Doble evaluación, todo el camino a través del cielo! Al igual que con las otras soluciones de Ruby, creo que en teoría esto debería ser capaz de funcionar con números arbitrariamente grandes, pero el tiempo de ejecución sería ... terrible.
Versión anterior (49-50 puntos)
Suponiendo que la bonificación de 10 caracteres realmente requiere que el carácter de exponenciación sea un símbolo de intercalación, la forma más corta que podría agregar es:
Lo que cuesta más personajes de los que daría la bonificación.
fuente
p"#{[*1..eval(gets)]}".chars.map(&:to_i).inject :+
&
casi lo suficiente en el golf. De hecho, no necesita el espacio entreinject
y:+
tampoco.Perl 6 (28-75 + 0 = -47 bytes)
Puede manejar todos los números positivos (sin embargo, los grandes tardarán mucho tiempo, porque actualmente las implementaciones de Perl 6 son lentas, pero Perl 6 admite números enteros grandes de forma nativa). Utiliza
eval
, para implementar una calculadora simple (la pena de cinco caracteres por cincuenta caracteres vale la pena). Es lento solo porque las implementaciones actuales son lentas, pero en teoría, debería ser lo suficientemente rápido (cuando las implementaciones de Perl 6 mejoran, eso es). Además, sorprendentemente, gano con Mathematica (por ahora).»
en este código en realidad no es necesario, pero lo puse aquí por razones de rendimiento (de lo contrario, el programa asignaría una cadena completa. La razón por la que está aquí es que Perl 6 no tiene cadenas infinitas, pero sí tiene listas infinitas.De todos modos, puede preguntar cómo funciona este código. Bueno, lo voy a pasar parte por parte.
get.eval
Esto obtiene una línea (
get
función) y la evalúa (eval
método).1..get.eval
Después de eso, Perl 6 prepara un objeto de rango, desde el
1
valor evaluado. Este es un rango, por lo que no se asigna nada enorme.».comb
.comb
El método divide la cadena en caracteres (a menos que se llame con un argumento ). Por ejemplo,'cat'.comb
vuelve'c', 'a', 't'
.»
asigna los elementos de la lista, por lo que.comb
se ejecuta en cada elemento, no solo en la lista misma (por ejemplo,(4, 9)».sqrt
da2, 3
). Esto tampoco asigna más de lo necesario, porque Perl 6 tiene listas infinitas (como Haskell, por ejemplo).»
el carácter en realidad no es necesario, ya que.comb
se puede usar directamente en la lista, pero esto implica una coerción de cadena implícita (y Perl 6 no tiene cadenas infinitas, por lo que desperdiciaría memoria). Por ejemplo, la1, 2, 3
lista después de la conversión a la cadena devuelve1 2 3
. Para Perl 6, un espacio es un número perfectamente fino que significa 0, por lo que el código funcionaría, incluso con dicha conversión. Sin embargo, abusaría de los recursos informáticos.[+]
Este es un operador reducido. Básicamente, entre
[]
, puede utilizar un operador, en este caso+
. La lista después del operador reduce se reduce, así[+] 1, 2, 3
es1 + 2 + 3
, cuál es6
. Perl 6 usa operadores separados para números y cadenas, por lo que no se considerará concatenación.say
Finalmente,
say
genera el resultado. Después de todo, quieres ver el resultado final, ¿no?fuente
[+] 1,2,3,4,5,6,7,8,9,10
es1+2+3+4+5+6+7+8+9+10
, ¿estoy en lo cierto?>
se puede encadenar, por lo que3 > 2 > 1
es cierto. La misma propiedad se aplica para reducir los operadores, por lo que[>] 3, 2, 1
sigue siendo cierto, ya que significa que3 > 2 > 1
-[>]
se puede utilizar para determinar si los números están en orden descendente.get.Int
lugar deeval
? ¿Necesita expresiones matemáticas?sort
sin argumento de método de comparación).Perl 31 - Sin bonificaciones
Salida de muestra:
Perl 5 con
-p
, 50 - 28 bytes: -22Pruébalo en línea!
fuente
J, 22
Explicación
La evaluación procede de derecha a izquierda.
fuente
+/,10#.inv>:i.
sería más corto. Pero sigue siendo una función y no un programa completo como OP preguntó.R, 64 - (50 + 10) = 4
Cuando esto se ejecuta, se le pide al usuario que ingrese.
Versión anterior (no puede manejar expresiones): 46 caracteres:
fuente
u<-function(x) utf8ToInt(x)
etc.u <- utf8ToInt
sinfunction
. Esto puede ser útil para el golf de código si la función se usa varias veces.Rcheatcodegolf
paquete, ¿es legal usar las funciones predefinidas en ese paquete? :-)Lote - (181-50) - 131
Solo por un poco de diversión.
Lo haré un poco más legible:
El método anterior usa el bucle para obtener la salida del comando powershell, en lugar de escribir y leer desde un archivo:
Establezca la entrada en una variable -
v
- usando/a
para aceptar expresiones aritméticas.Desafortunadamente, fue necesario habilitar la expansión demorada.
Use un bucle for para contar desde 1 hasta el valor ingresado -
v
.Para manejar números mayores que 9, tuve que usar powershell para obtener la longitud de la cadena y luego usar otro bucle for para dividir esa cadena y agregarla a la suma -
s
.Usted podría cambiar el nombre de
powershell.exe
ap.exe
en C: \ WINDOWS \ System32 \ WindowsPowerShell \ v1.0 \ luego llamar con sólop "&{'%%a'.length-1}
, el ahorro de 9 bytes. Pero eso no está realmente en el espíritu de eso.Dejé el segundo corriendo mientras tomaba mi almuerzo.
Realmente no puedo probarlo con números que son demasiado grandes debido a lo lento que es. Sin embargo, debería funcionar para números bastante grandes.
2147483647
es el número más grande que tomará (máximo de 32 bits enteros) antes de dar el siguiente error:Por supuesto, esto me descalifica del desafío.
fuente
v
y usarla%1
directamente. 2. Puede restar 1 dentro de su script de PowerShell en lugar del largo@set /a b=%%b-1
que le ahorra un montón. Con esos cambios, lo reduzco a 211 de los 240 originales. :-)[decimal]
tipo permite valores de hasta (2 ^ 96) -1.Dyalog APL , 9-160 * = -151
Pruébalo en línea!
⎕
obtener una entrada evaluada,por ejemplo,
"7+5"
da12
⍳
índices 1 ... n[1,2,3,4,5,6,7,8,9,10,12]
⍕¨
formatee cada número en cadena["1","2","3","4","5","6","7","8","9","10","11","12"]
∊
alistarse (aplanar)"123456789101112"
⍎¨
Ejecuta cada carácter (produce una lista de números de un solo dígito, números)[1,2,3,4,5,6,7,8,9,1,0,1,1,1,2]
+/
suma51
* Puntuación
-50 de bonificación ya que incluso acepta expresiones como entrada. La expresión debe ser APL válida, que es aceptable según OP .
-10 bonus porque porque también maneja el
^
(*
en APL).-100 bonus porque la entrada de expresión se maneja sin el uso explícito de
eval
(es decir,⍎
en APL).fuente
eval
o similar para manejar expresiones " . Dado que⍎¨
parece ejecutar cada carácter uno por uno, es lo mismo que una evaluación (excepto que ejecuta los caracteres uno por uno en lugar de todos al mismo tiempo como loeval
hace).⍎¨
solo se usa para convertir dígitos a enteros, no para manejar expresiones.⎕
un poco una entrada + evaluación incorporada entonces, o la evaluación siempre se realiza implícitamente cuando se introducen expresiones?⎕
siempre toma una expresión como entrada, la evalúa y devuelve su resultado. Entonces, para ingresar una cadena, tendría que poner comillas alrededor de ella. El hecho de que un incorporado incorporado (⍞
) devuelva la entrada como texto sin formato no debería importar (especialmente porque los símbolos indican que⎕
es el método de entrada principal y⍞
es una variante especial), ya que de lo contrario obtener la bonificación requeriría implementar una matemática evaluador: una tarea completamente diferente a la principal. No me gustan los bonos, y el -100 es simplemente tonto o tenía APL en mente, pero en mi opinión, parece un ajuste exacto para el bono.⎕
hecho es la forma normal de obtener información y maneja automáticamente las expresiones, de hecho veo que también encaja en el bono, por lo que hago un +1. Los bonos son tontos en estos días de todos modos, pero es una buena forma de utilizarlos para minimizar su puntaje.C # (161)
Bonita
fuente
Python3 + Bash (78-185 = -107)
Si el resultado de la expresión no es entero, primero se truncará. Si el resultado de la expresión es negativo, el resultado no está definido.
Úselo como:
1: a menos que cuentes invocar Python desde Bash como tal, pero no creo que sea así. Si crees que realmente lo es, entonces la puntuación ajustada es -7.
fuente
Java, 254
Maneja expresiones. Dale cualquier expresión que desees en el objetivo. Maneja hasta que la longitud larga pueda manejar. Si limpia quitando todos los espacios en una línea, y no hay ninguna declaración para imprimir, cuenta hasta 254 caracteres (considerando la programación Java basada en palabras largas y largas).
PD: Este es un programa completo, no solo lógico. Las palabras cuentan para el programa, no solo la lógica.
fuente
Java (JDK8), 272
Mi primer desafío en el que estoy, las sugerencias son bienvenidas =)
Sangrado:
fuente
CJam, 9-25 = -16
CJam es unos meses más joven que este desafío, por lo que no es elegible para la marca de verificación verde. Además, esto no está ganando a Perl en primer lugar. ;) Me gustó bastante el enfoque, así que quería publicarlo de todos modos.
Pruébalo aquí.
La idea es crear un rango de 0 a N. Este rango se convierte en una cadena, que simplemente concatena los enteros de forma consecutiva. Para N = 12, obtendríamos
Luego, cada carácter se convierte en un entero con
:~
(lo que produce una matriz de enteros), y luego se resume con:+
. CJam puede lidiar con enteros arbitrariamente grandes.fuente
Python 3 + astor ,
10171007 bytes - (25 + 50 + 100) = Puntuación:842834ahorró 10 bytes al eliminar
ts
y cambiarp
editar: no puedo probar el número entero ridículamente largo (1234567891234567891234564789087414984894900000000) [cuelga mi computadora] pero, que yo sepa, Python 3 admite números enteramente largos.
Esta implementacion
usosabusa de AST. No consideraría abusar de AST como "eval o similar".Demasiado perezoso para escribir sin golf, así que te daré una explicación de las clases:
La última línea solo ejecuta estas clases en el orden apropiado en la entrada, para preservar el orden de las operaciones y evitar comportamientos no deseados.
Ejemplo de uso ($ o> significa entrada del usuario) y, por cierto, el programa real solo ingresa una vez:
fuente
C # (108)
Bonita
fuente
int
s; en C, todo lo predeterminado esint
... Oh, es C #.Rubí -> 83-50 = 33
Versión "a prueba":
Resultados de las pruebas
fuente
C # (80)
Es mi otro intento.
Bonita
fuente
n--
y+
necesario? No creo que esté en otros lenguajes de estilo C.2^64-1
no cabe en 64 bits.4.5
; 2) la suma promedio de 20 dígitos es90
(2^64
tiene 20 dígitos); entonces el valor esperado estará alrededor90 * 2^64 ≈ 1.66*10^21
. Entonces necesitarías al menos71
bits, como máximo72
.Rubí 69-50 = 19 (o -4)
Esto definitivamente se puede jugar juntos, pero aquí está el
primerquinto intentoTambién funciona para todos los números, pero es muy lento para ellos, ya que funciona más lento que O (n), por lo que no agregaría el -25. Si la lentitud está bien, entonces sería -4 aunque
Rubí 133-50-25 = 58
Esta es la versión más rápida, que se ejecuta en menos de O (n) tiempo (¡y usa las matemáticas reales!), Por lo que puede proporcionar resultados para enteros grandes rápidamente, por lo que agregué el -25:
fuente
Haskell, 74-25 = 49
main=getLine>>=print.sum.map(\c->read[c]).concatMap show.(\x->[0..x]).read
fuente
interact
y el hecho de que>>=
para las listas es lo mismoflip concatMap
, puede reducir esto a 63 caracteres como este:main=interact$show.sum.map(\c->read[c]). \x->[0..read x]>>=show
\c->read[c]
esread.(:[])
ECMAScript 6, 86-50 = 36
fuente
for(i=eval(prompt(s=""));i;s+=i--)alert(s.replace(/\d/g,c=>Array(-~c).join()).length)
..join()
):for(i=eval(prompt(s=""));i;s+=i--)alert(s.replace(/\d/g,c=>Array(-~c)).length)
. 78-50 = 28 !R (72 puntos)
Salida:
fuente