この関係は不気味ですか?


73

このXKCDコミックによれば、関係の年齢ギャップが「気味悪い」かどうかを判断する公式があります。この式は次のように定義されます:

(Age/2) + 7

デートできる人の最低年齢であること。

したがって、上記の関係のいずれかの人が他方の最低年齢よりも若い場合、関係は不気味です。

二人の年齢を考えると、その関係が不気味かどうかを出力できますか?

ルール

  1. プログラムは、関係にある2人の年齢である2つの整数を入力として使用する必要があります。これらは、適切な形式で取得できます。

  2. その後、プログラムは、関係が「気味悪い」(真実=気味の悪い)かどうかを説明する真実または偽の値を出力する必要があります。

  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
エルペドロ

あなたは実際にそれが常に(若い、古い)タプルを仮定することができるようです-ちょうど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を返すことはありません。-
ライリー

4
[13,13]は二重に気味が悪い。
gmatht

1
@gmathtそれは二重になると思います。そんなに小さな数字は考えませんでした。それはまだ真実です。
ライリー

@Rileyが2truthyはありませんが、参照これを
Okx

13

NANDゲート、551

16ビット不気味計算機Logisimで 作成

私の他の答えと同じ原理ですが 2バイトの符号付き入力を受け取るため、処理でき47, 10000ます。すべてのテストケースで動作します!

10000は16ビットのうち15ビットでしか表現できないため、これは特定のテストケースには最適ではありませんが、[-32768、32768]の範囲のどの年齢でも機能します。負の年齢が返されることに注意してください1

左の入力(特定の順序なし、上に1ビット)。右下に出力します。


10

NANDゲート、274 262

元の:

良い: Logisimで 作成

これは、左側の2つの入力を1バイトの符号付き整数とし、1ビットを先頭にします。出力は左下にあります。ここでの真実と偽りは明らかなはずです。

を除くすべてのテストケース47, 10000で動作するため、これは技術的には有効な答えではないと思います。ただし、(信頼できる)レコード最も古い人は122だったため、この時点まで可能なあらゆるシナリオで8ビット(最大127)が機能します。16ビットバージョンが終了したら、新しい回答を投稿します(または、これを編集する必要がありますか?)。

16ビットバージョンが完成しました!

回路のいくつかの垂直セクションに気付くでしょう。最初の(左から)が、どの入力が大きいかを決定します。次の2つはマルチプレクサで、入力をソートします。次に11111001、4番目のセクションの小さい方に(-7)を追加し、これを2回大きい入力と比較して結論を​​出します。少ない場合、関係は不気味です。ビットを2倍にシフトするため、の未使用ビットを考慮する必要がありlesser-7ます。これがである場合1lesser-7負であり、2つのうち若い方は6つより古いことはありません。不気味。ORゲートで終了するため、不気味テストのいずれかが戻る1と、回路全体が戻ります。

よく見ると、あなたは、私が使用していることがわかります7 1定数(ハードコーディング11111011および末尾0)。Logisimでは、論理ゲートが出力を生成するために少なくとも1つの値が必要であるため、これを行いました。ただし、定数が使用されるたびに、2つのNANDゲート1が定数に関係なく値を保証します。

-12門は私に感謝します


明らかな最適化に気づきました。私が編集する前にあなたがそれを指摘するならば、私はまだあなたを信用します!
クルドラセスナバルヤ

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)f2つの型なし引数を取るマクロ関数を定義します。
  • a/2+7>b 最初の年齢を2プラス7で割った値が2番目の年齢よりも大きいかどうかを確認します。
  • b/2+7>a 2番目の年齢を2プラス7で割った値が最初の年齢よりも大きいかどうかを確認します。
  • 上記の値のいずれかが真の場合、1(気味の悪い)を返します。それ以外の場合は、0(不気味ではない)を返します。

オンラインでお試しください!


あなたは比較を反転する必要があり、そうでは>bないはずです<b
-Khaled.K

「最低年齢であること」とはage >= min、テストケース「
47、10000

大丈夫私はエラーを修正しましたが、論理が間違っています、それはtrueを返します、tio.run
Khaled.K

1
@Tas nope。
MD XF

1
乾杯、リンクのおかげで
タス

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


カリー化でバイトを保存:のa=>b=>代わりに(a,b)=>、で呼び出しますf(40)(40)
スティーブン

@StephenS、ありがとう、新しいことを学びました!
リックヒッチコック

問題ありません、誰かが同じことを言ったときにそれを学びました:)それは2つのパラメータでのみ動作しますが、その後は価値がありません。
スティーブン


5

網膜、20バイト

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

オンラインでお試しください!

入力は単項式で、2つの数字の間に改行があります。出力は0(気味が悪い)または1(気味が悪い)です。

説明

O`.+

2つの数値を並べ替えて、大きい方が2番目であることを確認します。

^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バイト

lirtosiastの提案を使用した-1バイト

「{40,42}:prgmNAME」という2つの年齢のリストを取得します

「気味が悪い」場合は1、「気味が悪い」場合は0を返します。


TI-BASICはテストシンボル(< <= = != >= >)で括弧を自動的に閉じますか?
ザカリー

@Zacharýいいえ、TI-Basicは行またはコロンの終わりの括弧のみを閉じます。
pizzapants184

おっと、入力が数字のリストとして取られていたことを忘れてしまいました!
ザカリー

4

GNU APL 1.2、23バイト

2つの引数を取り、気味が悪い場合は1、そうでない場合は0を出力する関数を定義します。

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

説明

関数の開始と終了は
A f B関数ヘッダーです。機能の名前はf二つの引数を取り、AそしてB(APL中の関数はモナドであるか、または二項- - - 1つの引数取っ二つの引数を取ること)
A⌊Bであるmin(A,B)A⌈Bされmax(A,B)
、カッコが適切な優先度を確保するために必要とされているので、APLは、右から左に評価されます

他の演算子は自明です。

コードはゴルフができるかもしれませんが、私はまだコードゴルフは初めてです。


1
サイトへようこそ!
OldBunny2800

うわー、すてきな、GNU APLは、しばらくそれを見ていません。
ザカリー

また、引数をリストとして取ることができます:f Xthen (⌊/X)<7+.5×⌈/X。IIRCでは、2行目と3行目の間にある改行を削除できます。
ザカリー

@Zacharýはい、匿名のラムダが可能です。このバージョンのGNU APLではサポートされておらず、新しいバージョンはMacでコンパイルされません。Ubuntuでテストしているため、他の回答の一部ではAPL 1.7を使用しています。私はまだAPLにかなり慣れていないので、ラムダを使用していません(後で修正するかもしれません)。
Arc676

ngn-aplを試してください。GNU APLのようなオープンソースですが、正直なところより優れています。
ザカリー

4

Python 3、74 45バイト

恐ろしい最初のコードゴルフ。

@Phoenixによる29バイトの削減

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

こんにちは、マークダウンシステムを使用してコードを適切にフォーマットしてください。
レオ

、心配しないで誰かが病気に修正それをしかし、それに私を打つ
KuanHulio

あなたはそこのスペースのいくつかを取り除くことができます:)
ベータ崩壊

また、動作する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。それらの厄介な1sと0s の負担を放棄し、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、パラメータを交換して再試行します。それ以外の場合は、確認してください。カリー化は、再帰呼び出しのためにバイトを保存しません。

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

他のpython提出よりもそれほど短くはありませんが、気味が悪いかどうかを確認するためのわずかに異なる方法を見つけました。年齢間の許容差は最小-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

これにより、2つの定数を必要とせず、maxとminの両方を使用せずに、代わりにabs(ab)を使用して解決できます。ゴルフの観点からは、@ nocturamaのソリューションよりも1バイト少なくなりましたが、それを行うにはわずかに異なる式を使用しました。


確かにこれは[37,53]で失敗します(テストスイートではなく)このフェアウェイの(x / 2)+7スピリット内
Alexx Roche

@AlexxRocheいいえ、[a、b]として[37,53]が与えられた場合、計算は次のようになり 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

からの入力をリストしAns1「クリーピー」または0その他の場合に出力します。



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]}

オンラインでお試しください!

これは、入力ストリームから(配列ではなく)2つのリテラルとして入力を受け取る匿名関数です。

説明

{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
チョイス

1

フーリエ変換、37バイト

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

FourIDEでお試しください!

入力として2つの数値を受け取ります。後でゴルフします。


それはtruthyまたはfalsyすることができ、出力にそのような文字列を必要としません
レオ

素敵なゴルフ。早かった。
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プログラマーからの提案を受け入れます。
チョイス

@Jordanには、他のより複雑なJ-ubyの回答が表示されます。彼らはかなりのものです。
チョイス

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.