Ha habido muchos desafíos de "Hacer __ sin _ _" antes, pero espero que este sea uno de los más desafiantes.
El reto
Debe escribir un programa que tome dos números naturales (números enteros> 0) de STDIN e imprima la suma de los dos números en STDOUT. El desafío es que debe usar la menor cantidad posible de signos +
y -
señales. No está permitido utilizar ninguna función de suma o negación.
Ejemplos
entrada
123
468
salida
591
entrada
702
720
salida
1422
Desempate:
Si dos programas tienen el mismo número de +
y -
caracteres, el ganador es la persona con menos /
*
(
)
=
.
,
y 0-9
caracteres.
No permitido: idiomas en los que los operadores estándar de suma / resta e incremento / decremento son símbolos distintos +
o -
no están permitidos. Esto significa que el espacio en blanco no permite el idioma.
fuente
+
o-
...+
,-
y personajes de desempate? ... o necesita cambiar las reglas nuevamente :-)Respuestas:
Perl (sin +/-, sin desempates, 29 caracteres)
Como beneficio adicional, puede hacer que el código sume más de dos números agregando más
x
s als!!xx!
.Alternativamente, aquí hay dos soluciones de 21 caracteres con 1 y 3 interruptores de corbata respectivamente
Nota: Estas soluciones usan la
say
función, disponible desde Perl 5.10.0 con el-E
interruptor de línea de comando o conuse 5.010
. Consulte el historial de edición de esta respuesta para ver las versiones que funcionan en perls anteriores.¿Cómo funciona la solución sin desempates?
s!!xx!
es un operador de reemplazo de expresiones regulares , que opera de manera predeterminada en la$_
variable, que reemplaza la cadena vacía con la cadenaxx
. (Por/
lo general, se usa como delimitador de expresiones regulares en Perl, pero en realidad se puede usar casi cualquier personaje. Elegí!
ya que no es un desempate). Esta es solo una forma elegante de"xx"
pretender$_
- o, ya que$_
comienza vacío (indefinido, en realidad), es realmente una forma de escribir$_ = "xx"
sin usar el signo igual (y con un carácter menos, también).s!x!$"x<>!eg
es otro reemplazo expresión regular, esta vez reemplazando cadax
en$_
con el valor de la expresión$" x <>
. (Elg
modificador especifica el reemplazo global,e
especifica que el reemplazo debe evaluarse como código Perl en lugar de usarse como una cadena literal).$"
Es una variable especial cuyo valor predeterminado es un solo espacio; usarlo en lugar de" "
guardar un personaje. (Cualquier otra variable que se sepa que tiene un valor de un carácter, como$&
o$/
, funcionaría igualmente bien aquí, excepto que usarla$/
me costaría un desempate).El
<>
operador de entrada de línea , en contexto escalar, lee una línea de la entrada estándar y la devuelve. Elx
antes es el operador de repetición de cadena Perl , y es realmente el núcleo de esta solución: devuelve su operando izquierdo (un carácter de espacio único) repetido el número de veces dado por su operando derecho (la línea que acabamos de leer como entrada).y!!!c
es solo una forma oscura de (ab) usar el operador de transliteración para contar los caracteres en una cadena ($_
de forma predeterminada, de nuevo). Podría haber escritosay length
, pero la versión ofuscada es un carácter más corto. :)fuente
code-golf
con algunas restricciones de origen?R (24 caracteres)
Qué hace esto:
scan
lee la entrada de STDIN (o un archivo)sequence
genera secuencias enteras a partir de 1 y concatena las secuencias. Por ejemplo,sequence(c(2, 3))
resultados en el vector1 2 1 2 3
length
calcula el número de elementos en el vector concatenadoEjemplo 1:
Ejemplo 2
fuente
re
poco jugando para ganar
Como beneficio adicional, el código compilado no contiene una operación de agregar (aunque no puede hablar por la llamada readf)
fuente
Python 2, 43 bytes
fuente
print sum(input(),input())
GolfScript
No +/- o desempates:
Versión mucho más simple con dos personajes de desempate, usando el mismo truco de concatenación de listas que otras personas están usando:
Supongo que GolfScript no está descalificado por tener
)
como operador de incremento, ya que en realidad no lo estoy usando.fuente
C (solo 32 bits)
La aritmética del puntero es igual de buena.
¿Cómo coincide con los requisitos?
* No
+
o-
* n
/
,=
,.
,0
-9
* Sólo 3 pares de paréntesis, lo que parece a mí mínima (que necesita
main
,scanf
,printf
).* Uno
*
(el enfoque del puntero lo requiere).* Cuatro
,
(podría guardar uno definiendo variables normales, noac,av
)fuente
C ++ 0 +/-, 3 desempates
fuente
Haskell, 0 + 2
Esto usa no
+
o-
caracteres, y solo dos=
del conjunto de caracteres de desempate, uno de los cuales es obligatorio para el enlacemain
. La suma se realiza mediante la concatenación de listas de las longitudes apropiadas.fuente
EDITAR Esto fue publicado ANTES de que las reglas cambiaran para no permitir
sum
...El lenguaje R: No hay llamadas
+
ao-
... ¡Y 9 personajes de desempate!Ejemplo:
El
[1] 579
es la respuesta 579 (el[1]
es hacer un seguimiento de dónde se encuentra en el vector de resultados ya que en R todos los valores son vectores, en este caso de longitud 1)Tenga en cuenta que R tiene
+
operadores al igual que la mayoría de los lenguajes; resulta que también tiene operadoressum
que resumen un montón de vectores.En este caso,
readLines
devuelve un vector de cadena de longitud 2. Luego lo coacciono a numérico (dobles) y lo sumo ...Solo para mostrar algunas otras características de R:
fuente
colSums
en su lugar ... Tal vez también prohíba las "funciones similares a la negación" mientras estás en eso ...El lenguaje R
Nuevas reglas, nueva respuesta, mismo lenguaje. No hay llamadas
+
ao-
ACTUALIZACIÓN Usando
scan
, se reduce a 11 caracteres de desempate (y 27 caracteres en total).Original: 13 personajes de desempate!
Ejemplo:
Esta vez, el resultado se logra mediante la multiplicación de matrices. La respuesta se muestra como una matriz 1x1.
fuente
scan()
en lugar dereadlines(n=2)
Haskell, 0
+
/-
,62 desempates (=
)(no utiliza el truco de concatenación de cadena / lista)
fuente
Javascript, 56
¡Gracias a @JiminP por el ~~ consejo! Voy por menos bytes, por lo que el 1 byte se guarda en el indicador p =; Todavía vale la pena. Entiendo su argumento sobre los caracteres de desempate, pero para ser honesto, ¿no preferiría la menor cantidad de bytes :-p
Versión 69
Gracias a algunos comentarios de @Ilmari y @JiminP, he reducido 13 bytes de mi solución original.
Originalmente, 82
fuente
concat
y poner cálculosalert
es más corto.i=parseInt;p=prompt;alert(Array(i(p())).concat(Array(i(p()))).length)
Por cierto, no sabía queArray(n)
devuelve una matriz con longitudn
. La consola de Google Chrome me dio[]
y pensé que no había nada ...p=prompt
no es bueno. Y,parseInt(x)
es casi equivalente a~~x
.alert(Array(~~prompt())['concat'](Array(~~prompt()))['length'])
(12 caracteres de desempate) PS. Podría usar esto como mi entrada, pero eso solo me da la sensación de robar.do
fuente
APL (sin +/-, sin disyuntores, 8 o 10 caracteres)
Esta entrada es similar a las otras que concatenan secuencias generadas a partir de la entrada y encuentran la longitud ... pero está en APL, lo que puede parecer confuso incluso para un pequeño problema como este. Utilicé Dyalog APL , que ofrece una licencia educacional libre.
Código:
De derecha a izquierda:
⎕
) solicita la entrada del usuario y la evalúa.¨
) aplica la función de generador de índice (⍳
) a cada uno de los elementos de la matriz a su derecha./
), que pliega la matriz utilizando la función de concatenación (,
). En aras de este desafío,⌿
se utiliza el operador de reducción unidimensional ( ), junto con el operador de concatenación a lo largo del primer eje (⍪
).⊃
) nos proporciona el contenido de la matriz incluida (la bolsa).⍴
) nos da las longitudes de las dimensiones de una matriz. En este caso, tenemos una matriz unidimensional, por lo que obtenemos el número de elementos en la matriz, que es nuestro resultado.Si necesitamos generar explícitamente el resultado, podemos hacerlo así:
Código de Python comparable, con los símbolos APL correspondientes arriba:
Me gustaría saber si hay una versión más corta posible en APL - otra versión más simple que se me ocurrió que tiene más de desempate (aunque todavía a 8 caracteres) es:
⍴(⍳⎕),⍳⎕
.fuente
No vi a nadie hacerlo de la manera de Ingeniería Eléctrica, así que aquí está mi opinión (en rubí):
Es un poco feo, pero hace el trabajo. Los dos valores se comparan por bit a bit
AND
. Si no tienen ningún bit en común, no hay "acarreo" en la siguiente columna binaria, por lo que la adición se puede completar haciendo un bitXOR
a bit . Si hay un acarreo, debe agregar el acarreo al bitXOR
. Aquí hay un pequeño script de ruby que usé para asegurarme de que mi lógica digital no estuviera demasiado oxidada:¡Aclamaciones!
fuente
Semilla ,
3904384611 bytes, 0 +/-, 10 disyuntoresfuente
Shell, 52
Esta es básicamente la misma respuesta que di para otro problema.
fuente
xargs -n1 jot | wc -l
que toma la misma-
reducciónawk
pero no puedo ver cómo evitarla en elxargs
do
fuente
/*=.
, 7(
, 7)
, 7,
, 1[0-9]
DO#
No es el más corto de ninguna manera:
fuente
J,
157 caracteres, 1 desempate, programa incompletoEste es mi intento de J. No es un programa completo, porque todavía no he descubierto cómo escribir uno. Simplemente ponga esa línea en un script para obtener la función
p
que se puede usar para agregar una cantidad arbitraria de números. Es una mónada y toma una lista de números para agregar (comop 1 2 3 4
):La idea es muy simple. La función está escrita en tácito, también conocido como estilo sin sentido. Aquí hay una definición puntiaguda:
Lee de derecha a izquierda. En la versión tácita,
@
compone las partes de la función. (como un ∘ en matemáticas [(f∘g) (x) = f (g (x)])y
es el parámetro dep
.~
hace un verbo reflexivo. Para algún verbom
,m~ a
es igual aa m a
.#
(copia,a#b
): Cada elemento ena
se replicai
veces, dondei
está el elemento en el mismo índice que el elemento actuala
deb
. Por lo tanto,#~
replica un elementon
n
veces.#
(cuenta,#b
): Cuenta el número de elementos enb
.Conclusión: J es impresionante y menos legible que Perl (eso lo hace aún más impresionante)
Ediciones
#
lugar dei.
. ¡Sí! Menos caracteres que golfscript.Más de un programa
Este consulta la entrada, pero aún no es un programa completo: (13 caracteres, 3 interruptores)
fuente
Javascript (17 caracteres de desempate)
: P ("Ofuscado" para reducir el número de caracteres de desempate. Internamente, es
b=prompt(a=prompt(y=function(a){c=new Uint8Array(a);for(i in c)if(i==~~i)x.push(1)},x=[]));y(a);y(b);alert(x.length);
).fuente
DO#,
El programa funciona en 1 línea; separados en múltiples líneas para evitar el desplazamiento horizontal.
fuente
Clojure (44 caracteres)
Editar: arreglado para imprimir en STDOUT en lugar de simplemente devolver la suma.
fuente
Scala
Código:
fuente
K, 11
El mismo truco de concatenación que la solución R. Lectura de derecha a izquierda: enumera las dos variables de entrada, concatena y luego cuenta.
fuente
PowerShell ,
2742 bytes, 0+-
,41 secundarioGracias a mazzy por guardar ay
+
4 secundariasPruébalo en línea! o Pretty Table para 3 bytes adicionales
O bien, agregar cuatro secundarios para guardar 19 bytes:
3223 bytes,10+-
,125 secundarios-9 bytes gracias a mazzy
Pruébalo en línea!
Para cada argumento, empujamos
n
elementos de matriz (que consisten en,[n]
pero eso no es importante) a la tubería que se agrupan por los pares y luego se cuentan.fuente
|fl
un bonito formato ¡ Pruébalo en línea!Keg (SBCS en la wiki de Keg)
Básicamente un puerto de la respuesta R.
Explicación
fuente
05AB1E , 2
4bytes, 0+
/-
Pruébalo en línea!
Disculpas si entendí mal este desafío, pero me sorprendió que no hubiera una respuesta 05AB1E. La respuesta más corta en este idioma que se me ocurre que no usa + o la función de suma incorporada.
Explicación:
-2 Bytes gracias a Grimy.
fuente
Python 3
Sin depender de sumas ocultas en otras funciones.
Pruébalo en línea!
fuente
re
esta vez usando longitudes de matriz
fuente