Debe tomar 2 entradas de cadena y generar la suma de estas dos cadenas sin convertirlas a int o usar ningún tipo de datos numéricos.
ex.
string one = "123";
string two = "456";
string sum = "579";
Suponga que las cadenas no tendrán más de 10 dígitos.
Este es el código de golf y la respuesta más corta en caracteres gana. Una edición de la respuesta en C # me hará sonreír :).
Editar: la conversión a int se puede definir como cualquier cosa de esta naturaleza
Int.TryParse
, (int)
, Convert.ToInt
Etc.
code-golf
string
arithmetic
CSharper
fuente
fuente
Respuestas:
80836 Asamblea (
5753 bytes)Esto agrega, dígito a dígito, de derecha a izquierda, sin convertir dígitos ascii
'0'-'9'
a los enteros0-9
, y transferirlos según sea necesario. El bytecode es el código para una función, que se puede llamar en C (ver más abajo).El bytecode anterior se escribió a mano, a partir del siguiente ensamblado (estilo NASM, comentado):
Para probar esto en C (gcc, linux, procesador Intel):
fuente
Rubí,
10971Caseoso. Si no puedes traer a Mohammad a la montaña ...
Algoritmo:
Registro de cambios
71 más corto como una matriz.
85 declaración de método eliminado y consolidar llamadas a
n.to_s
92 aplicaron algunos consejos
101 guardar un char
102 usa x para incrementar
109 confirmación inicial
fuente
succ
oprev
... pero eso ni siquiera es divertido para el golf.sed, 359 bytes (sin el formato elegante)
Todavía no estoy seguro de si este es un duplicado de Agregar sin adición (o cualquiera de los 4 operadores aritméticos básicos) . Mientras tanto, permítanme publicar mi respuesta cruzada para esa pregunta. No va a ganar golf, pero es un comienzo, y creo que cumple fácilmente con las especificaciones:
La entrada se toma de STDIN en la forma "x y". Eso se transforma primero en "x: 0 :: y:". Luego incrementamos todos los números que vienen después de los caracteres ":", hasta obtener "x: x: :( x + y):". Entonces finalmente regresamos (x + y).
Salida
Tenga en cuenta que esto solo funciona para los números naturales. Sin embargo (al menos en teoría) funciona para enteros arbitrariamente grandes. Debido a que estamos haciendo operaciones de incremento de x en y, ordenar puede hacer una gran diferencia en la velocidad: x <y será más rápido que x> y.
fuente
y
se convierte ay+1
usar solo regex? y ninguna adición real? ¡Agradable!Rubí -
485432265Esto parece más en el espíritu de lo que estaba buscando en la pregunta.
Básicamente resuelve el problema como lo haría un humano en el papel: "memorizando" todos los resultados de suma de un solo dígito, agregando cada columna y entendiendo cómo "cargar el uno" cuando sea necesario.
Esto también está utilizando un "tipo de datos numéricos" (variable i), que está prohibido por la pregunta, pero es solo para la indexación de cadenas. Intentaré eliminar esto y editaré mi respuesta.
Algo descabellado:
EDITAR: Usó algunas ideas de los comentarios para generar la tabla de mapeo "memorizada" en lugar de simplemente codificarla.
fuente
[?1..?9].zip([?1..?9]).map{|x,y| Regex.new(x+y)}.map{/*something based on the order of results*/}
product
es mejor quezip
/#{x+y}/
es más corto queRegexp.new(x+y)
. ;)i=-1;(s=(?0..?9).to_a).product(s).map{|x,y|i+=1;/#{x+y}/=>(?0..'18').each_cons(10).to_a[i/10][i%10]}
te da tu matriz de expresiones regulares.i
) ... debe haber otra forma de evitar eso ... ¿tal vez solo usarloeach_cons(10)
como enumerador y anext
través del conjunto?CJam,
95 92 80 72 7044 caractereslo que se traduce en
Esto definitivamente se puede jugar mucho al golf. Realmente no sé si mi enfoque es óptimo o no todavía.
ACTUALIZACIÓN : en línea la creación de la matriz de suma para guardar bytes. Debido a esto, el programa ahora se ejecuta 10 veces más lento, pero sigue siendo un tiempo constante para cualquier tipo de entrada.
Pruébalo en línea aquí
Lee la línea que contiene dos números de STDIN como una cadena y genera una matriz de caracteres que es una cadena en sí misma.
Por ejemplo:
La salida contiene precedente
0
. Avíseme si eso es un problema.fuente
C # -
128108104Gracias a Compass, BMac y Shawn por sugerir mejoras.
Primero intente en Code Golf, y usar C # parece ser una desventaja aquí ...
Al usar
.Compute()
puede usar los valores de cadena y sumarlos directamente. Como beneficio adicional, esto funciona para otros operadores además de "+".Golfizado:
Sin golf:
Llamar
t("123","456");
te da 579.fuente
System.Console.WriteLine(new System.Data.DataTable()...
Console.Write
para guardar 4 bytesGNU sed, 266 bytes
Utiliza un enfoque diferente que la solución de DigitalTrauma. Como efecto, este funciona aún peor, usando O (m + n) . Convierta ambos operandos a unario, concatene, vuelva a convertir a decimal (todo utilizando expresiones regulares, por supuesto, sed no tiene el concepto de un entero).
Como beneficio adicional, este programa resume todos los enteros naturales dados en stdin (en la primera línea), lo que significa que no puede alimentarlo con nada, un número o diez números y hará lo correcto independientemente.
La idea detrás de este código está vagamente inspirada en una antigua presentación de PPCG, aunque no recuerdo para qué pregunta es una respuesta.
Aquí está, "bonito", impreso para su "conveniencia", para tomar prestada otra idea de DigitalTrauma. :RE
(Para obtener la versión de 266 bytes, elimine los puntos y comas finales, los espacios en blanco iniciales y el comentario final, preferiblemente usando sed).
Préstamo de algunas pruebas de DigitalTrauma:
Ajusté un poco las pruebas realmente grandes debido a la terrible eficiencia de espacio (in). Debido al uso de
q
solo se procesa la primera línea, de ahí elwhile
bucle en la prueba.fuente
Java 6 (181 caracteres)
Para no ser superado por la discapacidad conocida como C # , Java en todo su esplendor. ¡Tanto repetitivo! El uso es proporcionar los argumentos separados por un espacio, es decir
123 456
Sin golf:
Al usar el motor de JavaScript disponible en
javax
, podemos hacer que otro idioma haga el trabajo por nosotros, y técnicamente seguir las reglas de no usar ningún tipo numérico en el idioma nativo, o convertir.Justificación para usar
eval
No hemos convertido los valores a int para que JavaScript evalúe. Hemos creado una cadena que
"123+456"
no es un número. JS Engine digiere la fórmula y evalúa la cadena como literales numéricos, que no son tipos de datos numéricos. Java lógica cursi! Por otro lado, esto también funciona para lasdouble
matemáticas.fuente
dc -e"$1 $2+p"
técnicamente, no he usado un tipo de número en la bash nativa, solo está pasando una cadena a algunos detalles de implementaciónAPL (61)
Creo que esto cae dentro de las reglas.
Esta es una función que toma dos argumentos de cadena y devuelve una cadena:
También es razonablemente rápido, agrega el número formado por 999999
9
s en un instante.Encuentra el índice de cada carácter en
⎕D
(que es la cadena '0123456789'), luego suma la escuela primaria en cada índice por separado, transporta según sea necesario, luego busca los dígitos resultantes⎕D
. (Creo que la⎕D
búsqueda se encuentra dentro de las reglas, básicamente solo lo está haciendo'x'-48
).Explicación:
⎕D∘⍳¨⍺⍵
: busca los índices⎕D
para cada personaje en ambas cadenas.¯1+
: resta1
de cada uno, porque las matrices están basadas en 1 por defecto.⌽↑⌽¨
: invierta ambos, conviértalos en una matriz (llenando cuadrados vacíos con ceros), luego invierta la matriz.+⌿
: suma las columnas de la matriz{
...}
: transferir:∨/T←9<Z←0,⍵
: agregue un extra0
al frente de la lista. Averigüe qué 'dígitos' son mayores que 9 y guárdelosT
. Si alguno de los dígitos fuera superior a 10:Z-10×T
: resta10
de cada posición que sea superior a 10,T←(1⌽T)+
: agregue1
a cada posición al lado de cada posición que era superior a 10 y almacene enT
.T↓⍨~×⊃T
: siT
comienza con un cero, elimínelo,∇
: aplica la función carry al resultado.⋄⍵
: de lo contrario, devuelve el valor sin cambios1+
: agregue uno a cada posición (porque la matriz está indexada en 1)⎕D[
...]
: usa el resultado como índices en⎕D
.fuente
Perl -
136119115 bytesEstoy aprendiendo Perl, esto parecía una buena práctica. Los consejos son apreciados!
Respuesta cursi, para sacar eso del camino:
Respuesta real:
Sin comprimir:
fuente
($x,$y)=@ARGV
y usar ensay
lugar deprint
reducirá algunos caracteres.say
es una cosa de Perl 6 (o podría usarlo en Perl 5 con estas instrucciones, pero eso sería demasiado largo). En lugar desay
, usawarn
para afeitar a un personaje. Eso generará STDERR en lugar de STDOUT, pero eso no va en contra de las reglas de este. :-)Java 7, Puntuación = 252
No utiliza números enteros, largos, bytes, cortos, dobles, flotantes ni ninguna función de biblioteca integrada para agregar. Envuelva en un cuerpo de clase y llame con
t(String1,String2)
. Rellene las cadenas con 0 para que tengan la misma longitud.t("123","234")
vuelve"0357"
.Golfizado:
Golf ampliado con clase:
Parcialmente golfizado expandido:
100% expandido:
fuente
char
es un tipo de datos numéricos ._.\u0030
en una cadena, consigo"0"
no"48"
.Java - 257 caracteres
Como todo el mundo sabe Java, no hay mejor lenguaje para el golf que Java
esta es una solución sin golf
fuente
Haskell -
9894 bytesfuente
JavaScript (ES6),
55 6659 ** Esto hace algunas suposiciones:
La entrada se define en las variables ayb, por ejemplo: secambió para obtener la entrada desde el indicador (+11).var a='123',b=321';
fuente
Python 2.7,
196137caracteresversión 2 (más corta inicializando el diccionario con código):
Versión anterior 1 (196 caracteres):
p.ej
Las teclas del diccionario son cadenas, los valores del diccionario solo incluyen constantes numéricas para acortar el código, y el cálculo se realiza concatenando dos cadenas y obteniendo la longitud resultante, por lo que espero que cuente como "no convertirlas en ints".
Versión de trampa de reglas de letra pequeña de Python
Nota:
El tipo z es un tipo personalizado que defino como: definitivamente no es un tipo numérico por cualquier definición que utilice el interrogador, pero se comporta lo suficientemente cerca de un tipo numérico como para ser útil en circunstancias limitadas . Los comportamientos de tipo z solo se implementan parcialmente en este ejemplo de código, y si el intérprete de CPython usa 'int' para implementar z , eso es simplemente un detalle de implementación y no está relacionado con el problema en cuestión.
fuente