Usted y un amigo entran a un bar. El camarero te trata bien, así que decides darle propina. Entonces saca su confiable computadora de bolsillo y escribe un programa rápido para calcular una propina para usted, ya que no tiene una calculadora incorporada. ¡Pero espera! ¡Sus llaves de operador están rotas! Su tarea es calcular una propina del 20% para cualquier cantidad de entrada dada. Las entradas de prueba tendrán la forma de xx.xx, por ejemplo, 20.96. Estas son las reglas:
- No se utiliza lo siguiente en operadores de forma matemática:
+ - * / %
(Gracias Wally West) - Sin uso de funciones porcentuales o API incorporadas
- No acceder a la red
- No uso de
eval
o similar - Sin calculadora de Windows (sí, la gente ha respondido con ella antes)
- Sin funciones de tip incorporadas (no es que cualquier idioma tenga una)
La salida debe redondearse a dos decimales.
La puntuación se basa en la longitud en bytes.
-20% si su programa puede aceptar cualquier cantidad de propina. La entrada para la cantidad se dará en forma de xx, por ejemplo 35 no 0.35
*
?Respuestas:
Javascript 81
EDITAR : El resultado ahora es un redondeo real, no truncado.
No use NINGUNA matemática aquí, solo manipulación de cadenas y operadores bit a bit.
Todos los caracteres
+
son concatenación de cadenas o conversión de cadena a flotante .Funciona para cualquier entrada y salida xx.xx en formato (x) x.xx
Truco explicado: el 20% se divide por 10 y se multiplica por 2.
fuente
99.99
, esto regresa19.998
, por lo que no se "redondea a dos decimales" según el OP.J (9 caracteres)
Una respuesta corta en J:
fuente
^
pero aquí~
indica que el orden debe invertirse;(^.2)
es log (.2), y la inicial^.
que se ejecuta en último lugar es el logaritmo de todo el cálculo anterior: por lo tanto log (32 ^ log (.2))Pure bash,
5043 caracteresEstoy bastante seguro de que esto será mejor, pero aquí hay un comienzo:
Según los comentarios:
/
no es un operador de división aquí, es parte de una expansión del parámetro de sustitución de patrón%
no es un operador de módulo aquí, es parte de una expansión de parámetros-
no es un operador de resta aquí, es una negación, que se permitió según los comentariosSalida:
fuente
/
es parte de una expansión de parámetros bash y no un operador de división. ¿Permitido o no?Python 98 * 0.8 = 78.4
Python 74 (sin bonificación)
Nota
+
se usa para la concatenación de cadenas*
usado para crear copias de cadenaSin golf
Nota
En el espíritu de la pregunta, creo que la siguiente solución, aunque sigue todas las reglas de la pregunta, es un abuso
Python 41
Finalmente
Si insiste en que los símbolos matemáticos están prohibidos, ella es una solución de 90 caracteres
Python 90 (sin ningún símbolo matemático)
fuente
*
y+
están CLAVES rotas (para lo que sea que las use).No use of the following in mathematical form operators: + - * / % (Thanks Wally West)
. En otras palabras, la pregunta necesita ser reformulada. Y no los he usado en forma matemática0.05
.`input`
(backticks incluidos) en lugar deraw_input
.APL (9 caracteres, nuevo código con 7 caracteres, corregido con 13 caracteres)
Calcule el 20% de la cantidad dada.
En APL
*
es el operador exponencial.Pruébalo en línea .
Pero, ¿por qué usar una función para eso? Ver esta nueva versión:
Pruébalo en línea .
Por favor, antes de votar,
*
no está prohibido como CLAVE y no significa multiplicación aquí.OK, aquí está la versión redondeando a 2 decimales (Dyalog APL):
fuente
*
no está permitida en ninguna forma matemática según las reglas del desafío.*
está prohibido como una clave y no como su significado matemático.^
) para dicho operador, o se usa una llamada de función. El OP no especifica ninguna especificación que*
no se permita solo si se usa en el contexto de la multiplicación. Sospecho que sería útil si OP decidiera sobre esto, para determinar cuál de nosotros está malinterpretando las reglas del desafío y aclarar la confusión.×
y÷
están permitidos, esos no están listados.R,
30273634Actualizado a redondear a 2 decimales
Salvado 2 personajes gracias a plannapus
Crea un vector de 0 a xy toma el segundo elemento.
Ejemplo:
Explicación adicional:
crea un vector de longitud 6 desde 0 hasta el valor de entrada x, con los valores intermedios igualmente espaciados.
El primer valor es entonces 0%, el segundo 20%, tercero 40%, etc.
fuente
dc + sed + tuberías (44 caracteres)
Mi tercera respuesta (una APL, una J, y ahora una con el viejo y venerable DC).
Solicitará una entrada INTEGER y calculará el 20% de una manera complicada. La entrada se convierte a la base 5 (fácil de hacer con muchas otras herramientas pero espere ...); se agrega un punto antes del último dígito con sed (desafortunadamente, dc no puede manejar cadenas muy bien), y ENTONCES, dc convierte de nuevo desde la base 5 en un número flotante (no todas las herramientas pueden hacer eso).
fuente
dc -e 5o?p|sed 's/\(.\)\./.\1/'|dc -e 5i?p
. Con esto y eliminandosed
s-e
s, esto es 42. Pero el resultado aún no es específico (no 2 decimales)Python, 88
Esto no es para nada corto, pero esto demuestra cómo debe hacerse una división mental normal por cinco. Esto supone que la entrada debe tener la forma xx.xx
O para la entrada de cualquier longitud, se requiere una adición de 3 caracteres.
Explicación: Tomamos la entrada como una cadena, luego movemos el punto decimal un lugar hacia adelante (dividiendo por 10). Luego lo lanzamos a un flotador y usamos la
ldexp
función para multiplicarlo por 2.Tenga en cuenta que en esta respuesta,
+
son operadores de concatenación de cadenas y%
se utilizan para formatearprint
.Si insiste en no usar ninguno de estos caracteres, aquí hay una solución de 159 caracteres:
fuente
+
y estoy-
permitido ya que las CLAVES están rotas (lo que sea que signifiquen en su código)..split('.')
en mi respuesta,dc + sed - 45 * 0.8 = 36
(Inspirado por la respuesta de ברוכאל )
Ejecuciones de ejemplo (la entrada se acepta a través de STDIN):
fuente
.0+
idea es genial; He votado a favor de su solución inspirada en la mía, pero algunos pueden decir que está usando la adición; tal vez alguna solución? Lo intentédc -e 9k5o?v2^p
pero son 2 caracteres más.-20%
!Mathematica, 19
Sin el uso de los operadores matemáticos de
+
,-
,*
,/
, o%
. Utiliza propiedades de logaritmos para calcular la respuesta; cuando simplificas la expresión, obtienes.2*Input[]
Con la bonificación ( 30 * 0.8 = 24 ):
Ingrese el porcentaje primero, luego la cantidad.
Cuando simplificas la expresión, obtienes
Input[]*Input[]*.01
.Gracias a ברוכאל por ayudarme a acortar el código.
fuente
Log[E^2]
oLog[E^Input[]]
se puede escribir más brevemente. Incluso10^-1
se puede escribir.01
(aunque no uso Mathematica pero estoy bastante seguro de que sí). Toda la expresión(E^10^-1)^Log[E^2]
parece ser algo asíE^.2
, ¿no?TI-89 Basic - 39 * 0.8 = 31.2
Funciona ingresando los dos números y luego usando las propiedades del logaritmo para calcular
x * y / 100
.Si puedo asumir la entrada de la ubicación en variables globales
x
yy
, entonces, esto es mucho más corto, para un puntaje de 17 * 0.8 = 13.6 :Sin bonificación ( 12 ):
Pero si necesita ser envuelto en una función, entonces esto funciona ( 38 caracteres, para 30.4 ):
fuente
Input x,y
??? Funciona en 83/84.Input{x,y}
(¿tiene 83/84ln
?)žr¹msmžr.n
- puerto descarado de este código en 05AB1E.PHP 107 * .8 = 85.6
Realmente no puedo correr para code-golf con PHP, pero al menos puedo operar en cadenas. acepta ambos números como argumentos de línea de comandos.
tuve que revertirlo dos veces ya que no puedo usar -2 :(
fuente
Python,
81 8089 caracteresExplicación
Técnicamente, esto es trampa, ya que se trunca a dos decimales en lugar de redondearlo, pero puedo argumentar que se redondea (mejor para ti, menos propina).
fuente
[-3:]
lugar de[-3:-1]
JavaScript 251 (restricción forzada: no +, -, *,? O% de ninguna manera)
Si bien sé que esto no ganará, pensé que trataría de obtener puntos de brownie adoptando un enfoque muy estricto y ni siquiera pensar en usar los operadores restringidos en cualquier forma ... como resultado, se me ocurrió esta belleza...
Usé operaciones bit a bit para crear la función Agregar
A
, y luego comencé a encadenar desde allí:La función de división de enteros
D
utilizaba una serie de suma negada (sustracción en forma deA(x,A(~y,1)
un bucle; el resto es manipulación de cadenas y concatenación para evitar el uso de+
operadores de concatenación ...El número debe proporcionarse en forma decimal con dos lugares decimales para que esto funcione ...
fuente
Perl
5060 bytesLa entrada se espera en STDIN. Debe contener el separador decimal con dos dígitos decimales. La salida se escribe en STDOUT.
Actualización: el paso
$_<<=1
elimina los ceros a la izquierda. Por lo tantom|\d{3}$|
lo , no coincidiría con las facturas <1. Por lo tanto,$_="00$
se agregaron diez bytes , ahora incluso0.00
funciona.Ejemplos:
20.96
salida:4.19
12.34
salida:2.47
Versión sin golf:
Primero se lee el número de STDIN. Luego se elimina el punto decimal, que se multiplica por 100. Luego, la cantidad se duplica por un operador de desplazamiento. Luego se reinserta el punto decimal y el resultado se imprime y se redondea a dos dígitos decimales.
50 bytes, si factura ≥ 1:
Si
x.xx
es mayor o igual que1.00
, entonces se pueden eliminar 10 bytes:fuente
JavaScript (ES6) (Regex) 142
Regex es genial y puede hacer muchas cosas. ¡Incluso puede hacer matemáticas!
Versión legible:
los
tip()
función espera el argumento String, en lugar de Number.Todas las instancias de
*
,/
,+
no están relacionados con las operaciones matemáticas.+
es la concatenación de cadenas en todos los casos en que se usa.*
es parte de la sintaxis RegExp/
es el delimitador del literal de RegExpLa entrada debe usarse
.
como punto decimal, y debe haber 2 dígitos después del punto decimal.Fragmento de pila
fuente
Haskell 32 caracteres -20% = 25.6 caracteres
Abusa del hecho de que los exponentes se convierten en multiplicación en logaritmos.
fuente