Là mối quan hệ này đáng sợ?


73

Theo truyện tranh XKCD này , có một công thức để xác định xem khoảng cách tuổi tác trong mối quan hệ có "đáng sợ" hay không. Công thức này được định nghĩa là:

(Age/2) + 7

là độ tuổi tối thiểu của những người bạn có thể hẹn hò.

Do đó, một mối quan hệ là đáng sợ nếu một trong những người trong mối quan hệ nói trên trẻ hơn tuổi tối thiểu của người kia.

Với độ tuổi của hai người, bạn có thể đưa ra liệu mối quan hệ đó có đáng sợ hay không?

Quy tắc

  1. Chương trình của bạn nên lấy hai số nguyên làm đầu vào, tuổi của cả hai người trong mối quan hệ. Đây có thể được thực hiện trong bất kỳ định dạng hợp lý.

  2. Chương trình của bạn sau đó phải xuất ra một giá trị trung thực hoặc giả mạo mô tả xem mối quan hệ đó có "đáng sợ" hay không (Truthy = Creepy).

  3. Sơ hở tiêu chuẩn không được phép.
  4. Câu đố này là Code Golf, vì vậy câu trả lời với mã nguồn ngắn nhất tính bằng byte sẽ thắng

Các trường hợp thử nghiệm

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
Nên age/2làm tròn như thế nào? Có lẽ lên nếu một nửa chính xác được coi là tối thiểu? 17,21sẽ làm một trường hợp thử nghiệm tốt.
Martin Ender

4
@MartinEnder Giá trị là tối thiểu, vì vậy đừng làm tròn tất cả. Nó không phải là một số nguyên.
Leo

81
Bạn cũng có thể thêm 13, 13 - Creepy.
Greg Martin

12
47, 10000 là một ... sự kết hợp thú vị. Tôi cũng muốn chỉ ra rằng theo công thức này, thật đáng sợ cho Doctor Who hẹn hò với bất kỳ con người nào.
David Conrad

8
@DavidConrad - vâng. về cơ bản là sự dã man của nó ....
Batman

Câu trả lời:



17

Python 3 , 26 byte

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

Hãy thử trực tuyến!
Đầu vào là một danh sách với cả hai lứa tuổi


Có giống như vậy trước khi tôi đọc câu trả lời hiện có. +1
ElPedro

Có vẻ như bạn thực sự có thể giả sử một tuple nơi nó luôn luôn (trẻ hơn, già hơn) - chỉ cần hỏi OP - tự hỏi anh ấy sẽ nói gì.
rm-vanda

@ rm-vanda Tôi đã hỏi trước đó, bạn không thể giả sử
Stephen

15

05AB1E , 8 6 byte

;7+R‹Z

Hãy thử trực tuyến! hoặc Thử tất cả các bài kiểm tra

         # 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
Là một lập trình viên C, tôi đồng ý rằng 2 là sự thật.
gmatht

@gmatht Điều này sẽ luôn trả về 0 hoặc 1, không bao giờ 2.
Riley

4
[13,13] là đáng sợ gấp đôi.
gmatht

1
@gmatht Tôi đoán đó sẽ là gấp đôi. Tôi đã không nghĩ về những con số nhỏ. Mặc dù vậy, nó vẫn là sự thật.
Riley

@Riley 2không phải là sự thật, xem này .
Okx

13

Cổng NAND, 551

Máy tính creepiness 16 bit Được tạo bằng Logisim

Nguyên tắc tương tự như câu trả lời khác của tôi , nhưng có các đầu vào được ký 2 byte, vì vậy nó có thể xử lý 47, 10000. Hoạt động cho TẤT CẢ các trường hợp thử nghiệm!

Điều này không tối ưu cho các trường hợp thử nghiệm nhất định, vì 10000 có thể được biểu thị chỉ với 15 trong số 16 bit, nhưng nó hoạt động cho mọi lứa tuổi trong phạm vi [-32768, 32768). Lưu ý rằng bất kỳ tuổi tiêu cực sẽ trở lại 1.

Đầu vào bên trái (không có thứ tự cụ thể, 1 bit trên đầu). Đầu ra ở phía dưới bên phải.


10

Cổng NAND, 274 262

Nguyên:

Tốt hơn: Được tạo bằng Logisim

Điều này có hai đầu vào bên trái là số nguyên có chữ ký 1 byte, với 1 bit ở trên cùng. Đầu ra ở phía dưới bên trái; sự thật và falsey ở đây nên rõ ràng.

Hoạt động cho tất cả các trường hợp thử nghiệm ngoại trừ 47, 10000, vì vậy tôi đoán đây không phải là câu trả lời hợp lệ. Tuy nhiên, người lớn tuổi nhất trong hồ sơ (đáng tin cậy) là 122, vì vậy 8 bit (tối đa 127) sẽ hoạt động cho mọi kịch bản có thể xảy ra cho đến thời điểm này. Tôi sẽ đăng câu trả lời mới (hoặc tôi nên chỉnh sửa câu trả lời này?) Khi tôi hoàn thành phiên bản 16 bit.

Phiên bản 16 bit đã hoàn tất!

Bạn sẽ nhận thấy một số phần dọc của mạch. Cái đầu tiên (từ bên trái) xác định đầu vào nào lớn hơn. Hai cái tiếp theo là bộ ghép kênh, sắp xếp các đầu vào. Sau đó tôi thêm 11111001(-7) vào phần nhỏ hơn trong phần thứ tư và tôi kết luận bằng cách so sánh hai lần này với đầu vào lớn hơn. Nếu nó ít hơn, mối quan hệ là đáng sợ. Vì tôi thay đổi các bit thành gấp đôi, tôi phải tính đến bit không sử dụng lesser-7. Nếu đây là một 1, thì lesser-7là âm tính, và người trẻ hơn trong hai người không quá sáu tuổi. Rùng mình. Tôi kết thúc với một cổng OR, vì vậy nếu kiểm tra creepiness trở lại 1, toàn bộ mạch sẽ thực hiện.

Nếu bạn nhìn kỹ, bạn sẽ thấy rằng tôi đã sử dụng Bảy một hằng số s (thể xác định rõ 11111011và dấu 0). Tôi đã làm điều này bởi vì Logisim yêu cầu ít nhất một giá trị đi vào một cổng logic để tạo ra một đầu ra. Tuy nhiên, mỗi lần sử dụng một hằng số, hai cổng NAND đảm bảo một 1giá trị bất kể hằng số.

-12 cổng cảm ơn tôi !


Nhận thấy một tối ưu hóa rõ ràng. Nếu bạn chỉ ra trước khi tôi chỉnh sửa, tôi vẫn sẽ ghi có cho bạn!
Khuldraeseth na'Barya

9

C #, 22 byte

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

1
Tôi không phải là một lập trình viên C # nhiều, nhưng dấu chấm phẩy cuối cùng được yêu cầu như là một phần của chức năng?
Olivier Grégoire

1
@ OlivierGrégoire Đó chỉ là cú pháp không hợp lệ nếu nó bị bỏ qua; đây là một chức năng ẩn danh
con mèo

8

C, 29 byte

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

Làm thế nào nó hoạt động:

  • #define f(a,b)định nghĩa một hàm macro fcó hai đối số được đánh dấu.
  • a/2+7>b kiểm tra xem tuổi thứ nhất chia cho hai cộng bảy có lớn hơn tuổi thứ hai không.
  • b/2+7>a kiểm tra xem tuổi thứ hai chia cho hai cộng bảy có lớn hơn tuổi thứ nhất không.
  • Nếu một trong các giá trị trên là đúng, trả về 1 (đáng sợ). Nếu không, trả về 0 (không đáng sợ).

Hãy thử trực tuyến!


bạn nên lật so sánh, nó sẽ giống như >bkhông<b
Khaled.K

Trích dẫn "là độ tuổi tối thiểu" có nghĩa là bạn phải kiểm tra xem age >= min, bạn cũng cần VÀ thay vì OR, vì cả hai bên phải thỏa mãn để không bị rùng rợn, trường hợp thử nghiệm "47, 10000 - Creepy"
Khaled.K

Được rồi, tôi đã sửa lỗi, nhưng logic sai, nó trả về đúng, tio.run
Khaled.K

1
@ Không có .
MD XF

1
Chúc mừng, cảm ơn vì liên kết
TAS

7

JavaScript (ES6), 21 byte

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

Trả về 0 cho không đáng sợ, 1 cho đáng sợ.

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


Lưu một byte với currying: a=>b=>thay vì (a,b)=>, gọi bằng f(40)(40).
Stephen

@StephenS, cảm ơn bạn, đã học được điều gì đó mới!
Rick Hitchcock

Không có vấn đề gì, tôi đã học được nó khi ai đó nói với tôi điều tương tự :) nó chỉ hoạt động với hai tham số, sau đó nó không có giá trị.
Stephen


5

Võng mạc , 20 byte

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

Hãy thử trực tuyến!

Đầu vào là đơn nhất với một dòng cấp giữa hai số. Đầu ra là 0(không đáng sợ) hoặc 1(đáng sợ).

Giải trình

O`.+

Sắp xếp hai số, để chúng ta biết rằng số lớn hơn là thứ hai.

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

Gọi tuổi nhỏ hơn avà tuổi lớn hơn b. Chúng tôi lần đầu tiên chụp a-7trong nhóm 1. Sau đó, chúng tôi cố gắng để phù hợp 2*(a-7)+1trong b, có nghĩa là b >= 2*(a-7)+1hay b >= 2*(a-7)hay b/2+7 > ađó là tiêu chí cho một mối quan hệ đáng sợ.


5

TI-Basic, 20 10 9 byte

max(2Ans<14+max(Ans

-10 byte bằng cách sử dụng danh sách và một phần đề xuất của Timtech

-1 byte sử dụng đề xuất của lirtosiast

Có một danh sách gồm hai lứa tuổi, "{40,42}: prgmNAME"

Trả về 1 cho 'đáng sợ' và 0 cho 'không đáng sợ'.


TI-BASIC có tự động đóng dấu ngoặc đơn tại ký hiệu thử nghiệm ( < <= = != >= >) không?
Zacharý

@ Zacharý Không, TI-Basic chỉ đóng dấu ngoặc đơn ở cuối dòng hoặc dấu hai chấm.
pizzapants184

Ồ, tôi đã quên rằng đầu vào đang được lấy làm danh sách các số!
Zacharý

4

GNU APL 1.2, 23 byte

Xác định hàm có hai đối số và in 1 nếu đáng sợ, 0 nếu không.

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

Giải trình

bắt đầu và kết thúc chức năng
A f Blà tiêu đề chức năng; chức năng được đặt tên fvà nhận hai đối số, AB(chức năng trong APL có thể monadic - chụp một đối số - hoặc cặp đôi - lấy hai tham số)
A⌊Bmin(A,B)A⌈Bđược max(A,B)
APL được đánh giá từ phải sang trái, vì vậy ngoặc là cần thiết để đảm bảo ưu tiên thích hợp

Các toán tử khác là tự giải thích.

Mã có thể là golf, tôi vẫn chưa quen với golf-code.


1
Chào mừng đến với trang web!
OldBunny2800

Wow, thật tuyệt, GNU APL, đã không thấy điều đó trong một thời gian.
Zacharý

Ngoài ra, có thể lấy các đối số làm danh sách: f Xsau đó (⌊/X)<7+.5×⌈/X. IIRC bạn có thể xóa dòng mới giữa dòng thứ hai và thứ ba.
Zacharý

@ Zacharý Có, lambdas ẩn danh là có thể. Chúng không được hỗ trợ bởi phiên bản GNU APL này và phiên bản mới hơn không biên dịch trên Mac. Một số câu trả lời khác của tôi sử dụng APL 1.7 vì tôi đã kiểm tra chúng trên Ubuntu. Tôi chưa sử dụng lambdas (có thể sửa chúng sau) vì tôi vẫn còn khá mới với APL.
Arc676

Hãy thử ngn-apl. Nó là nguồn mở như GNU APL, nhưng thật ra nó tốt hơn.
Zacharý

4

Python 3, 74 45 byte

Golf Code đầu tiên, có lẽ là khủng khiếp.

Giảm 29 byte bởi @Phoenix

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

Xin chào, hãy chắc chắn định dạng đúng mã của bạn bằng hệ thống đánh dấu.
Leo

đừng lo lắng, ai đó đã đánh bại tôi, mặc dù vậy, hãy sửa nó đi
KuanHulio

Bạn có thể thoát khỏi một số không gian ở đó :)
Beta Decay

Ngoài ra, lambda a,b:0 if(a/2)+7>b or(b/2)+7>a else 1nên làm việc và ngắn hơn rất nhiều.
Pavel

1
lambda a,b:a/2+7>b or b/2+7>a. Từ bỏ gánh nặng của những pesky 1s và 0s và nắm lấy sức mạnh của True/ False!
Mực giá trị

3

JavaScript (ES6), 27 byte

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

Không có cà ri (gọi như f(a,b)thay vì f(a)(b))

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

Nếu b > a, trao đổi tham số và thử lại. Nếu không, hãy kiểm tra. Currying không lưu bất kỳ byte nào vì cuộc gọi đệ quy.

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

Hoàn toàn không phải bản gốc.

Kiểm tra

Hãy thử trực tuyến!

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 khi đề cập " Hoàn toàn không phải bản gốc. ". Hầu như không ai khác làm, trong khi họ gần như giống nhau. Và tôi đã tự do thêm một liên kết TIO từ mã kiểm tra của bạn. Không chắc chắn lý do tại sao bạn luôn thêm mã kiểm tra, nhưng không phải là liên kết TIO ? .. :)
Kevin Cruijssen

1
Cảm ơn Kevin! Tôi đôi khi làm thêm một, đôi khi không. Nó phụ thuộc vào việc tôi mở IDE hay đóng. Nó đơn giản như vậy! : P Ngoài ra, tôi hiển thị mã kiểm tra để mọi người hiểu điều gì làm cho lambda này hợp lệ. :)
Olivier Grégoire

3

Python 3, 31 byte

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

Không ngắn hơn nhiều so với các bài nộp trăn khác, nhưng tôi đã tìm thấy một cách hơi khác để kiểm tra sự đáng sợ. Tôi nhận thấy rằng sự khác biệt chấp nhận được giữa các độ tuổi bằng min - 14. Điều này xuất phát từ việc sắp xếp lại đại số công thức.

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

Điều này cho phép tôi giải quyết mà không cần hai hằng số, và cũng không cần sử dụng cả max và min, thay vào đó sử dụng abs (ab). Từ góc độ chơi gôn, tôi chỉ nhận được một byte ít hơn giải pháp của @ nocturama, nhưng tôi đã sử dụng một công thức hơi khác để làm điều đó.


Chắc chắn điều này thất bại trên [37,53] (không phải trong bộ thử nghiệm nhưng) trong tinh thần (x / 2) +7 của fairway này
Alexx Roche

@AlexxRoche Không, khi được đưa ra [37,53] là [a, b], phép tính sẽ trở thành abs(37 - 53) > min(37, 53) - 14 = abs(-16) > 37 - 14 = 16 > 23 = False Đây là câu trả lời đúng, vì theo (x / 2) + 7, độ tuổi tối thiểu cho 53 là53/2 + 7 = 26.5 + 7 = 33.5
Delya Erricson

3

Excel, 26 24 byte

Công thức ô lấy đầu vào là số từ phạm vi ô A1:B1và xuất giá trị boolean biểu thị sự đáng sợ cho ô công thức

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

Phiên bản cũ, 26 byte

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

2

TI-Basic, 10 9 10 byte

2min(Ans)-14≤max(Ans

Liệt kê đầu vào từ Ans, đầu ra 1nếu "đáng sợ" hoặc 0cách khác.


2

Toán học , 16 byte

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

Hãy thử trực tuyến!

-2 byte nhờ @GregMartin

Đúng cho không đáng sợ, sai cho đáng sợ.

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

Lưu 2byte bằng cách lấy độ tuổi làm danh sách: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]}

Hãy thử trực tuyến!

Đây là một hàm ẩn danh nhận đầu vào là hai chữ (không phải là một mảng) từ luồng đầu vào.

Giải trình

{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

Không thể nhận xét, nhưng tôi nhận được câu trả lời ngắn hơn một chút so với giải pháp Python 3 khác:

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

-5 cảm ơn @Cyoce!


bạn có thể xóa khoảng trống tronglambda *a
Cyoce

1

Fourier, 37 byte

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

Hãy thử nó trên FourIDE!

Lấy hai số làm đầu vào. Sẽ chơi golf sau.


Không cần phải tạo ra một chuỗi như thế, có thể là sự thật hoặc giả mạo
Leo

Sân golf đẹp. Nó thật nhanh.
MD XF


1

Japt , 11 byte

Trả về truecho "đáng sợ" vàfalse không.

wV /2+7>UmV

Dùng thử trực tuyến


Giải trình

      :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%~>.

Đầu ra 1cho không đáng sợ,0 cho đáng sợ

Giải trình

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

1

J-uby , 25 byte

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

Gọi như thế f^[80,32]. Cung cấp truecho không đáng sợ,false cho đáng sợ.

Giải trình

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

Đây là một ngôn ngữ đẹp. Tôi đã dành một thời gian dài để cố gắng hoàn thành các kết thúc tương tự với Ruby (tôi gọi nó là "Blurb"), nhưng dựa nhiều vào method_missingdẫn đến quá nhiều phức tạp. Cách tiếp cận này là sạch sẽ và thanh lịch. Chúc mừng!
Jordan

@Jordan cảm ơn! Tôi không thể lấy tất cả tín dụng, vì điều này được truyền cảm hứng rất nhiều bởi J (do đó là tên). Tôi sẵn sàng nhận đề xuất từ ​​một lập trình viên Ruby nếu bạn có.
Cyoce

@Jordan bạn sẽ thấy một số câu trả lời J-uby phức tạp khác. Chúng khá là một cái gì đó.
Cyoce

1

AWK , 26 byte

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

Hãy thử trực tuyến!

Đầu ra 1 cho "Creepy" và 0 cho "Không đáng sợ". Có thể lưu 3 byte nếu không có đầu ra có thể được coi là giá trị giả, thông qua:

$0=$1/2+7>$2||$2/2+7>$1
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.