Apakah hubungan ini menyeramkan?


73

Menurut komik XKCD ini , ada rumus untuk menentukan apakah kesenjangan usia dalam suatu hubungan "menyeramkan" atau tidak. Formula ini didefinisikan sebagai:

(Age/2) + 7

menjadi usia minimum orang yang bisa Anda kencani.

Karena itu suatu hubungan menyeramkan jika salah satu dari orang-orang dalam hubungan tersebut lebih muda dari usia minimum yang lain.

Mengingat usia dua orang, dapatkah Anda memberi tahu apakah hubungan itu menyeramkan atau tidak?

Aturan

  1. Program Anda harus mengambil dua bilangan bulat sebagai input, usia kedua orang dalam hubungan. Ini dapat diambil dalam format apa pun yang wajar.

  2. Program Anda kemudian harus menghasilkan nilai yang benar atau salah yang menggambarkan apakah hubungannya "menyeramkan" atau tidak (Truthy = Creepy).

  3. Tidak ada celah standar.
  4. Teka-teki ini adalah Code Golf, jadi jawabannya dengan kode sumber terpendek dalam byte akan menang

Uji Kasus

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
Bagaimana seharusnya age/2dibulatkan? Mungkin naik jika setengahnya seharusnya menjadi minimum? 17,21akan menjadi ujian yang bagus.
Martin Ender

4
@ MartinEnder Nilainya minimal, jadi jangan bulat sama sekali. Tidak harus bilangan bulat.
Leo

81
Anda juga bisa menambahkan 13, 13 - Creepy.
Greg Martin

12
47, 10000 adalah ... kombinasi yang menarik. Saya juga ingin menunjukkan bahwa menurut formula ini, sangat menyeramkan bagi Doctor Who untuk berkencan dengan manusia mana pun.
David Conrad

8
@ Davidvidon - baik ya. pada dasarnya beastiality di pihaknya ....
Batman

Jawaban:



17

Python 3 , 26 byte

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

Cobalah online!
Input adalah daftar dengan kedua usia


Punya sama sebelum saya membaca jawaban yang ada. +1
ElPedro

Tampaknya Anda benar-benar dapat menganggap tuple di mana selalu (lebih muda, lebih tua) - hanya bertanya OP - bertanya-tanya apa yang akan dia katakan.
rm-vanda

@ rm-vanda saya bertanya sebelumnya, Anda tidak dapat berasumsi
Stephen

15

05AB1E , 8 6 byte

;7+R‹Z

Cobalah online! atau Coba semua tes

         # 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
Sebagai seorang programmer C saya setuju bahwa 2 adalah benar.
gmatht

@ gmatht Ini harus selalu mengembalikan 0 atau 1, tidak pernah 2.
Riley

4
[13,13] dua kali lipat menyeramkan.
gmatht

1
@ gmatht Saya kira itu akan menjadi dua kali lipat. Saya tidak memikirkan angka sekecil itu. Itu masih benar.
Riley

@Riley 2tidak benar, lihat ini .
Okx

13

Gerbang NAND, 551

Kalkulator creepiness 16-bit Dibuat dengan Logisim

Prinsip yang sama dengan jawaban saya yang lain , tetapi membutuhkan input yang ditandatangani 2-byte, sehingga dapat ditangani 47, 10000. Bekerja untuk SEMUA kasus uji!

Ini tidak optimal untuk kasus uji yang diberikan, karena 10.000 dapat dinyatakan dengan hanya 15 dari 16 bit, tetapi bekerja untuk segala usia dalam kisaran [-32768, 32768). Perhatikan bahwa segala usia negatif akan kembali 1.

Input di sebelah kiri (tanpa urutan tertentu, 1-bit di atas). Output di kanan bawah.


10

Gerbang NAND, 274 262

Asli:

Lebih baik: Dibuat dengan Logisim

Ini mengambil dua input di sebelah kiri sebagai integer bertanda 1-byte, dengan 1-bit di bagian atas. Output ada di kiri bawah; kebenaran dan kepalsuan di sini harus jelas.

Berfungsi untuk semua kasus uji kecuali 47, 10000, jadi saya kira ini secara teknis bukan jawaban yang valid. Namun, orang tertua pada catatan (dapat diandalkan) adalah 122, jadi 8 bit (maks 127) akan bekerja untuk setiap skenario yang pernah ada hingga saat ini. Saya akan memposting jawaban baru (atau saya harus mengedit yang ini?) Ketika saya menyelesaikan versi 16-bit.

Versi 16-bit selesai!

Anda akan melihat beberapa bagian vertikal dari rangkaian. Yang pertama (dari kiri) menentukan input mana yang lebih besar. Dua berikutnya adalah multiplexer, mengurutkan input. Saya kemudian menambahkan 11111001(-7) ke yang lebih rendah di bagian keempat, dan saya menyimpulkan dengan membandingkan dua kali ini dengan input yang lebih besar. Jika kurang, hubungan itu menyeramkan. Karena saya menggeser bit menjadi dua kali lipat, saya harus memperhitungkan bit yang tidak digunakan lesser-7. Jika ini adalah 1, maka lesser-7negatif, dan yang lebih muda dari keduanya tidak lebih dari enam. Mengerikan. Saya selesai dengan gerbang OR, jadi jika tes creepiness kembali 1, seluruh rangkaian tidak.

Jika Anda melihat dekat, Anda akan melihat bahwa saya menggunakan tujuh satu konstan s (hardcoding 11111011dan trailing 0). Saya melakukan ini karena Logisim membutuhkan setidaknya satu nilai masuk untuk gerbang logika untuk menghasilkan output. Namun, setiap kali konstanta digunakan, dua gerbang NAND memastikan 1nilai terlepas dari konstanta.

-12 gerbang berkat saya !


Memperhatikan optimasi yang jelas. Jika Anda menunjukkannya sebelum saya edit, saya akan tetap memuji Anda!
Khuldraeseth na'Barya

9

C #, 22 byte

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

1
Saya tidak banyak programmer C #, tetapi apakah titik koma akhir diperlukan sebagai bagian dari fungsi?
Olivier Grégoire

1
@ OlivierGrégoire Itu hanya sintaks yang tidak valid jika dihilangkan; ini adalah fungsi anonim
cat

8

C, 29 byte

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

Bagaimana itu bekerja:

  • #define f(a,b)mendefinisikan fungsi makro fyang mengambil dua argumen yang tidak diketik.
  • a/2+7>b memeriksa apakah usia pertama dibagi dua plus tujuh lebih besar dari usia kedua.
  • b/2+7>a memeriksa apakah usia kedua dibagi dua ditambah tujuh lebih besar dari usia pertama.
  • Jika salah satu dari nilai-nilai di atas adalah benar, kembalikan 1 (menyeramkan). Jika tidak, kembalikan 0 (tidak menyeramkan).

Cobalah online!


Anda harus membalik perbandingan, itu harus seperti >btidak<b
Khaled.K

Mengutip "menjadi usia minimum" berarti Anda harus memeriksa apakah age >= min, juga Anda perlu DAN bukannya ATAU, karena kedua belah pihak harus memuaskan agar tidak menyeramkan, test case "47, 10000 - Creepy"
Khaled.K

oke saya sudah memperbaiki kesalahan, tetapi logikanya salah, itu kembali benar, tio.run
Khaled.K

1
@Tidak nggak.
MD XF

1
Cheers, terima kasih untuk tautannya
Tas

7

JavaScript (ES6), 21 byte

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

Mengembalikan 0 karena tidak menyeramkan, 1 untuk menyeramkan.

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


Simpan satu byte dengan currying: a=>b=>alih-alih (a,b)=>, panggil dengan f(40)(40).
Stephen

@StephenS, terima kasih, pelajari sesuatu yang baru!
Rick Hitchcock

Tidak masalah, saya mempelajarinya ketika seseorang mengatakan hal yang sama kepada saya :) itu hanya bekerja dengan dua parameter, setelah itu tidak sepadan.
Stephen


5

Retina , 20 byte

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

Cobalah online!

Input tidak digunakan dengan umpan baris antara dua angka. Outputnya 0(tidak menyeramkan) atau 1(menyeramkan).

Penjelasan

O`.+

Sortir kedua angka, jadi kita tahu bahwa yang lebih besar adalah yang kedua.

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

Sebut usia yang lebih kecil adan usia yang lebih besar b. Kami pertama-tama menangkap a-7dalam grup 1. Kemudian kita mencoba untuk mencocokkan 2*(a-7)+1di b, yang berarti b >= 2*(a-7)+1atau b >= 2*(a-7)atau b/2+7 > ayang merupakan kriteria untuk hubungan menyeramkan.


5

TI-Basic, 20 10 9 byte

max(2Ans<14+max(Ans

-10 byte dengan menggunakan daftar dan bagian dari saran Timtech

-1 byte menggunakan saran lirtosiast

Dibawa dalam daftar dua zaman, "{40,42}: prgmNAME"

Mengembalikan 1 untuk 'menyeramkan' dan 0 untuk 'tidak menyeramkan'.


Apakah TI-BASIC secara otomatis menutup tanda kurung pada simbol pengujian ( < <= = != >= >)?
Zacharý

@ Zacharý Tidak, TI-Basic hanya menutup tanda kurung di akhir baris atau titik dua.
pizzapants184

Oh, wah, aku lupa bahwa inputnya diambil sebagai daftar angka!
Zacharý

4

GNU APL 1.2, 23 byte

Menentukan fungsi yang mengambil dua argumen dan mencetak 1 jika menyeramkan, 0 jika tidak.

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

Penjelasan

memulai dan mengakhiri fungsi
A f Badalah tajuk fungsi; fungsi dinamai fdan mengambil dua argumen, Adan B(fungsi dalam APL dapat bersifat monadik - mengambil satu argumen - atau diad - mengambil dua argumen)
A⌊Badalah min(A,B)dan A⌈Bsedang max(A,B)
APL dievaluasi dari kanan ke kiri, sehingga tanda kurung diperlukan untuk memastikan prioritas yang tepat.

Operator lain cukup jelas.

Kode mungkin bisa golf, saya masih baru untuk kode-golf.


1
Selamat datang di situs ini!
OldBunny2800

Wow, bagus, GNU APL, belum melihat itu dalam beberapa saat.
Zacharý

Juga, dimungkinkan untuk mengambil argumen sebagai daftar: f Xlalu (⌊/X)<7+.5×⌈/X. IIRC Anda dapat menghapus baris baru antara baris kedua dan ketiga.
Zacharý

@ Zacharý Ya, lambdas anonim dimungkinkan. Mereka tidak didukung oleh versi GNU APL ini dan yang lebih baru tidak dapat dikompilasi di Mac. Beberapa jawaban saya yang lain menggunakan APL 1.7 karena saya mengujinya di Ubuntu. Saya belum pernah menggunakan lambdas (mungkin memperbaikinya nanti) karena saya masih cukup baru untuk APL.
Arc676

Coba ngn-apl. Ini open-source seperti GNU APL, tetapi sejujurnya lebih baik.
Zacharý

4

Python 3, 74 45 byte

Golf Kode Pertama, mungkin mengerikan.

Pengurangan 29 byte oleh @Phoenix

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

Hai, pastikan untuk memformat kode Anda dengan benar menggunakan sistem penurunan harga.
Leo

jangan khawatir, seseorang mengalahkan saya untuk itu, memperbaikinya meskipun
KuanHulio

Anda dapat menyingkirkan beberapa ruang di sana :)
Beta Decay

Juga, lambda a,b:0 if(a/2)+7>b or(b/2)+7>a else 1harus bekerja dan lebih pendek.
Pavel

1
lambda a,b:a/2+7>b or b/2+7>a. Meninggalkan beban orang-orang sial 1dan 0s dan merangkul kekuatan True/ False!
Value Ink

3

JavaScript (ES6), 27 byte

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

Tanpa currying (suka panggilan f(a,b)alih - alih f(a)(b))

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

Jika b > a, tukar parameter dan coba lagi. Kalau tidak, periksa. Currying tidak menyimpan byte karena panggilan rekursif.

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 byte

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

Sama sekali tidak asli.

Pengujian

Cobalah 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 untuk menyebutkan " Sama sekali tidak asli. ". Hampir tidak ada orang lain yang melakukannya, sementara mereka hampir semuanya sama. Dan saya mengambil kebebasan untuk menambahkan tautan TIO dari kode pengujian Anda. Tidak yakin mengapa Anda selalu menambahkan kode uji, tetapi bukan tautan TIO ? .. :)
Kevin Cruijssen

1
Kevin terima kasih! Saya terkadang menambahkan satu, kadang tidak. Itu tergantung pada apakah IDE saya terbuka atau tertutup. Sesederhana itu! : P Juga, saya menunjukkan kode tes agar orang mengerti apa yang membuat lambda ini valid. :)
Olivier Grégoire

3

Python 3, 31 byte

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

Tidak jauh lebih pendek dari kiriman python lainnya, tetapi saya menemukan cara yang sedikit berbeda untuk memeriksa creepiness. Saya perhatikan bahwa perbedaan yang dapat diterima antara usia sama dengan min - 14. Ini mengikuti dari aljabar menyusun ulang rumus.

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

Ini biarkan saya menyelesaikan tanpa membutuhkan dua konstanta, dan juga tanpa perlu menggunakan max dan min, alih-alih menggunakan abs (ab). Dari perspektif golf saya hanya mendapat satu byte kurang dari solusi @ nocturama, tetapi saya menggunakan formula yang sedikit berbeda untuk melakukannya.


Tentunya ini gagal pada [37,53] (bukan di dalam test suite tetapi) dalam semangat (x / 2) +7 fairway ini
Alexx Roche

@AlexxRoche Tidak, ketika diberikan [37,53] sebagai [a, b], perhitungan harus menjadi abs(37 - 53) > min(37, 53) - 14 = abs(-16) > 37 - 14 = 16 > 23 = False Ini adalah jawaban yang benar, karena menurut (x / 2) + 7, usia minimum untuk 53 adalah53/2 + 7 = 26.5 + 7 = 33.5
Delya Erricson

3

Excel, 26 24 Bytes

Rumus sel yang mengambil input sebagai angka dari rentang sel A1:B1dan menghasilkan nilai boolean yang mewakili creepiness ke sel rumus

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

Versi Lama, 26 Bytes

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

2

TI-Basic, 10 9 10 byte

2min(Ans)-14≤max(Ans

Daftar input dari Ans, keluaran 1jika "menyeramkan" atau 0sebaliknya.


2

Matematika , 16 byte

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

Cobalah online!

-2 byte terima kasih kepada @GregMartin

Benar untuk tidak menyeramkan, salah untuk menyeramkan.

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

Simpan 2byte dengan mengambil usia sebagai daftar:Max@#/2+7<Min@#&
ngenisis

2

SAS, 77 byte

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

2

Röda , 16 byte

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

Cobalah online!

Ini adalah fungsi anonim yang mengambil input sebagai dua literal (bukan array) dari aliran input.

Penjelasan

{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 byte

Tidak dapat berkomentar, tapi saya mendapat jawaban yang sedikit lebih pendek daripada solusi Python 3 lainnya:

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

-5 terima kasih kepada @Cyoce!


Anda dapat menghapus ruang dilambda *a
Cyoce

1

Fourier, 37 byte

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

Cobalah di FourIDE!

Mengambil dua angka sebagai input. Will golf nanti.


Tidak perlu mengeluarkan string seperti itu, bisa benar atau salah
Leo

Golf yang bagus. Itu tadi cepat.
MD XF


1

Japt , 11 byte

Pengembalian trueuntuk "menyeramkan" dan falseuntuk tidak.

wV /2+7>UmV

Cobalah online


Penjelasan

      :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 byte

<.<7+2%~>.

Output 1untuk tidak menyeramkan, 0untuk menyeramkan

Penjelasan

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

1

J-uby , 25 byte

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

Sebut seperti f^[80,32]. Memberi trueuntuk tidak menyeramkan, falseuntuk menyeramkan.

Penjelasan

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

Ini adalah bahasa yang indah. Saya menghabiskan waktu yang lama mencoba mencapai tujuan yang sama dengan Ruby (saya menyebutnya "Blurb"), tetapi bersandar pada method_missingmenyebabkan terlalu banyak kerumitan. Pendekatan ini bersih dan elegan. Selamat!
Jordan

@ Jordan, terima kasih! Saya tidak dapat mengambil semua pujian, karena ini sangat terinspirasi oleh J (karena itu namanya). Saya terbuka untuk saran dari sesama programmer Ruby jika Anda punya.
Cyoce

@ Jordan, Anda harus melihat beberapa jawaban J-uby yang lebih kompleks. Mereka adalah sesuatu.
Cyoce

1

AWK , 26 byte

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

Cobalah online!

Output 1 untuk "Creepy" dan 0 untuk "Not Creepy". Dapat menghemat 3 byte jika tidak ada output yang dapat dianggap sebagai nilai palsu, melalui:

$0=$1/2+7>$2||$2/2+7>$1
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.