Чи такі стосунки моторошні?


73

Відповідно до цього коміксу XKCD , існує формула, яка визначає, чи є віковий розрив у відносинах "моторошним". Ця формула визначається як:

(Age/2) + 7

будучи мінімальним віком людей, яких можна побачити.

Тому відносини є моторошними, якщо будь-хто з людей у ​​цих стосунках молодший мінімального віку інших.

Враховуючи вік двох людей, чи можете ви визначити, чи є ці стосунки моторошні?

Правила

  1. Ваша програма повинна брати два цілі числа як вхідні дані, вік обох людей у ​​відносинах. Вони можуть бути прийняті у будь-якому розумному форматі.

  2. Тоді ваша програма повинна виводити значення "химерність" або "хибність", що описує, чи стосуються "моторошно" (Truthy = Creepy).

  3. Стандартні лазівки заборонені.
  4. Ця головоломка - Code Golf, тому відповідь із найкоротшим вихідним кодом у байтах виграє

Випробування

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
Як слід age/2округлюватись? Можливо, вгору, якщо точна половина повинна бути мінімальною? 17,21зробив би хороший тестовий випадок.
Мартін Ендер

4
@MartinEnder Значення є мінімальним, тому взагалі не округляйте. Це не повинно бути цілим числом.
Лев

81
Ви також можете додати 13, 13 - Creepy.
Грег Мартін

12
47, 10000 - це… цікаве поєднання. Я також хотів би зазначити, що згідно з цією формулою для лікаря, котрий зустрічається з будь-якою людиною, страшно.
Девід Конрад

8
@DavidConrad - так, так. в основному його приємність з його боку ....
Бетмен

Відповіді:



17

Python 3 , 26 байт

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

Спробуйте в Інтернеті!
Вхід - це список обох віків


Було те саме, перш ніж я прочитав відповіді. +1
ElPedro

Здається, ви насправді можете припустити кортеж там, де він завжди (молодший, старший) - просто запитав ОП - дивуйтеся, що він скаже.
rm-vanda

@ rm-vanda Я запитав раніше, ви не можете припустити
Стівен

15

05AB1E , 8 6 байт

;7+R‹Z

Спробуйте в Інтернеті! або Спробуйте весь тест

         # 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
Як програміст C я погоджуюся, що 2 - це правда.
gmatht

@gmatht Це завжди має повернути 0 або 1, ніколи 2.
Райлі

4
[13,13] вдвічі моторошно.
гматт

1
@gmatht Я думаю, це було б подвійне. Я не думав про такі маленькі цифри. Це все-таки правдоподібно.
Райлі

@Riley 2не є правдою, дивіться це .
Okx

13

NAND ворота, 551

16-розрядний калькулятор моторошності Створено з Logisim

Той самий принцип, як і в моїй іншій відповіді , але бере 2-байтні підписані входи, тому він може працювати 47, 10000. Працює для ВСІХ тестових випадків!

Це не є оптимальним для даних тестових випадків, оскільки 10000 можна виразити лише 15 із 16 біт, але це працює для будь-якого віку в діапазоні [-32768, 32768). Зауважте, що будь-який негативний вік повернеться 1.

Введення зліва (немає конкретного порядку, 1 біт зверху). Виведіть праворуч внизу.


10

NAND ворота, 274 262

Оригінал:

Краще: Створено з Logisim

Це займає два входи зліва як 1-байтові цілі числа, а 1-бітний вгорі. Вихід знаходиться внизу зліва; триті та фальси тут повинні бути очевидними.

Працює для всіх тестових випадків, за винятком 47, 10000, тому я думаю, що це технічно не є коректною відповіддю. Однак найстаршою людиною на (надійному) записі було 122, тому 8 біт (макс. 127) працюватимуть за будь-якого можливого сценарію до цього моменту. Коли я закінчу 16-бітну версію, я опублікую нову відповідь (чи потрібно редагувати цю?)

16-бітна версія зроблена!

Ви помітите кілька вертикальних ділянок схеми. Перший (зліва) визначає, який вхід більший. Наступні два - мультиплексори, сортуючи входи. Потім я додаю 11111001(-7) до меншої у четвертому розділі, і закінчую, порівнюючи це двічі з більшим входом. Якщо менше, стосунки моторошні. Оскільки я зміщую біти на подвійний, я повинен враховувати невикористаний біт lesser-7. Якщо це a 1, то lesser-7це негативно, а молодший з двох не старше шести. Моторошно. Я закінчую АБО ворота, так що якщо будь-який тест на моторошність повернеться 1, весь контур робить.

Якщо ви придивитесь уважніше, ви побачите, що я використав сім одних постійних s (жорстке кодування 11111011та трейлінг 0). Я зробив це, тому що Logisim вимагає принаймні одне значення для отримання логічного ворота для отримання результату. Однак кожен раз, коли використовується константа, два ворота NAND забезпечують 1значення незалежно від постійної.

-12 воріт завдяки мені !


Помітив очевидну оптимізацію. Якщо ви вкажете це перед тим, як редагувати, я все одно буду вам вдячний!
Khuldraeseth na'Barya

9

C #, 22 байти

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

1
Я не дуже програміст на C #, але чи потрібна остаточна крапка з комою як частина функції?
Олів’є Грегоар

1
@ OlivierGrégoire Це просто недійсний синтаксис, якщо він пропущений; це анонімна функція
кіт

8

C, 29 байт

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

Як це працює:

  • #define f(a,b)визначає макро функцію, fяка приймає два нетипізовані аргументи.
  • a/2+7>b перевіряє, чи перший вік, розділений на два плюс сім, більший, ніж другий вік.
  • b/2+7>a перевіряє, чи є другий вік, розділений на два плюс сім, більший, ніж перший.
  • Якщо будь-яке з наведених вище значень є істинним, поверніть 1 (моторошно). В іншому випадку поверніть 0 (не моторошно).

Спробуйте в Інтернеті!


вам слід перегорнути порівняння, воно має бути як >bні<b
Khaled.K

Цитата "мінімальний вік" означає, що ви повинні перевірити, чи age >= minвам також потрібно І замість АБО, оскільки обидві сторони повинні задовольнити, щоб це не було моторошно, тестовий випадок "47, 10000 - Creepy"
Khaled.K

добре, я виправив помилку, але логіка помилкова, вона повертається правдою, tio.run
Khaled.K

1
@Tas nope.
MD XF

1
Ура, дякую за посилання
Tas

7

JavaScript (ES6), 21 байт

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

Повертає 0 для не моторошного, 1 для моторошного.

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


Збережіть байт за допомогою currying: a=>b=>замість того (a,b)=>, щоб дзвонити за допомогою f(40)(40).
Стівен

@StephenS, дякую, дізнався щось нове!
Рік Хічкок

Немає проблем, я дізнався це, коли хтось сказав мені те саме: він працює лише з двома параметрами, хоча після цього це не варто.
Стівен


5

Сітківка , 20 байт

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

Спробуйте в Інтернеті!

Введення не є одинаковим, посилання між двома номерами. Вихідний результат 0(не моторошний) або 1(моторошний).

Пояснення

O`.+

Сортуйте два числа, щоб ми знали, що більшим є друге.

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

Назвіть менший вік aі більший вік b. Ми спочатку захоплюємо a-7в групі 1. Тоді ми намагаємося відповідати 2*(a-7)+1в b, що означає b >= 2*(a-7)+1або b >= 2*(a-7)або b/2+7 > aщо є критерієм для моторошних відносин.


5

TI-Basic, 20 10 9 байт

max(2Ans<14+max(Ans

-10 байт, використовуючи список та частину пропозиції Timtech

-1 байт, використовуючи пропозицію ліртосіаста

Входить у список двох вікових категорій, "{40,42}: prgmNAME"

Повертає 1 для "моторошно" та 0 для "не моторошно".


Чи автоматично TI-BASIC закриває дужки на символі тестування ( < <= = != >= >)?
Zacharý

@ Zacharý Ні, TI-Basic закриває дужки лише в кінці рядка або двокрапки.
pizzapants184

Ой, ой, я забув, що введення приймається як список номерів!
Zacharý

4

GNU APL 1.2, 23 байти

Визначає функцію, яка бере два аргументи і друкує 1, якщо моторошно, 0 якщо ні.

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

Пояснення

починає і закінчує функцію
A f B- заголовок функції; Функція називається fі приймає два аргументи, Aі B(функції в APL може Монадический - приймати один аргумент - або диадического - з двома аргументами)
A⌊Bє min(A,B)і A⌈Bє max(A,B)
APL оцінюється справа наліво, так що необхідні круглі дужки , щоб забезпечити належний пріоритет

Інші оператори пояснюють себе.

Код може бути гольф, я все ще новачок у коді-гольф.


1
Ласкаво просимо на сайт!
OldBunny2800

Нічого собі, приємно, GNU APL, цього вже не бачили.
Zacharý

Також можна взяти аргументи як список: f Xтоді (⌊/X)<7+.5×⌈/X. IIRC ви можете видалити новий рядок між другим та третім рядками.
Zacharý

@ Zacharý Так, можливі анонімні лямбда. Ця версія GNU APL не підтримується, і новіша версія не компілюється на Mac. Деякі з моїх інших відповідей використовують APL 1.7, тому що я тестую їх на Ubuntu. Я не використовував лямбда (можливо, виправити їх пізніше), тому що я все ще досить новий в APL.
Arc676

Спробуйте ngn-apl. Це відкритий код, як GNU APL, але, чесно кажучи, це краще.
Zacharý

4

Python 3, 74 45 байт

Перший код гольфу, напевно, страшний.

29 байт зменшення за допомогою @Phoenix

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

Привіт, будь ласка, переконайтеся, що правильно відформатувати код за допомогою системи розмітки.
Лев

не хвилюйтесь, хтось побив мене до цього, я все
поправлю

Ви можете позбутися деяких просторів там :)
Бета-розпад

Крім того, lambda a,b:0 if(a/2)+7>b or(b/2)+7>a else 1повинен працювати і скорочується на багато.
Павло

1
lambda a,b:a/2+7>b or b/2+7>a. Відмовтеся від тягаря цих примхливих 1і 0с і охопить силу True/ False!
Значення чорнила

3

JavaScript (ES6), 27 байт

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

Немає curry (дзвоніть, як f(a,b)замість f(a)(b))

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

Якщо b > a, поміняйте параметри та повторіть спробу. Інакше перевірте. Завдяки рекурсивному виклику currying не економить жоден байт.

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 байт

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

Зовсім не оригінально.

Тестування

Спробуйте в Інтернеті!

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 за згадування " Абсолютно не оригінально ". Майже ніхто інший не робить, поки вони майже всі однакові. І я сміливо додав TIO-посилання з вашого тестового коду. Не впевнений, чому ви завжди додаєте тестовий код, але не TIO-посилання ? .. :)
Кевін Круїйсен

1
Дякую Кевін! Я іноді додаю один, іноді ні. Це залежить від того, відкрити чи закрити я IDE Це так просто! : P Також я показую тестовий код для того, щоб люди зрозуміли, що робить цю лямбда дійсною. :)
Олів'є Грегоар

3

Python 3, 31 байт

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

Не набагато коротше, ніж інші пітонні роботи, але я знайшов дещо інший спосіб перевірити плагічність. Я помітив, що прийнятна різниця між віками дорівнює min - 14. Це випливає з алгебраїчної перестановки формули.

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

Це дозволить мені вирішити, не потребуючи двох констант, а також без використання макс і хв, замість цього, використовуючи abs (ab). З точки зору гольфу я отримав лише один байт менше, ніж рішення @ nocturama, але для цього я використав трохи іншу формулу.


Безумовно, це не вдається [37,53] (не в тестовому наборі, але) в межах (x / 2) +7 духу цього фарватера
Alexx Roche

@AlexxRoche Nope, якщо [37,53] дано як [a, b], обчислення має стати abs(37 - 53) > min(37, 53) - 14 = abs(-16) > 37 - 14 = 16 > 23 = False Це правильна відповідь, тому що відповідно до (x / 2) + 7, мінімальний вік для 53 років53/2 + 7 = 26.5 + 7 = 33.5
Delya Erricson

3

Excel, 26 24 байт

Формула комірки, яка приймає введення як числа з діапазону комірок A1:B1і виводить булеве значення, що представляє плазучість до комірки формули

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

Стара версія, 26 байт

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

2

TI-Basic, 10 9 10 байт

2min(Ans)-14≤max(Ans

Перерахуйте вхід з Ans, виводить, 1якщо "моторошно" чи 0іншим чином.


2

Математика , 16 байт

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

Спробуйте в Інтернеті!

-2 байти завдяки @GregMartin

Правда для не моторошних, хибних для моторошних.

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

Збережіть 2байти, взявши віки як список:Max@#/2+7<Min@#&
ngenisis

2

SAS, 77 байт

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

2

Рода , 16 байт

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

Спробуйте в Інтернеті!

Це анонімна функція, яка приймає вхід як два літерали (а не масив) з вхідного потоку.

Пояснення

{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 байт

Неможливо коментувати, але я отримав трохи коротшу відповідь, ніж інше рішення Python 3:

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

-5 завдяки @Cyoce!


ви можете прибрати простір уlambda *a
Cyoce

1

Фур’є, 37 байт

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

Спробуйте це на FourIDE!

В якості введення бере два числа. Пізніше буде гольф.


Для цього не потрібно виводити такий рядок, він може бути фальшивим чи хибним
Лев

Хороший гольф. Це було швидко.
MD XF


1

Japt , 11 байт

Повертається trueяк "моторошно", так і falseне.

wV /2+7>UmV

Спробуйте в Інтернеті


Пояснення

      :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 байт

<.<7+2%~>.

Виходи 1для не моторошних, 0для моторошних

Пояснення

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

1

J-uby , 25 байт

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

Телефонуйте як f^[80,32]. Дає trueза не моторошний, falseза моторошний.

Пояснення

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

Це гарна мова. Я тривалий час намагався досягти подібних цілей з Рубі (я назвав це "Розмиття"), але сильно спершись на method_missingвелику складність. Цей підхід чистий і елегантний. Вітаю!
Йорданія

@Jordan дякую! Я не можу взяти на себе всі заслуги, оскільки це сильно надихнуло Дж (звідси і назва). Я відкритий для пропозицій колеги Рубі програміста, якщо у вас є такі.
Кіос

@ Джордан, ви повинні побачити деякі інші більш складні відповіді J-uby. Вони зовсім щось.
Кіос

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.