这种关系令人毛骨悚然吗?


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会成为一个很好的测试用例。
Martin Ender

4
@MartinEnder该值是最小值,因此不要四舍五入。它不必是整数。
狮子座

81
您还可以添加13, 13 - Creepy
格雷格·马丁

12
47,10000是一个有趣的组合。我还想指出,根据这个公式,Who Doctor与任何人约会都令人毛骨悚然。
戴维·康拉德

8
@DavidConrad-是的。它基本上beastiality在他的部分....
蝙蝠侠

Answers:



17

Python 3,26个字节

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

在线尝试!
输入的是两个年龄的列表


在阅读现有答案之前,有相同的看法。+1
ElPedro '17

看来您实际上可以假设一个元组总是存在的(更年轻,更老)-刚问过OP-想知道他会说什么。
rm-vanda

@ rm-vanda我之前问过,你不能假设
斯蒂芬

15

05AB1E8 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。–
Riley

4
[13,13]令人毛骨悚然。
gmatht '17

1
@gmatht我想那会翻倍。我没想到这么小的数字。不过,这仍然是事实。
莱利

@Riley 2不诚实,请参阅
Okx

13

NAND门,551

16位蠕变计算器Logisim创建

我的其他答案相同的原理,但是采用2字节带符号输入,因此可以处理47, 10000。适用于所有测试用例!

对于给定的测试用例,这不是最佳选择,因为10000只能用16位中的15位表示,但是它适用于[-32768,32768)范围内的任何年龄。请注意,任何负数年龄都会返回1

左侧输入(无特定顺序,顶部1位)。输出在右下角。


10

NAND门,274 262

原版的:

更好: Logisim创建

这在左侧将两个输入作为1字节有符号整数,在顶部输入1位。输出在左下方;这里的真实和虚假应该很明显。

适用于除以外的所有测试用例47, 10000,因此我认为这在技术上不是有效的答案。但是,(可靠)记录上的最高年龄人是122,因此8位(最大127)适用于目前为止的任何情况。完成16位版本后,我将发布一个新答案(或应该编辑该答案?)。

16位版本已完成!

您会注意到电路的一些垂直部分。第一个(从左开始)确定哪个输入更大。接下来的两个是多路复用器,对输入进行排序。然后11111001,在第四部分中将(-7)加到较小的部分,然后通过将两倍与较大的输入进行比较来得出结论。如果小于,则关系是令人毛骨悚然的。由于我将位移至两倍,因此必须考虑的未使用位lesser-7。如果这是一个1lesser-7则为负,并且两个年龄中的较小者不大于六个。爬行。我完成了“或”门操作,因此,如果其中一个蠕变测试返回1,则整个电路都会执行。

如果仔细看,您会发现我使用了七个 1常量s(对11111011和后跟进行硬编码0)。我这样做是因为Logisim至少需要输入一个值才能使逻辑门产生输出。但是,每次使用一个常数时,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 检查第一个年龄除以2加7的结果是否大于第二个年龄。
  • b/2+7>a 检查第二年龄除以二加七是否大于第一年龄。
  • 如果以上任何一个值为true,则返回1(令人毛骨悚然)。否则,返回0(不令人毛骨悚然)。

在线尝试!


您应该进行比较,应该像>b不是<b
Khaled.K

引用“成为最低年龄”意味着您必须检查是否age >= min,也需要AND而不是OR,因为双方都必须满足才能使其不令人毛骨悚然,因此,测试用例“
47,10000

好的,我已经修复了错误,但是逻辑错误,它返回true,tio.run
Khaled.K

1
@Tas不行
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)+1b,这意味着b >= 2*(a-7)+1b >= 2*(a-7)b/2+7 > a这是一个令人毛骨悚然的关系的评价。


5

TI基本(20 10 9字节)

max(2Ans<14+max(Ans

通过使用清单和Timtech建议的一部分获得-10个字节

-1字节,使用lirtosiast的建议

接受两个年龄段的列表,“ {40,42}:prgmNAME”

对于“令人毛骨悚然”返回1,对于“不令人毛骨悚然”返回0。


TI-BASIC是否自动在测试符号(< <= = != >= >)处关闭括号?
扎卡里

@Zacharý不,TI-Basic仅在行或冒号的结尾处关闭括号。
pizzapants184年

哦,糟糕,我忘记了输入被当作数字列表!
扎卡里

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⌊Bmin(A,B)A⌈Bmax(A,B)
APL是从右到左求值的,因此需要括号以确保具有适当的优先级

其他运算符不言自明。

代码可能适合高尔夫,但我对代码高尔夫还是陌生的。


1
欢迎光临本站!
OldBunny2800

哇,好极了,GNU APL,已经有一段时间没有看到这种情况了。
扎卡里

另外,也可以将参数作为列表:f Xthen (⌊/X)<7+.5×⌈/X。IIRC您可以删除第二行和第三行之间的换行符。
扎卡里

@Zacharý是的,可以使用匿名lambda。此版本的GNU APL不支持它们,并且较新的版本无法在Mac上编译。我的其他一些答案使用APL 1.7,因为我在Ubuntu上对其进行了测试。我没有使用过lambda(稍后可能会修复它们),因为我对APL还是很陌生。
Arc676'9

试用ngn-apl。它像GNU APL一样是开源的,但是老实说它更好。
扎卡里

4

Python 3,74 45字节

First Code高尔夫,可能很糟糕。

@Phoenix减少29字节

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

嗨,请确保使用markdown系统正确格式化代码。
狮子座

别担心,有人殴打了我,但是还是把它
弄坏了

您可以摆脱那里的一些空间:)
Beta Decay

而且,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

没有烦人(叫来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链接吗?.. :)
Kevin Cruijssen

1
谢谢凯文!我有时会添加一个,有时却不会。这取决于我是否打开或关闭我的IDE。就这么简单!:P另外,我显示测试代码是为了让人们理解是什么使此lambda有效。:)
OlivierGrégoire17年

3

Python 3,31个字节

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

不会比其他python提交短很多,但是我发现了一种检查蠕变的稍微不同的方法。我注意到年龄之间可接受的差异等于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

这让我不需要两个常量就可以求解,也不需要同时使用max和min,而是使用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基本10 9 10字节

2min(Ans)-14≤max(Ans

列出来自的输入Ans1如果“令人毛骨悚然” ,则输出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

Röda,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

Fourier,37个字节

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

在FourIDE上尝试!

取两个数字作为输入。稍后再打高尔夫球。


它不需要输出这样的字符串,可以是真实的也可以是虚假的
Leo

高尔夫不错。那很快。
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 

这是一门美丽的语言。我花了很长时间尝试用Ruby(我称其为“ Blurb”)来达到类似的目的,但是method_missing过分依赖会导致过多的复杂性。这种方法干净优雅。恭喜!
乔丹

@乔丹谢谢!我不能称赞所有,因为这在很大程度上受到J(因此得名)的启发。如果您有任何建议,我欢迎其他Ruby程序员的建议。
Cyoce

@Jordan,您应该看到其他一些更复杂的J-uby答案。他们是相当的东西。
Cyoce

1

AWK,26字节

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

在线尝试!

输出1表示“蠕变”,0表示“不蠕变”。如果通过以下方式将无输出视为虚假值,则可以节省3个字节:

$0=$1/2+7>$2||$2/2+7>$1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.