Esse relacionamento é assustador?


73

De acordo com esta história em quadrinhos do XKCD , existe uma fórmula para determinar se a diferença de idade em um relacionamento é "assustadora". Esta fórmula é definida como:

(Age/2) + 7

sendo a idade mínima das pessoas com quem você pode namorar.

Portanto, um relacionamento é assustador se uma das pessoas desse relacionamento for menor do que a idade mínima da outra.

Dada a idade de duas pessoas, você pode mostrar se esse relacionamento é assustador ou não?

Regras

  1. Seu programa deve receber dois números inteiros como entrada, a idade de ambas as pessoas no relacionamento. Estes podem ser obtidos em qualquer formato razoável.

  2. Seu programa deve gerar um valor verdadeiro ou falso, descrevendo se o relacionamento é ou não "assustador" (Verdade = assustador).

  3. As brechas padrão não são permitidas.
  4. Esse quebra-cabeça é o Code Golf, então a resposta com o menor código-fonte em bytes ganha

Casos de teste

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
Como deve age/2ser arredondado? Provavelmente, se a metade exata deve ser o mínimo? 17,21seria um bom caso de teste.
— Martin Ender

4
@MartinEnder O valor é mínimo, portanto não arredonde. Não precisa ser um número inteiro.
— Leo

81
Você também pode adicionar 13, 13 - Creepy.
— Greg Martin

12
47, 10000 é uma ... combinação interessante. Gostaria também de salientar que, de acordo com esta fórmula, é assustador para Doctor Who namorar qualquer humano.
— David Conrad

8
@ DavidConrad - bem, sim. é basicamente beastiality de sua parte ....
— Batman

Respostas:



17

Python 3 , 26 bytes

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

Experimente online!
A entrada é uma lista com ambas as idades


Tinha o mesmo antes de ler as respostas existentes. +1
— ElPedro 24/05

Parece que você pode realmente assumir uma tupla onde ela sempre (mais jovem, mais velha) - apenas perguntou à OP - se pergunta o que ele dirá.
— Rm-vanda

@ rm-vanda perguntei anteriormente, você não pode assumir
— Stephen

15

05AB1E , 8 6 bytes

;7+R‹Z

Experimente online! ou Experimente todos os testes

         # 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 em C, eu concordo que 2 é verdade.
— Gmatht 26/05

@gmatht Isso sempre deve retornar 0 ou 1, nunca 2. #
— Riley

4
[13,13] é duplamente assustador.
— gmatht 27/05

11
@ Gmatht Eu acho que seria o dobro. Não pensei em números tão pequenos. Ainda é verdade.
— Riley

@Riley 2não é verdade, veja isso .
— Okx

13

Portões NAND, 551

Calculadora de creepiness de 16 bits Criado com o Logisim

Mesmo princípio que minha outra resposta , mas aceita entradas assinadas de 2 bytes, para que possa lidar 47, 10000. Funciona para TODOS os casos de teste!

Isso não é ideal para os casos de teste fornecidos, pois 10000 pode ser expresso com apenas 15 dos 16 bits, mas funciona para todas as idades no intervalo [-32768, 32768). Observe que qualquer idade negativa retornará 1.

Entradas à esquerda (sem ordem específica, 1 bit na parte superior). Saída no canto inferior direito.


10

Portas NAND, 274 262

Original:

Melhor: Criado com o Logisim

Isso leva duas entradas à esquerda como números inteiros assinados de 1 byte, com o 1 bit na parte superior. A saída está no canto inferior esquerdo; a verdade e a falsidade aqui devem ser óbvias.

Funciona para todos os casos de teste, exceto 47, 10000, então acho que tecnicamente não é uma resposta válida. No entanto, a pessoa mais velha no registro (confiável) era 122, portanto, 8 bits (máximo 127) funcionarão para qualquer cenário possível até este ponto. Vou postar uma nova resposta (ou devo editar esta?) Quando terminar a versão de 16 bits.

Versão de 16 bits está pronta!

Você notará algumas seções verticais do circuito. O primeiro (da esquerda) determina qual entrada é maior. Os próximos dois são multiplexadores, classificando as entradas. Em seguida, adicionar 11111001(-7) para o menor na quarta secção, e concluo comparando duas vezes aqui a entrada maior. Se for menor, o relacionamento é assustador. Como mudo os bits para o dobro, devo levar em consideração o pouco não utilizado de lesser-7. Se este é um 1, então lesser-7é negativo, e o mais novo dos dois não tem mais que seis. Arrepiante. Termino com um portão OR, portanto, se um dos testes de fluidez retornar 1, todo o circuito retornará .

Se você olhar de perto, verá que usei sete uma constante s (codificando permanentemente o 11111011e o final 0). Eu fiz isso porque o Logisim requer pelo menos um valor para um portão lógico produzir uma saída. No entanto, cada vez que uma constante é usada, duas portas NAND garantem um 1valor independentemente da constante.

-12 portões graças a mim !


Percebeu uma otimização óbvia. Se você apontar antes que eu edite, eu ainda credito você!
— Khuldraeseth na'Barya

9

C #, 22 bytes

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

11
Eu não sou muito programador de C #, mas o ponto e vírgula final é necessário como parte da função?
— Olivier Grégoire

11
@ OlivierGrégoire É apenas sintaxe inválida se for omitida; esta é uma função anônima
— cat

8

C, 29 bytes

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

Como funciona:

  • #define f(a,b)define uma função macro fque recebe dois argumentos não digitados.
  • a/2+7>b verifica se a primeira idade dividida por dois mais sete é maior que a segunda idade.
  • b/2+7>a verifica se a segunda idade dividida por dois mais sete é maior que a primeira idade.
  • Se um dos valores acima for verdadeiro, retorne 1 (assustador). Caso contrário, retorne 0 (não é assustador).

Experimente online!


você deve virar a comparação, ele deve ser como >bnão<b
— Khaled.K

A citação "sendo a idade mínima" significa que você deve verificar se age >= min, também, você precisa de AND em vez de OR, uma vez que ambos os lados precisam satisfazer para que não seja assustador, caso de teste "47, 10000 - Assustador"
— Khaled.K

okay Eu fixo o erro, mas a lógica é errado, retornar true, tio.run
— Khaled.K

11
@Tas nope.
— MD XF

11
Saúde, obrigado pelo link.
— Tas

7

JavaScript (ES6), 21 bytes

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

Retorna 0 para não assustador, 1 para assustador.

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));


Salve um byte com curry: em a=>b=>vez de (a,b)=>, ligue com f(40)(40).
— Stephen

@ Stephenos, obrigado, aprendi algo novo!
— Rick Hitchcock

Não tem problema, eu aprendi quando alguém me disse a mesma coisa :), porém, só funciona com dois parâmetros, depois disso não vale a pena.
— 24517 Stephen


5

Retina , 20 bytes

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

Experimente online!

A entrada é unária com um avanço de linha entre os dois números. A saída é 0(não assustadora) ou 1(assustadora).

Explicação

O`.+

Classifique os dois números, para que saibamos que o maior é o segundo.

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

Chame a idade menor ae a maior b. Primeiro capturamos a-7em grupo 1. Em seguida, tentar igualar 2*(a-7)+1em b, o que significa b >= 2*(a-7)+1ou b >= 2*(a-7)ou b/2+7 > ao que é o critério para uma relação assustador.


5

TI-Basic, 20 10 9 bytes

max(2Ans<14+max(Ans

-10 bytes usando uma lista e parte da sugestão da Timtech

-1 byte usando a sugestão de lirtosiast

Apresenta uma lista de duas idades, "{40,42}: prgmNAME"

Retorna 1 para 'assustador' e 0 para 'não assustador'.


O TI-BASIC fecha automaticamente os parênteses em um símbolo de teste ( < <= = != >= >)?
— Zacharý

@ Zacharý Não, o TI-Basic só fecha parênteses no final de uma linha ou dois pontos.
— Pizzapants184

Opa, esqueci que a entrada estava sendo tomada como uma lista de números!
— Zacharý

4

GNU APL 1.2, 23 bytes

Define uma função que recebe dois argumentos e imprime 1 se assustador, 0 se não.

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

Explicação

∇inicia e termina a função
A f Bé o cabeçalho da função; A função é nomeada fe recebe dois argumentos Ae B(as funções na APL podem ser monádicas - com um argumento - ou diádicas - com dois argumentos) -
A⌊Bsão min(A,B)e A⌈Bsão max(A,B)
APL avaliadas da direita para a esquerda; portanto, são necessários parênteses para garantir a precedência adequada

Os outros operadores são auto-explicativos.

Código pode ser capaz de golfe, eu ainda sou novo em código de golfe.


11
Bem vindo ao site!
— OldBunny2800

Uau, legal, GNU APL, não vejo isso há algum tempo.
— Zacharý

Além disso, é possível levar os argumentos como uma lista: f Xentão (⌊/X)<7+.5×⌈/X. IIRC, você pode remover a nova linha entre a segunda e a terceira linhas.
— Zacharý

@ Zacharý Sim, são possíveis lambdas anônimas. Eles não são suportados por esta versão do GNU APL e a mais recente não compila no Mac. Algumas das minhas outras respostas usam o APL 1.7 porque eu as testo no Ubuntu. Eu não usei lambdas (pode corrigi-los mais tarde) porque ainda sou muito novo no APL.
— precisa saber é o seguinte

Experimente o ngn-apl. É de código aberto como o GNU APL, mas com toda a honestidade é melhor.
— Zacharý

4

Python 3, 74 45 bytes

Primeiro código Golf, provavelmente terrível.

Redução de 29 bytes por @ Phoenix

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

Olá, formate seu código corretamente usando o sistema de descontos.
— Leo

não se preocupe, alguém chegou antes de mim, mal correção-lo embora
— KuanHulio

Você pode se livrar de alguns dos espaços por lá :)
— Beta Decay

Além disso, lambda a,b:0 if(a/2)+7>b or(b/2)+7>a else 1deve funcionar e é muito mais curto.
— Pavel

11
lambda a,b:a/2+7>b or b/2+7>a. Abandonar o fardo daqueles traquinas 1s e 0s e abraçar o poder de True/ False!
— Value Ink

3

JavaScript (ES6), 27 bytes

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

Sem currying (chame como em f(a,b)vez de f(a)(b))

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

Se b > a, troque os parâmetros e tente novamente. Caso contrário, verifique. A currying não salva bytes por causa da chamada 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 não original.

Testando

Experimente online!

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");
    }
  }
}

11
+1 por mencionar " Absolutamente não original ". Quase ninguém mais faz, enquanto eles são quase todos iguais. E tomei a liberdade de adicionar um link TIO a partir do seu código de teste. Não sei por que você sempre adicionar um código de teste, mas não um TIO-link .. :)?
— Kevin Cruijssen

11
Obrigado Kevin! Às vezes adiciono um, às vezes não. Depende se meu IDE está aberto ou fechado. É simples assim! : P Além disso, mostro o código de teste para que as pessoas entendam o que torna esse lambda válido. :)
— Olivier Grégoire

3

Python 3, 31 bytes

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

Não é muito mais curto do que os outros envios de python, mas eu encontrei uma maneira um pouco diferente de verificar se há algo estranho. Notei que a diferença aceitável entre as idades é igual a min - 14. Isso decorre da reorganização algébrica da 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

Isso permite que eu resolva sem precisar de duas constantes e também sem precisar usar max e min, em vez de usar abs (ab). Do ponto de vista do golfe, obtive apenas um byte a menos que a solução do @ nocturama, mas usei uma fórmula ligeiramente diferente para isso.


Certamente esta falha em [37,53] (não na suíte de teste, mas) dentro da (x / 2) +7 espírito deste fairway
— Alexx Roche

@AlexxRoche Não, quando dado [37,53] como [a, b], o cálculo deve se tornar abs(37 - 53) > min(37, 53) - 14 = abs(-16) > 37 - 14 = 16 > 23 = False Esta é a resposta correta, porque de acordo com (x / 2) + 7, a idade mínima para 53 é53/2 + 7 = 26.5 + 7 = 33.5
— Delya Erricson

3

Excel, 26 24 Bytes

Fórmula de célula que recebe a entrada como números do intervalo de células A1:B1e gera um valor booleano que representa a aspereza para a célula da fórmula

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

Versão antiga, 26 bytes

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

2

TI-Basic, 10 9 10 bytes

2min(Ans)-14≤max(Ans

Listar as entradas de Ans, saídas, 1se "assustador" ou 0não.


2

Matemática , 16 bytes

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

Experimente online!

-2 bytes graças a @GregMartin

Verdadeiro para não assustador, falso para assustador.

            (* 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               *)

Salve 2bytes tomando as idades como uma 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]}

Experimente online!

Essa é uma função anônima que recebe a entrada como dois literais (não uma matriz) do fluxo de entrada.

Explicação

{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

Não foi possível comentar, mas recebi uma resposta um pouco mais curta do que a outra solução Python 3:

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

-5 graças a @Cyoce!


você pode remover o espaço emlambda *a
— Cyoce

1

Fourier, 37 bytes

oI~AI~B>A{1}{A~SA~BS~B}A/2+7>B{1}{@o}

Experimente no FourIDE!

Toma dois números como entrada. Golf mais tarde.


Ele não precisa de mostrar uma string como essa, pode ser truthy ou Falsas
— Leo

Bom golfe. Aquilo foi rápido.
— MD XF


1

Japonês , 11 bytes

Retorna truepara "assustador" e falsepara não.

wV /2+7>UmV

Experimente online


Explicação

      :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%~>.

Saídas 1para não assustador, 0para assustador

Explicação

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

1

J-uby , 25 bytes

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

Ligue como f^[80,32]. Dá truepara não assustador, falsepara assustador.

Explicação

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

Esta é uma linguagem bonita. Passei muito tempo tentando atingir objetivos semelhantes com Ruby (eu chamei de "Blurb"), mas me apoiar fortemente method_missinglevou a muita complexidade. Essa abordagem é limpa e elegante. Parabéns!
— Jordan

@Jordan thanks! Não aguento todo o crédito, pois isso foi fortemente inspirado por J (daí o nome). Estou aberto a sugestões de um colega programador Ruby, se você tiver algum.
— Cyoce 25/05

@ Jordan, você deve ver algumas das outras respostas mais complexas do J-uby. Eles são bastante coisa.
— Cyoce 25/05

1

AWK , 26 bytes

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

Experimente online!

Saídas 1 para "Assustador" e 0 para "Não Assustador". Pode salvar 3 bytes se nenhuma saída puder ser considerada um valor falso, via:

$0=$1/2+7>$2||$2/2+7>$1
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.