Bu ilişki tüyler ürpertici mi?


73

Göre bu XKCD komik , bir ilişkide yaş farkı "ürpertici" olup olmadığını belirlemek için bir formül yok. Bu formül şöyle tanımlanır:

(Age/2) + 7

Çıkabileceğiniz asgari insan yaşı.

Bu nedenle, söz konusu ilişkideki kişilerden birinin diğerinin asgari yaşından daha genç olması durumunda bir ilişki ürperticidir.

İki kişinin yaşı göz önüne alındığında, bu ilişkinin ürpertici olup olmadığını ortaya çıkarabilir misiniz?

kurallar

  1. Programınız girdi olarak iki ilişkiden iki insanın yaşı olarak alınmalıdır. Bunlar makul herhangi bir formatta alınabilir.

  2. Ardından programınız, ilişkinin "ürpertici" olup olmadığına dair asılsız bir titizlik veya sahte değer vermelidir (Truthy = Creepy).

  3. Standart boşluklara izin verilmez.
  4. Bu yapboz Code Golf, yani bayt cinsinden en kısa kaynak koduna sahip cevap kazanıyor

Test Kılıfları

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
Nasıl age/2yuvarlanmalı? Muhtemelen, tam yarısının minimum olması gerekiyorsa? 17,21iyi bir test durumu olur.
Martin Ender

4
@MartinEnder Değer minimumdur, bu nedenle hiç yuvarlama yapmayın. Bir tamsayı olmak zorunda değildir.
Leo,

81
Ayrıca ekleyebilirsiniz 13, 13 - Creepy.
Greg Martin,

12
47, 10000 ilginç bir kombinasyondur. Ayrıca, bu formüle göre, herhangi bir insanla çıkmanın Doktor Who için ürkütücü olduğunu belirtmek isterim.
David Conrad

8
@DavidConrad - iyi evet. temelde onun canavarlık ....
Batman

Yanıtlar:



17

Python 3 , 26 bayt

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

Çevrimiçi deneyin!
Giriş, her iki yaştan oluşan bir listedir


Var olan cevapları okumamdan önce de aynısını yaptım. +1
ElPedro

Görünüşe göre aslında her zaman (daha genç, daha yaşlı) - sadece OP sordu - ne söyleyeceğini merak ediyorum.
rm-vanda

@ rm-vanda Daha önce sormuştum, varsayamazsınız
Stephen

15

05AB1E , 8 6 bayt

;7+R‹Z

Çevrimiçi deneyin! veya Tüm testi dene

         # 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
Bir C programcısı olarak 2'nin gerçeğe uygun olduğuna katılıyorum.
gmatht

@gmatht Bu her zaman 0 veya 1, asla 2. dönmelidir
Riley

4
[13,13] iki kat ürpertici.
gmatht

1
@gmatht Sanırım bu çift olurdu. O kadar küçük sayıları düşünmedim. Yine de hala acımasız.
Riley,

@Riley 2truthy değil, bakın bu .
Okx,

13

NAND kapılar, 551

16 bit sürünürlük hesap makinesiLogisim ile oluşturuldu

Aynı prensip benim diğer yanıt , fakat 2 bayt işaretli girişler alır, bu yüzden işleyebilir 47, 10000. TÜM test durumları için çalışıyor!

Bu, 10000 16 bitin sadece 15'i ile ifade edilebildiği için verilen test durumları için uygun değildir, ancak aralıktaki herhangi bir yaş için işe yarar [-32768, 32768). Herhangi bir olumsuz yaşın geri döneceğini unutmayın 1.

Soldaki girişler (belirli bir düzen yok, üstte 1 bit). Çıktı sağ altta.


10

NAND kapılar, 274 262

Orijinal:

Daha iyi: Logisim ile düzenlendi

Bu, solda, 1-bit en üstünde 1-bit işaretli tamsayılar olarak iki girdi alır. Çıktı sol altta; Burada gerçeği ve falsey açık olmalıdır.

Dışında tüm test durumları için çalışıyor 47, 10000, bu yüzden teknik olarak geçerli bir cevap değil sanırım. Bununla birlikte, (güvenilir) kayıttaki en yaşlı kişi 122 idi, bu yüzden bu noktada mümkün olan her senaryo için 8 bit (en fazla 127) çalışacak. 16 bit sürümünü tamamladığımda yeni bir cevap göndereceğim (veya bunu değiştirmeli miyim?).

16-bit sürümü yapıldı!

Devrenin bazı dikey bölümlerini göreceksiniz. İlki (soldan) hangi girişin daha büyük olduğunu belirler. Sonraki iki girişleri sıralayan çoklayıcılar. Daha sonra 11111001dördüncü bölümde daha küçük olana (-7) ekliyorum ve bunu iki kez daha büyük girdiyle karşılaştırarak sonuçlandırıyorum. Daha az ise, ilişki ürpertici. Bitleri ikiye katladığımdan, kullanılmayan bitini dikkate almalıyım lesser-7. Eğer bu bir 1, o lesser-7zaman olumsuzdur ve ikisinden daha genç olan altı yaşından büyük değildir. Ürpertici. Bir OR geçidiyle bitirdim, yani ya sürünme testi geri gelirse 1, tüm devre yapar.

Eğer yakından bakarsanız, kullandığım olduğunu göreceksiniz yedi değişmeyen tek s (hardcoding 11111011ve sondaki 0). Bunu yaptım çünkü Logisim bir mantık geçidi için bir çıktı üretmek için en az bir değer giriyor. Bununla birlikte, bir sabit her kullanıldığında, iki NAND geçiti, sabitten 1bağımsız olarak bir değer sağlar.

-12 kapı bana teşekkürler !


Açık bir optimizasyon fark ettim. Düzenlemeden önce bunu işaret ederseniz, yine de size kredi vereceğim!
Khuldraeseth na'Barya

9

C #, 22 bayt

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

1
Çok fazla C # programcısı değilim, ancak fonksiyonun bir parçası olarak son noktalı virgül gerekli midir?
Olivier Grégoire

1
@ OlivierGrégoire İhmal edilirse, sadece geçersiz sözdizimi; bu anonim bir işlevdir
kedi

8

C, 29 bayt

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

Nasıl çalışır:

  • #define f(a,b)fYazılmamış iki argüman alan bir makro fonksiyonunu tanımlar .
  • a/2+7>b ilk yaşın iki artı yedi'ye bölünmesiyle ikinci yaştan büyük olup olmadığını kontrol eder.
  • b/2+7>a ikinci yaşın iki artı yedi ile bölünmesinin ilk yaştan büyük olup olmadığını kontrol eder.
  • Yukarıdaki değerlerden herhangi biri doğruysa, 1 değerini döndürün (ürpertici). Aksi takdirde, 0 değerini döndürün (ürpertici değil).

Çevrimiçi deneyin!


Eğer karşılaştırma çevirmek gerekir, bu gibi olmalı >bdeğil<b
Khaled.K

"Asgari yaş olmak" alıntı age >= min, her ikisinin de ürkütücü olmamasını sağlamak için tatmin etmek zorunda kaldığından VEYA yerine ihtiyacınız olup olmadığını kontrol etmeniz gerektiği anlamına gelir , test vakası "47, 10000 - Ürpertici"
Khaled.K

tamam Hatayı düzelttim, ancak mantık yanlış, doğru dönüyor, tio.run
Khaled.K


1
Şerefe, bağlantı için teşekkürler
Tas

7

JavaScript (ES6), 21 bayt

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

Ürpertici olmayanlar için 0, ürpertici olanlar için 1 döndürür.

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


Kıvrımlı bir bayt kaydedin: a=>b=>bunun yerine (a,b)=>çağrı yapın f(40)(40).
Stephen

@StephenS, teşekkür ederim, yeni bir şey öğrendim!
Rick Hitchcock

Hiç sorun değil, biri bana aynı şeyi söylediğinde öğrendim :) ancak iki parametreyle çalışıyor, ondan sonra değmez.
Stephen


5

Retina , 20 bayt

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

Çevrimiçi deneyin!

Giriş, iki sayı arasında bir satır besleme ile aynı düzeydedir. Çıktı 0(ürpertici değil) veya 1(ürpertici).

açıklama

O`.+

İki sayıyı sıralayın, böylece daha büyük olanın ikinci olduğunu biliyoruz.

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

Küçük yaş ave büyük yaş çağırın b. İlk önce a-7grupta yakaladık 1. Sonra maç çalışır 2*(a-7)+1yılında b, yani b >= 2*(a-7)+1ya b >= 2*(a-7)ya b/2+7 > aürpertici bir ilişki için kriter olan.


5

TI-Basic, 20 10 9 bayt

max(2Ans<14+max(Ans

Timtech'in önerisinin bir listesini ve bir bölümünü kullanarak -10 bayt

Lirtosiast önerisini kullanarak -1 bayt

"{40,42}: prgmNAME" adlı iki yaş listesinde var

'Ürpertici değil' için 1 ve 'ürpertici değil' için 0 döndürür.


TI-BASIC, test sembolünde ( < <= = != >= >) parantezleri otomatik olarak kapatır mı?
Zacharý,

@ Zacharý Hayır, TI-Basic sadece bir satır veya iki nokta üstündeki parantezleri kapatır.
pizzapants184

Oh, ne haber, girdilerin sayılar listesi olarak alındığını unuttum!
Zacharý

4

GNU APL 1.2, 23 bayt

İki argüman alan ve ürpertici ise 1, değilse 0 basan bir fonksiyon tanımlar.

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

açıklama

işlev başlar ve biter
A f Bişlev üstbilgisidir; fonksiyon olarak adlandırılır fve iki argüman alır Ave B(monadic olabilir APL içinde işlevlerini - tek bir argüman alacak - ya diyadik - iki argüman alarak)
A⌊Bolduğu min(A,B)ve A⌈Bbir max(A,B)
parantez doğru öncelik sağlanması için gerekli böylece, APL sağdan sola değerlendirilir

Diğer operatörler açıklayıcıdır.

Kod golf yapabiliyor olabilir, hala kod golf oynamak için yeniyim.


1
Siteye Hoşgeldiniz!
OldBunny2800

Vay, güzel, GNU APL, bir süredir bunu görmedim.
Zacharý

Ayrıca, argümanları bir liste olarak almak mümkündür: f Xo zaman (⌊/X)<7+.5×⌈/X. IIRC, ikinci ve üçüncü satırlar arasındaki yeni çizgiyi kaldırabilirsiniz.
Zacharý

@ Zacharý Evet, anonim lambdalar mümkündür. GNU APL'nin bu sürümü tarafından desteklenmiyorlar ve yenisi Mac'te derlenmiyor. Diğer cevaplarımdan bazıları APL 1.7 kullanıyor çünkü onları Ubuntu'da test ediyorum. Ben lambdas kullanmadım (daha sonra düzeltebilirim) çünkü hala APL için yeniyim.
Arc676

Ngn-apl'yi dene. GNU APL gibi açık kaynak kodludur, ancak tüm dürüstlükle daha iyidir.
Zacharý

4

Python 3, 74 45 bayt

First Code Golf, muhtemelen korkunç.

@Phoenix tarafından 29 byte azalma

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

Merhaba, lütfen markdown sistemini kullanarak kodunuzu doğru biçimlendirdiğinizden emin olun.
Leo,

Endişelenme, birisi beni dövdü, hasta olsa tamir et
KuanHulio

Oradaki bazı alanlardan kurtulabilirsiniz :)
Beta

Ayrıca, lambda a,b:0 if(a/2)+7>b or(b/2)+7>a else 1çalışması gerekir ve çok daha kısadır.
Pavel

1
lambda a,b:a/2+7>b or b/2+7>a. Bu sinir bozucu yükünü terk 1s ve 0s ve gücünü benimsemesi True/ ' False!
Değerli Mürekkep

3

JavaScript (ES6), 27 bayt

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

Kıvrılma yok ( f(a,b)yerine çağrı gibi f(a)(b))

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

Eğer b > a, parametreleri değiştirip tekrar deneyin. Aksi takdirde kontrol edin. Currying, özyinelemeli çağrı nedeniyle herhangi bir baytı kurtarmaz.

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 bayt

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

Kesinlikle orijinal değil.

Test yapmak

Çevrimiçi deneyin!

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
" Kesinlikle orijinal değil " derken +1 . Neredeyse hiç kimse yapmaz, neredeyse hepsi aynıdır. Test kodunuzdan bir TIO bağlantısı ekleme özgürlüğünü aldım. Neden her zaman bir test kodu eklediğinizden emin değilsiniz, ancak bir TIO-link değil ? .. :)
Kevin Cruijssen

1
Teşekkürler Kevin! Bazen bir tane ekliyorum, bazen değil. IDE'mi açık mı kapalı mı olduğuna bağlı. Bu kadar basit! : P Ayrıca insanların bu lambda'yı neyin geçerli kıldığını anlamalarını sağlamak için test kodunu gösteriyorum. :)
Olivier Grégoire

3

Python 3, 31 bayt

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

Diğer python gönderimlerinden çok daha kısa değil, ama sürüngenliği kontrol etmek için biraz farklı bir yol buldum. Yaşlar arasındaki kabul edilebilir farkın min - 14'e eşit olduğunu fark ettim. Bu formülü cebirsel olarak yeniden düzenlemekten sonra gelir.

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

Bu, iki sabite ihtiyaç duymadan ve ayrıca abs (ab) kullanmak yerine hem max hem de min kullanmaya gerek kalmadan çözmeme izin verdi. Golf perspektifinden bakıldığında, @ nocturama'nın çözümünden sadece bir bayt daha aldım, fakat bunu yapmak için biraz farklı bir formül kullandım.


Şüphesiz bu, bu adil yolun (x / 2) +7 ruhu içinde [37,53] 'te (test odasında değil ama) başarısız olur
Alexx Roche

@AlexxRoche Nope, [a, b] olarak [37,53] verildiğinde, hesaplama şöyle olmalıdır: abs(37 - 53) > min(37, 53) - 14 = abs(-16) > 37 - 14 = 16 > 23 = False (x / 2) + 7'ye göre asgari yaş 53/2 + 7 = 26.5 + 7 = 33.5
53'tür

3

Excel, 26 24 Bayt

Hücre aralığından sayılar olarak girdi alan A1:B1ve formül hücresine sürünürlüğü temsil eden bir boole değeri veren hücre formülü

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

Eski Sürüm, 26 Bayt

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

2

TI-Basic, 10 9 10 bayt

2min(Ans)-14≤max(Ans

"Ürpertici" ise ya da aksi takdirde Ansçıktıları listeler .10


2

Matematik , 16 bayt

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

Çevrimiçi deneyin!

@GregMartin sayesinde -2 bayt

Ürpertici değil için doğru, ürpertici için yanlış.

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

Kaydet 2liste olarak yaşları alarak bayt:Max@#/2+7<Min@#&
ngenisis

2

SAS, 77 bayt

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

2

Röda , 16 bayt

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

Çevrimiçi deneyin!

Bu, girişi girdi akışından iki hazır bilgi (dizi değil) olarak alan anonim bir işlevdir.

açıklama

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

Yorum yapamıyorum, ancak diğer Python 3 çözümünden biraz daha kısa bir cevap aldım:

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

-5 @Cyoce!


içinde boşluk kaldırabilirsinizlambda *a
Cyoce

1

Fourier, 37 bayt

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

FourIDE'da dene!

Giriş olarak iki sayı alır. Sonra golf oynayacak.


Böyle bir dize çıkarmasına gerek yok, acımasız veya sahte olabilir
Leo

Güzel golf. Bu hızlı oldu.
MD XF


1

Japt , 11 bayt

true"Ürpertici" ve falsedeğil için döndürür .

wV /2+7>UmV

Çevrimiçi deneyin


açıklama

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

<.<7+2%~>.

Çıkışlar 1, ürpertici değil 0ürpertici için

açıklama

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

1

J-uby , 25 bayt

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

Gibi ara f^[80,32]. Ürpertici truedeğil, ürpertici verir false.

açıklama

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

Bu güzel bir dil. Ruby ile benzer sonuçlara ulaşmak için uzun zaman harcadım (buna "Blurb" adını verdim), ama yoğun şekilde eğilerek method_missingçok fazla karmaşıklığa yol açtı. Bu yaklaşım temiz ve zariftir. Tebrikler!
Ürdün

@Jordan teşekkürler! Tüm krediyi alamam , çünkü bu, J'den ağır bir şekilde ilham aldı (bu yüzden isim). Varsa, bir Ruby programlayıcısının önerisine açığım.
Cyoce

@Jordan, diğer daha karmaşık J-uby cevaplarından bazılarını görmelisiniz. Çok güzeller.
Cyoce

1

AWK , 26 bayt

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

Çevrimiçi deneyin!

"Creepy" için 1, "Not Creepy" için 0 çıktı. Çıktıları sahte olmayan bir değer olarak kabul ederse, 3 byte tasarruf edilebilir:

$0=$1/2+7>$2||$2/2+7>$1
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.