¿Es esta relación espeluznante?


73

Según este cómic de XKCD , hay una fórmula para determinar si la brecha de edad en una relación es "espeluznante". Esta fórmula se define como:

(Age/2) + 7

siendo la edad mínima de las personas con las que puedes salir.

Por lo tanto, una relación es espeluznante si alguna de las personas en dicha relación es más joven que la edad mínima de la otra.

Dada la edad de dos personas, ¿puede indicar si esa relación es espeluznante o no?

Reglas

  1. Su programa debe tomar dos enteros como entrada, la edad de ambas personas en la relación. Estos se pueden tomar en cualquier formato razonable.

  2. Su programa debe generar un valor verdadero o falso que describa si la relación es "espeluznante" (Verdad = Espeluznante).

  3. Las lagunas estándar no están permitidas.
  4. Este rompecabezas es Code Golf, por lo que gana la respuesta con el código fuente más corto en bytes

Casos de prueba

40, 40    - Not Creepy
18, 21    - Not Creepy
80, 32    - Creepy
15, 50    - Creepy
47, 10000 - Creepy
37, 38    - Not Creepy
22, 18    - Not Creepy

3
¿Cómo se debe age/2redondear? ¿Probablemente si la mitad exacta es la mínima? 17,21Sería un buen caso de prueba.
Martin Ender

44
@MartinEnder El valor es un mínimo, así que no redondee en absoluto. No tiene que ser un número entero.
Leo

81
También puedes agregar 13, 13 - Creepy.
Greg Martin

12
47, 10000 es una ... combinación interesante. También me gustaría señalar que de acuerdo con esta fórmula, es espeluznante para Doctor Who salir con cualquier humano.
David Conrad

8
@DavidConrad - bueno sí. su básicamente bestialidad de su parte ....
Batman

Respuestas:



17

Python 3 , 26 bytes

lambda x:max(x)/2+7>min(x)

Pruébalo en línea!
La entrada es una lista con ambas edades.


Tenía lo mismo antes de leer las respuestas existentes. +1
ElPedro

Parece que realmente podrías asumir una tupla donde siempre es (más joven, más viejo), solo le pregunté a OP, me pregunto qué dirá.
rm-vanda

@ rm-vanda pregunté antes, no puedes asumirlo
Stephen

15

05AB1E , 8 6 bytes

;7+R‹Z

Pruébalo en línea! o Prueba todas las pruebas

         # Implicit Input: an array of the ages
;        # Divide both ages by 2
 7+      # Add 7 to both ages
   R     # Reverse the order of the ages
         #    this makes the "minimum age" line up with the partner's actual age
    ‹    # Check for less than the input (vectorized)
     Z   # Push largest value in the list

3
Como programador en C, estoy de acuerdo en que 2 es verdadero.
gmatht

@gmatht Esto siempre debe devolver 0 o 1, nunca 2.
Riley

44
[13,13] es doblemente espeluznante.
gmatht

1
@gmatht Supongo que eso sería el doble. No pensé en números tan pequeños. Sin embargo, todavía es verdad.
Riley

@Riley 2no es sincero, mira esto .
Okx

13

Puertas NAND, 551

Calculadora de creepiness de 16 bits Creado con Logisim

El mismo principio que mi otra respuesta , pero toma entradas firmadas de 2 bytes, por lo que puede manejar 47, 10000. ¡Funciona para TODOS los casos de prueba!

Esto no es óptimo para los casos de prueba dados, ya que 10000 se puede expresar con solo 15 de los 16 bits, pero funciona para cualquier edad en el rango [-32768, 32768). Tenga en cuenta que cualquier edad negativa volverá 1.

Entradas a la izquierda (sin orden particular, 1 bit en la parte superior). Salida en la parte inferior derecha.


10

Puertas NAND, 274 262

Original:

Mejor: creado con Logisim

Esto toma dos entradas a la izquierda como enteros con signo de 1 byte, con 1 bit en la parte superior. La salida está en la esquina inferior izquierda; Lo verdadero y lo falso aquí debería ser obvio.

Funciona para todos los casos de prueba, excepto 47, 10000, así que supongo que técnicamente no es una respuesta válida. Sin embargo, la persona más vieja en el registro (confiable) era 122, por lo que 8 bits (máximo 127) funcionarán para cualquier escenario posible hasta este punto. Publicaré una nueva respuesta (¿o debería editar esta?) Cuando termine la versión de 16 bits.

¡La versión de 16 bits está lista!

Notarás algunas secciones verticales del circuito. El primero (desde la izquierda) determina qué entrada es mayor. Los siguientes dos son multiplexores, clasificando las entradas. Luego agrego 11111001(-7) al menor en la cuarta sección, y concluyo comparando dos veces esto con el mayor aporte. Si es menos, la relación es espeluznante. Como cambio los bits al doble, debo tener en cuenta el bit no utilizado lesser-7. Si esto es a 1, entonces lesser-7es negativo, y el menor de los dos no tiene más de seis años. Siniestro. Termino con una compuerta OR, por lo que si cualquiera de las pruebas de espesura regresa 1, todo el circuito lo hace.

Si se mira de cerca, verá que he utilizado siete Una constante s (codificando el 11111011importantes y el descenso 0). Hice esto porque Logisim requiere al menos un valor para una puerta lógica para producir una salida. Sin embargo, cada vez que se usa una constante, dos compuertas NAND aseguran un 1valor independientemente de la constante.

-12 puertas gracias a !


Noté una optimización obvia. Si lo señalas antes de editarlo, ¡todavía te daré crédito!
Khuldraeseth na'Barya

9

C #, 22 bytes

n=>m=>n<m/2+7|m<n/2+7;

1
No soy un gran programador de C #, pero ¿se requiere el punto y coma final como parte de la función?
Olivier Grégoire

1
@ OlivierGrégoire Es una sintaxis inválida si se omite; esta es una función anónima
gato

8

C, 29 bytes

#define f(a,b)a/2+7>b|b/2+7>a

Cómo funciona:

  • #define f(a,b)define una función macro fque toma dos argumentos sin tipo.
  • a/2+7>b comprueba si la primera edad dividida entre dos más siete es mayor que la segunda edad.
  • b/2+7>a comprueba si la segunda edad dividida entre dos más siete es mayor que la primera edad.
  • Si alguno de los valores anteriores es verdadero, devuelve 1 (espeluznante). De lo contrario, devuelve 0 (no espeluznante).

Pruébalo en línea!


deberías voltear la comparación, debería ser como >bno<b
Khaled.K

Citar "ser la edad mínima" significa que debe verificar si age >= min, también necesita Y en lugar de OR, ya que ambas partes deben cumplir para que no sea espeluznante, el caso de prueba "47, 10000 - Creepy"
Khaled.K

Está bien, arreglé el error, pero la lógica es incorrecta, devuelve verdadero, tio.run
Khaled.K

1
@Tas no .
MD XF

1
Saludos, gracias por el enlace
Tas

7

JavaScript (ES6), 21 bytes

a=>b=>a<b/2+7|b<a/2+7

Devuelve 0 para no espeluznante, 1 para espeluznante.

f=a=>b=>a<b/2+7|b<a/2+7

console.log(f(40)(40));
console.log(f(18)(21));
console.log(f(80)(32));
console.log(f(15)(50));
console.log(f(47)(10000));
console.log(f(37)(38));
console.log(f(22)(18));


Guarde un byte con curry: en a=>b=>lugar de (a,b)=>, llame con f(40)(40).
Stephen

@StephenS, gracias, ¡aprendí algo nuevo!
Rick Hitchcock

No hay problema, lo aprendí cuando alguien me dijo lo mismo :) solo funciona con dos parámetros, después de eso no vale la pena.
Stephen


5

Retina , 20 bytes

O`.+
^1{7}(1+)¶1\1\1

Pruébalo en línea!

La entrada está en unario con un salto de línea entre los dos números. La salida es 0(no espeluznante) o 1(espeluznante).

Explicación

O`.+

Ordene los dos números, para que sepamos que el más grande es el segundo.

^1{7}(1+)¶1\1\1

Llame la edad más pequeña ay la edad más grande b. Primero capturamos a-7en grupo 1. Entonces tratamos de coincidir 2*(a-7)+1en b, lo que significa b >= 2*(a-7)+1o b >= 2*(a-7), o b/2+7 > aque es el criterio para una relación espeluznante.


5

TI-Basic, 20 10 9 bytes

max(2Ans<14+max(Ans

-10 bytes usando una lista y parte de la sugerencia de Timtech

-1 byte usando la sugerencia de lirtosiast

Toma una lista de dos edades, "{40,42}: prgmNAME"

Devuelve 1 para 'espeluznante' y 0 para 'no espeluznante'.


¿TI-BASIC cierra automáticamente los paréntesis en un símbolo de prueba ( < <= = != >= >)?
Zacharý

@ Zacharý No, TI-Basic solo cierra los paréntesis al final de una línea o dos puntos.
pizzapants184

¡Vaya, olvidé que la entrada se estaba tomando como una lista de números!
Zacharý

4

GNU APL 1.2, 23 bytes

Define una función que toma dos argumentos e imprime 1 si es espeluznante, 0 si no.

∇A f B
(A⌊B)<7+.5×A⌈B
∇

Explicación

comienza y termina la función
A f Bes el encabezado de la función; La función se nombra fy toma dos argumentos, Ay B(las funciones en APL pueden ser monádicas - tomar un argumento - o diádicas - tomar dos argumentos)
A⌊Bes min(A,B)y A⌈Bes max(A,B)
APL se evalúa de derecha a izquierda, por lo que se necesitan paréntesis para garantizar una precedencia adecuada

Los otros operadores se explican por sí mismos.

El código podría ser apto para el golf, todavía soy nuevo en el código del golf.


1
Bienvenido al sitio!
OldBunny2800

Wow, bien, GNU APL, no he visto eso en mucho tiempo.
Zacharý

Además, es posible tomar los argumentos como una lista: f Xentonces (⌊/X)<7+.5×⌈/X. IIRC puede eliminar la nueva línea entre la segunda y la tercera línea.
Zacharý

@ Zacharý Sí, las lambdas anónimas son posibles. No son compatibles con esta versión de GNU APL y la más nueva no se compila en Mac. Algunas de mis otras respuestas usan APL 1.7 porque las pruebo en Ubuntu. No he usado lambdas (podría arreglarlas más tarde) porque todavía soy bastante nuevo en APL.
Arc676

Prueba ngn-apl. Es de código abierto como GNU APL, pero con toda honestidad es mejor.
Zacharý

4

Python 3, 74 45 bytes

Primer código de golf, probablemente terrible.

Reducción de 29 bytes por @ Phoenix

lambda a,b:0 if(a/2)+7>b or(b/2)+7>a else 1

Hola, asegúrese de formatear correctamente su código utilizando el sistema de descuento.
Leo

no se preocupe, alguien se me adelantó, mal arreglo él, aunque
KuanHulio

Puede deshacerse de algunos de los espacios allí :)
Beta Decay

Además, lambda a,b:0 if(a/2)+7>b or(b/2)+7>a else 1debería funcionar y es mucho más corto.
Pavel

1
lambda a,b:a/2+7>b or b/2+7>a. Abandonar la carga de esos molestos 1s y 0s y abrazar el poder de True/ False!
Value Ink

3

JavaScript (ES6), 27 bytes

f=a=>b=>b>a?f(b)(a):b>a/2+7

Sin curry (llame como en f(a,b)lugar de f(a)(b))

f=(a,b)=>b>a?f(b,a):b>a/2+7

Si b > a, intercambie parámetros y vuelva a intentarlo. De lo contrario, verifique. El curry no guarda ningún byte debido a la llamada recursiva.

f=a=>b=>b>a?f(b)(a):b>a/2+7

console.log(f(18)(22))
console.log(f(22)(18))
console.log(f(18)(21))


3

Java, 21 bytes

a->b->a/2+7>b|b/2+7>a

Absolutamente no original.

Pruebas

Pruébalo en línea!

import java.util.function.*;

public class Pcg122520 {
  static IntFunction<IntPredicate> f = a->b->a/2+7>b|b/2+7>a;
  public static void main(String[] args) {
    int[][] tests = {
      {40, 40},
      {18, 21},
      {80, 32},
      {15, 50},
      {47, 10000},
      {37, 38},
      {22, 18}
    };
    for (int[] test: tests) {
      System.out.printf("%d, %d - %s%n", test[0], test[1], f.apply(test[0]).test(test[1]) ? "Creepy" : "Not creepy");
    }
  }
}

1
+1 por mencionar " Absolutamente no original ". Casi nadie más lo hace, mientras que son casi todos iguales. Y me tomé la libertad de agregar un enlace TIO desde su código de prueba. ¿No está seguro de por qué siempre agrega un código de prueba, pero no un enlace TIO ? .. :)
Kevin Cruijssen

1
Gracias Kevin! A veces agrego uno, a veces no. Depende de si tengo mi IDE abierto o cerrado. ¡Es tan simple como eso! : P Además, muestro el código de prueba para que la gente entienda qué hace que esta lambda sea válida. :)
Olivier Grégoire

3

Python 3, 31 bytes

lambda a,b:abs(a-b)>min(a,b)-14

No mucho más corto que las otras presentaciones de Python, pero encontré una forma ligeramente diferente de verificar si hay escalofríos. Noté que la diferencia aceptable entre edades es igual a min - 14. Esto se deduce de reorganizar algebraicamente la fórmula.

min = (max/2) + 7
min - 7 = max/2
2*min - 14 = max

dif = max - min
max = dif + min

2*min - 14 = dif + min
min - 14 = dif

Esto me permitió resolver sin necesidad de dos constantes, y también sin necesidad de usar tanto max como min, en lugar de usar abs (ab). Desde la perspectiva del golf, solo obtuve un byte menos que la solución de @nocturama, pero usé una fórmula ligeramente diferente para hacerlo.


Seguramente esto falla en [37,53] (no en el conjunto de pruebas pero) dentro del espíritu (x / 2) +7 de esta calle
Alexx Roche

@AlexxRoche No, cuando se da [37,53] como [a, b], el cálculo debe ser abs(37 - 53) > min(37, 53) - 14 = abs(-16) > 37 - 14 = 16 > 23 = False Esta es la respuesta correcta, porque de acuerdo con (x / 2) + 7, la edad mínima para 53 es53/2 + 7 = 26.5 + 7 = 33.5
Delya Erricson

3

Excel, 26 24 bytes

Fórmula de celda que toma la entrada como números del rango de celda A1:B1y genera un valor booleano que representa la espesura a la celda de fórmula

=OR(A1/2+7>B1,B1/2+7>A1)

Versión antigua, 26 bytes

=MAX(A1:B1)/2+7>MIN(A1:B1)

2

TI-Basic, 10 9 10 bytes

2min(Ans)-14≤max(Ans

Lista de entrada de Ans, salidas 1si es "espeluznante" o de 0otra manera.


2

Matemáticas , 16 bytes

Max@#/2+7<Min@#&

Pruébalo en línea!

-2 bytes gracias a @GregMartin

Verdadero para no espeluznante, falso para espeluznante.

            (* Argument: A list of integers     *)
Max@#       (* The maximum of the input         *)
 /2+7       (* Divided by 2, plus 7             *)
  <         (* Is less than?                    *)
   Min@#    (* The minimum of the input         *)
    &       (* Anonymous function               *)

Guardar 2bytes mediante la adopción de las edades como una lista:Max@#/2+7<Min@#&
ngenisis

2

SAS, 77 bytes

%macro t(a,b);%put%eval(%sysfunc(max(&a,&b))/2+7>%sysfunc(min(&a,&b)));%mend;

2

Röda , 16 bytes

{sort|[_<_/2+7]}

Pruébalo en línea!

Esta es una función anónima que toma la entrada como dos literales (no una matriz) de la secuencia de entrada.

Explicación

{sort|[_<_/2+7]}                 Anonymous function
 sort                            Sorts the numbers in the input stream
     |[       ]                  And push
       _<                        whether the smaller value  is less than
         _/2+7                   the greater value / 2 + 7



2

Python 3 - 32 27 bytes

No puedo comentar, pero obtuve una respuesta un poco más corta que la otra solución de Python 3:

lambda *a:min(a)<max(a)/2+7

-5 gracias a @Cyoce!


puedes quitar el espacio enlambda *a
Cyoce



1

Japt , 11 bytes

Devuelve truepara "espeluznante" y falsepara no.

wV /2+7>UmV

Pruébalo en línea


Explicación

      :Implicit input of first integer U
wV    :Get the maximum of U and the second integer V
/2+7  :Divide by 2 & add 7
>     :Check if the result is greater than...
UmV   :the minimum of the two integers.

1

J, 10 bytes

<.<7+2%~>.

Salidas 1para no espeluznante, 0para espeluznante

Explicación

<.          NB. the minimum
  >         NB. is greater than
    7+2%~>. NB. half the maximum + 7

1

J-uby , 25 bytes

:>%[:min,:max|~:/&2|:+&7]

Llama como f^[80,32]. Da truepor no espeluznante, falsepor espeluznante.

Explicación

    :min                  # the minimum
:>%[    ,               ] # is greater than
         :max|            # the maximum...
              ~:/&2|        # over two...
                    :+&7    # plus 7 

Este es un lenguaje hermoso. Pasé mucho tiempo tratando de lograr fines similares con Ruby (lo llamé "Blurb"), pero apoyarme demasiado me method_missingllevó a demasiada complejidad. Este enfoque es limpio y elegante. Felicidades!
Jordan

@ Jordan gracias! No puedo tomar todo el crédito, ya que esto fue fuertemente inspirado por J (de ahí el nombre). Estoy abierto a sugerencias de un compañero programador de Ruby si tiene alguna.
Cyoce

@ Jordan deberías ver algunas de las otras respuestas más complejas de J-uby. Son bastante algo.
Cyoce

1

AWK , 26 bytes

{$0=$1/2+7>$2||$2/2+7>$1}1

Pruébalo en línea!

Salidas 1 para "Creepy" y 0 para "Not Creepy". Podría ahorrar 3 bytes si no se puede considerar una salida como un valor falso, a través de:

$0=$1/2+7>$2||$2/2+7>$1
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.