Czy ten związek jest przerażający?


73

Według tego komiksu XKCD istnieje formuła określająca, czy różnica wieku w związku jest „przerażająca”. Ta formuła jest zdefiniowana jako:

(Age/2) + 7

jest to minimalny wiek osób, z którymi możesz się umawiać.

Dlatego związek jest przerażający, jeśli jedna z osób we wspomnianym związku jest młodsza niż minimalny wiek drugiej osoby.

Biorąc pod uwagę wiek dwóch osób, czy potrafisz określić, czy ten związek jest przerażający?

Zasady

  1. Twój program powinien przyjąć dwie liczby całkowite, wiek obu osób w związku. Można je pobrać w dowolnym rozsądnym formacie.

  2. Twój program musi następnie wypisać wartość prawdy lub fałszu opisującą, czy relacja jest „przerażająca” (Truthy = przerażająca).

  3. Standardowe luki są niedozwolone.
  4. Ta łamigłówka to Code Golf, więc wygrywa odpowiedź z najkrótszym kodem źródłowym w bajtach

Przypadki testowe

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
Jak age/2zaokrąglić? Prawdopodobnie w górę, jeśli dokładna połowa ma być minimum? 17,21zrobiłby dobry przypadek testowy.
Martin Ender

4
@MartinEnder Wartość jest minimalna, więc nie zaokrąglaj w ogóle. To nie musi być liczba całkowita.
Leo

81
Możesz także dodać 13, 13 - Creepy.
Greg Martin

12
47, 10000 to ... ciekawe połączenie. Chciałbym również zauważyć, że zgodnie z tą formułą Doktor Who spotyka się z każdym człowiekiem.
David Conrad

8
@DavidConrad - no tak. jego w zasadzie bestialstwo z jego strony ...
Batman

Odpowiedzi:



17

Python 3 , 26 bajtów

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

Wypróbuj online!
Dane wejściowe to lista dla obu grup wiekowych


Miałem to samo, zanim przeczytałem istniejące odpowiedzi. +1
ElPedro

Wygląda na to, że faktycznie możesz założyć krotkę zawsze (młodszą, starszą) - po prostu zapytałem OP - zastanawiam się, co powie.
rm-vanda

@ rm-vanda Zapytałem wcześniej, nie możesz założyć
Stephen

15

05AB1E , 8 6 bajtów

;7+R‹Z

Wypróbuj online! lub Wypróbuj cały test

         # 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
Jako programista C zgadzam się, że 2 jest zgodne z prawdą.
gmatht

@gmatht Powinno to zawsze zwracać 0 lub 1, nigdy 2.
Riley

4
[13,13] jest podwójnie przerażający.
gmatht

1
@gmatht Myślę, że byłoby podwójnie. Nie myślałem o tak małych liczbach. Jednak nadal jest to prawda.
Riley

@ Riley 2nie jest prawdą, zobacz to .
Okx,

13

Bramy NAND, 551

16-bitowy kalkulator pełzania Utworzono za pomocą Logisim

Ta sama zasada, co w mojej innej odpowiedzi , ale pobiera 2-bajtowe podpisane dane wejściowe, więc może to obsłużyć 47, 10000. Działa dla WSZYSTKICH przypadków testowych!

Nie jest to optymalne dla danych przypadków testowych, ponieważ 10000 może być wyrażone tylko 15 z 16 bitów, ale działa w każdym wieku w zakresie [-32768, 32768). Pamiętaj, że każdy ujemny wiek powróci 1.

Wejścia po lewej stronie (brak określonej kolejności, 1 bit na górze). Wyjście w prawym dolnym rogu.


10

Bramy NAND, 274 262

Oryginał:

Lepiej: Utworzono za pomocą Logisim

Zajmuje to dwa wejścia po lewej jako 1-bajtowe liczby całkowite ze znakiem 1-bitowym u góry. Wyjście znajduje się w lewym dolnym rogu; prawda i falsey tutaj powinny być oczywiste.

Działa dla wszystkich przypadków testowych z wyjątkiem 47, 10000, więc myślę, że technicznie nie jest to poprawna odpowiedź. Jednak najstarszą osobą na (wiarygodnym) zapisie było 122, więc 8 bitów (maks. 127) będzie działać dla każdego możliwego scenariusza do tego momentu. Po skończeniu wersji 16-bitowej opublikuję nową odpowiedź (czy powinienem ją edytować?)

Wersja 16-bitowa jest gotowa!

Zauważysz niektóre pionowe odcinki obwodu. Pierwszy (od lewej) określa, które wejście jest większe. Następne dwa to multipleksery, sortujące wejścia. Następnie dodaję 11111001(-7) do mniejszej części czwartej i kończę, porównując dwa razy to z większym wkładem. Jeśli jest mniej, związek jest przerażający. Ponieważ zmieniam bity na podwójne, muszę wziąć pod uwagę niewykorzystany bit lesser-7. Jeśli jest to 1, to lesser-7jest ujemne, a młodsza z nich nie jest starsza niż sześć. Przerażający. Kończę bramką OR, więc jeśli którykolwiek z testów pełzania powróci 1, cały obwód też.

Jeśli przyjrzysz się uważnie, zobaczysz, że użyłem siedmiu jeden stałych s (na stałe 11111011i końcowe 0). Zrobiłem to, ponieważ Logisim wymaga podania co najmniej jednej wartości dla bramki logicznej w celu wygenerowania wyniku. Jednak za każdym razem, gdy używana jest stała, dwie bramki NAND zapewniają 1wartość niezależnie od stałej.

-12 bramek dzięki mnie !


Zauważyłem oczywistą optymalizację. Jeśli zwrócisz na to uwagę, zanim dokonam edycji, nadal ci się przyznam!
Khuldraeseth na'Barya

9

C #, 22 bajty

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

1
Nie jestem zbytnio programistą C #, ale czy końcowy średnik jest wymagany jako część funkcji?
Olivier Grégoire

1
@ OlivierGrégoire To jest po prostu niepoprawna składnia, jeśli zostanie pominięta; jest to funkcja anonimowa
kot

8

C, 29 bajtów

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

Jak to działa:

  • #define f(a,b)definiuje funkcję makra, fktóra przyjmuje dwa nietypowe argumenty.
  • a/2+7>b sprawdza, czy pierwszy wiek podzielony przez dwa plus siedem jest większy niż drugi wiek.
  • b/2+7>a sprawdza, czy drugi wiek podzielony przez dwa plus siedem jest większy niż pierwszy wiek.
  • Jeśli którakolwiek z powyższych wartości jest prawdą, zwróć 1 (przerażające). W przeciwnym razie zwróć 0 (nie przerażające).

Wypróbuj online!


powinieneś przerzucić porównanie, powinno być jak >bnie<b
Khaled.K

Cytat „minimalny wiek” oznacza, że ​​musisz sprawdzić age >= min, czy potrzebujesz również AND zamiast OR, ponieważ obie strony muszą się upewnić, aby nie było przerażające, test przypadku „47, 10000 - Przerażające”
Khaled.K

ok, naprawiłem błąd, ale logika jest zła, zwraca true, tio.run
Khaled.K

1
@Tas nope.
MD XF

1
Pozdrawiam, dziękuję za link
Tas

7

JavaScript (ES6), 21 bajtów

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

Zwraca 0 za nie przerażające, 1 za przerażające.

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


Oszczędzaj bajt dzięki curry: a=>b=>zamiast (a,b)=>zadzwoń za pomocą f(40)(40).
Stephen

@StephenS, dziękuję, nauczyłem się czegoś nowego!
Rick Hitchcock

Nie ma problemu, nauczyłem się tego, gdy ktoś powiedział mi to samo :) Działa to tylko z dwoma parametrami, potem nie jest tego warte.
Stephen


5

Siatkówka , 20 bajtów

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

Wypróbuj online!

Dane wejściowe są jednokierunkowe, a linia między dwoma liczbami jest podawana. Wyjście to 0(nie przerażające) lub 1(przerażające).

Wyjaśnienie

O`.+

Posortuj dwie liczby, abyśmy wiedzieli, że większa jest druga.

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

Zadzwoń do mniejszego wieku ai większego wieku b. Najpierw wychwytujemy a-7w grupie 1. Następnie staramy się dopasować 2*(a-7)+1w b, co oznacza b >= 2*(a-7)+1lub b >= 2*(a-7)lub b/2+7 > aco jest kryterium creepy relacji.


5

TI-Basic, 20 10 9 bajtów

max(2Ans<14+max(Ans

-10 bajtów przy użyciu listy i części sugestii Timtech

-1 bajt przy użyciu sugestii lirtosiasta

Zawiera listę dwóch grup wiekowych, „{40,42}: prgmNAME”

Zwraca 1 dla „przerażające” i 0 dla „nie przerażające”.


Czy TI-BASIC automatycznie zamyka nawiasy przy symbolu testowym ( < <= = != >= >)?
Zacharý

@ Zacharý Nie, TI-Basic zamyka nawiasy tylko na końcu linii lub dwukropka.
pizzapants184

Och, ups, zapomniałem, że dane wejściowe były traktowane jako lista liczb!
Zacharý

4

GNU APL 1.2, 23 bajty

Definiuje funkcję, która pobiera dwa argumenty i wypisuje 1, jeśli jest przerażający, 0, jeśli nie.

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

Wyjaśnienie

zaczyna się i kończy funkcja
A f Bjest nagłówkiem funkcji; Funkcja o nazwie fi przyjmuje dwa argumenty, Ai B(funkcje w APL może być monadycznego - biorąc jeden argument - albo dwójkowym - biorąc dwa argumenty)
A⌊Bjest min(A,B)i A⌈Bjest max(A,B)
APL oceniana jest od prawej do lewej, więc potrzebne są nawiasy, aby zapewnić prawidłowe pierwszeństwo

Pozostałe operatory są oczywiste.

Kod może być golfem, wciąż jestem nowy w golfie.


1
Witamy na stronie!
OldBunny2800

Wow, fajnie, GNU APL, od dawna tego nie widziałem.
Zacharý

Można też wziąć argumenty za listę: f Xwtedy (⌊/X)<7+.5×⌈/X. IIRC możesz usunąć nową linię między drugą i trzecią linią.
Zacharý

@ Zacharý Tak, anonimowe lambdas są możliwe. Nie są obsługiwane przez tę wersję GNU APL, a nowsza nie kompiluje się na Macu. Niektóre z moich innych odpowiedzi używają APL 1.7, ponieważ testuję je na Ubuntu. Nie używałem lambdów (może to naprawić później), ponieważ wciąż jestem całkiem nowy w APL.
Arc676,

Wypróbuj ngn-apl. Jest open-source jak GNU APL, ale szczerze mówiąc, jest lepszy.
Zacharý

4

Python 3, 74 45 bajtów

First Code Golf, prawdopodobnie okropny.

29-bajtowa redukcja o @Phoenix

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

Cześć, pamiętaj o prawidłowym sformatowaniu kodu za pomocą systemu Markdown.
Leo

nie martw się, ktoś mnie pobił, ale źle to
naprawię

Możesz się tam pozbyć :)
Rozpad

Ponadto, lambda a,b:0 if(a/2)+7>b or(b/2)+7>a else 1powinno działać i jest krótszy od partii.
Pavel

1
lambda a,b:a/2+7>b or b/2+7>a. Porzucić ciężar te brzydkie 1s i 0s i objąć władzę True/ False!
Wartość tuszu

3

JavaScript (ES6), 27 bajtów

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

Bez curry (zadzwoń jak f(a,b)zamiast f(a)(b))

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

Jeśli b > azamień parametry i spróbuj ponownie. W przeciwnym razie sprawdź. Curry nie zapisuje żadnych bajtów z powodu wywołania rekurencyjnego.

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 bajtów

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

Absolutnie nie oryginalne.

Testowanie

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

1
+1 za wzmiankę „ Absolutnie nie oryginalne ”. Prawie nikt inny tego nie robi, podczas gdy prawie wszystkie są takie same. I mogłem dodać link TIO z twojego kodu testowego. Nie wiesz, dlaczego zawsze dodajesz kod testowy, ale nie link TIO ? .. :)
Kevin Cruijssen

1
Dzięki, Kevin! Czasami dodaję jeden, czasem nie. To zależy od tego, czy mam moje IDE otwarte czy zamknięte. To takie proste! : P Ponadto pokazuję kod testowy, aby ludzie mogli zrozumieć, co sprawia, że ​​ta lambda jest ważna. :)
Olivier Grégoire

3

Python 3, 31 bajtów

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

Niewiele krótszy niż inne zgłoszenia Pythona, ale znalazłem nieco inny sposób na sprawdzenie przerażenia. Zauważyłem, że dopuszczalna różnica między wiekami wynosi min - 14. Wynika to z algebraicznej zmiany układu formuły.

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

Pozwoliło mi to rozwiązać bez potrzeby stosowania dwóch stałych, a także bez konieczności używania zarówno wartości maksymalnej, jak i minimalnej, zamiast abs (ab). Z perspektywy golfa dostałem tylko jeden bajt mniej niż rozwiązanie @ nocturama, ale użyłem nieco innej formuły, aby to zrobić.


Z pewnością nie udaje się to w [37.53] (nie w pakiecie testowym, ale) w duchu (x / 2) +7 tego toru wodnego
Alexx Roche

@AlexxRoche Nie, jeśli podano [37,53] jako [a, b], obliczenia powinny być abs(37 - 53) > min(37, 53) - 14 = abs(-16) > 37 - 14 = 16 > 23 = False Prawidłowa odpowiedź, ponieważ zgodnie z (x / 2) + 7 minimalny wiek dla 53 lat to53/2 + 7 = 26.5 + 7 = 33.5
Delya Erricson

3

Excel, 26 24 bajtów

Formuła komórki, która pobiera dane liczbowe z zakresu komórki A1:B1i generuje wartość logiczną reprezentującą pełzanie do komórki formuły

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

Stara wersja, 26 bajtów

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

2

TI-Basic, 10 9 10 bajtów

2min(Ans)-14≤max(Ans

Wyświetl listę danych wejściowych Ans, wyjściowych, 1jeśli są „przerażające” lub w 0inny sposób.


2

Matematyka , 16 bajtów

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

Wypróbuj online!

-2 bajty dzięki @GregMartin

Prawda nie przerażająca, nieprawda przerażająca.

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

Oszczędź 2bajty, biorąc listę wieków jako:Max@#/2+7<Min@#&
ngenisis

2

SAS, 77 bajtów

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

2

Röda , 16 bajtów

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

Wypróbuj online!

Jest to anonimowa funkcja, która pobiera dane wejściowe jako dwa literały (nie tablicę) ze strumienia wejściowego.

Wyjaśnienie

{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 bajtów

Nie mogę skomentować, ale otrzymałem nieco krótszą odpowiedź niż inne rozwiązanie Python 3:

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

-5 dzięki @Cyoce!


możesz usunąć miejsce wlambda *a
Cyoce

1

Fourier, 37 bajtów

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

Wypróbuj na FourIDE!

Pobiera dwie liczby jako dane wejściowe. Będzie grać w golfa później.


Nie musi generować takiego ciągu, może być prawdą lub fałszem
Leo

Niezły golf. To było szybkie.
MD XF


1

Japt , 11 bajtów

Zwraca trueza „przerażające” i falseza nie.

wV /2+7>UmV

Wypróbuj online


Wyjaśnienie

      :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 bajtów

<.<7+2%~>.

Wyjścia 1nie przerażające, 0przerażające

Wyjaśnienie

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

1

J-uby , 25 bajtów

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

Zadzwoń jak f^[80,32]. Daje trueza nie przerażające, falseza przerażające.

Wyjaśnienie

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

To jest piękny język. Spędziłem dużo czasu próbując osiągnąć podobne cele z Ruby (nazwałem to „Blurb”), ale ciężkie opieranie się na niej method_missingdoprowadziło do zbyt dużej złożoności. To podejście jest czyste i eleganckie. Gratulacje!
Jordania,

@Jordan dzięki! Nie mogę w pełni docenić, ponieważ J był mocno zainspirowany (stąd nazwa). Jestem otwarty na sugestie innego programisty Ruby, jeśli je masz.
Cyoce,

@Jordan powinieneś zobaczyć inne, bardziej złożone odpowiedzi J-uby. Oni są całkiem czymś.
Cyoce

1

AWK , 26 bajtów

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

Wypróbuj online!

Wyjścia 1 dla „Creepy” i 0 dla „Not Creepy”. Można zapisać 3 bajty, jeśli brak danych wyjściowych można uznać za wartość fałszowania, poprzez:

$0=$1/2+7>$2||$2/2+7>$1
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.