İki değeri birleştir


44

Her biri 0"bilinmeyen" ifadesini temsil eden veya bunlardan birini temsil eden iki değeriniz var 1,2,3. Onları aşağıdaki gibi tek bir değerde birleştir:

  • Her iki değer de sıfır değilse ve eşitse, bu değeri verin:
    (3,3) -> 3
  • Her iki değer de sıfır olmasa da eşit değilse, bilinmeyen için 0 çıktısı:
    (1,2) -> 0
  • Eğer bir değer sıfırsa, diğeri sıfırsa sıfır olmayan bir değer verir:
    (2,0) -> 2, (0,1) -> 1
  • Her iki değer de sıfırsa, sıfır çıkışı:
    (0,0) -> 0

Test durumları:

16 olası giriş çifti vardır.

  | 0 1 2 3
--+--------
0 | 0 1 2 3
1 | 1 1 0 0
2 | 2 0 2 0
3 | 3 0 0 3

(0, 0) -> 0
(0, 1) -> 1
(0, 2) -> 2
(0, 3) -> 3
(1, 0) -> 1
(1, 1) -> 1
(1, 2) -> 0
(1, 3) -> 0
(2, 0) -> 2
(2, 1) -> 0
(2, 2) -> 2
(2, 3) -> 0
(3, 0) -> 3
(3, 1) -> 0
(3, 2) -> 0
(3, 3) -> 3

Liderler


8
Dördüncü kural ilk kurala uyuyor, bu yüzden neden onları ayırdığını bilmiyorum.
14’e ölümle sonuçlandı

1
Nitpick: Dördüncü nokta gereksizdir, sadece “sıfırdan uzak” işaretini ilk noktadan kaldırabilirsiniz. EDIT: Vay, ne ninja @ Fatalize.
Outgolfer Erik,

Ayrıca, olası giriş sayısını arttırmasına rağmen, 3 burada gerçekten gerekli değildir.
Outgolfer Erik,

2
Kuralları yoğunlaştırmayı düşündüm, ancak sıfır / sıfır olmayan tüm vakaları listelemenin ve optimizasyonu golfçülere bırakmanın en açık olacağını düşündüm.
xnor

2
Bu bir lider panosuna ihtiyaç duyar , ilk sayfa ikincisinde çoktan dövülmüş cevaplar almaya başlar.
Ørjan Johansen

Yanıtlar:


22

Python 3 , 27 25 bayt

lambda x,y:(x|y)>>(x*y&2)

Çevrimiçi deneyin!


5
Bunun 3'ün üzerindeki girişler için ayrılmasını sevdim.
Jakob

4
Temelde birçok deneme yanılma.
Dennis,

1
İlginç. Bir an için, iki inç ve birkaç operatör içeren sınırlı uzunluktaki ifadeler arasında bir aramayı otomatikleştirmeyi düşündüm, ancak alan yaklaşık 20 baytta bile çok büyük. Biraz zeka gerekli!
Jakob

16

Jöle , 4 bayt

gf|S

Çevrimiçi deneyin!

Nasıl çalışır

gf|S  Main link. Left argument: x. Right argument: y.

g     Compute a, the gcd of x and y.
  |   Compute b, the bitwise OR of x and y.
 f    Filter; yield all common elements of [a] and [b].
   S  Take the sum.

10

APL (Dyalog) , 5 bayt

⌈×∧=⌊

Çevrimiçi deneyin!

Faydalı referans

∧=⌊: 1En düşük ortak çoklu minimum değere eşitse geri döner. Bu, yalnızca değerlerden biri sıfırsa veya her ikisi de eşitse geçerlidir. Alternatif olarak alabilirdim=*⌊

⌈×: Maksimum, yukarıdakilerle çarpılır.


7

Shakespeare Programlama Dili , 296 bayt

Z.Ford,.Ajax,.Act I:.Scene I:.[Enter Ford and Ajax]Ajax:Listen to thy heart.Ford:Listen to thy heart.Am I as fat as you?Ajax:If so,let us Scene C.Am I as fat as zero?If so,let us Scene C.Ford:Am I as fat as zero?If not,you zero.open heart.let us Scene V.Scene C:.Ajax:open heart.Scene V:.[Exeunt]

Çevrimiçi deneyin!

Kod-golf mücadelesine ilk katılım, bu yüzden en sevdiğim şaka dillerinden biriyle başlayalım!

Açıklama: Ford ve Ajax iki değişkeninin bildirimi (mevcut en kısa değişken isimleri)

Z.Ford,.Ajax,.

İlk Sahne: İki değeri değişkene koyun, sonra eşitlik için test edin, sonra Ajax'ı 0'a karşı test edin. Döndürmemiz gereken değer Ford değişkeninde saklanırsa, Sahne C'ye gidin.

Act I:.
Scene I:.
[Enter Ford and Ajax]
Ajax:
Listen to thy heart.
Ford:Listen to thy heart.
Am I as fat as you?
Ajax:
If so,let us Scene C.
Am I as fat as zero?
If so,let us Scene C.

Ford 0 ise, Ajax'ı yazdırın, yoksa Ajax'ı 0 olarak ayarlayın, sonra Ajax'ı yazdırın. Ardından programın sonuna gidin.

Ford:Am I as fat as zero?
If not,you zero.
open heart.
let us Scene V.

Sahne C: Ford'u Yazdır

Scene C:.
Ajax:open heart.

Sahne V: Programın sonu.

Scene V:.
[Exeunt]


2
@JoKing sürümün benimkinden kesinlikle daha iyi, bence programın arkasındaki sebep oldukça farklı olduğu ve bir iş için kredi almak istemediğim için bir cevap olarak gönderirseniz daha iyi olacağını düşünüyorum
Guillaume Ruchot

6

Ruby , 21 bayt

->a,b{(a|b)*531[a*b]}

Çevrimiçi deneyin!

Çünkü yakut

Kısa açıklama:

  • a|b bitwse VEYA, a == b veya bunlardan biri sıfır olduğunda bize doğru sayıyı verir.

  • Sihirli sayı 5312 ^ 9 + 2 ^ 4 + 2 ^ 1 + 2 ^ 0 ve [] operatörü bir bit ayıklar. Bunun anlamı şudur: a * b 0, 1, 2, 4 veya 9 ise 1 ile çarpın, aksi takdirde 0 ile çarpın.

  • Bu değer> 3 için işe yaramaz



5

Pyth , 8 7 bayt

@{+0SQ3

Çevrimiçi deneyin!

@{+0SQ3   Implicit: Q=input()

    SQ    Sort input
  +0      Prepend 0
 {        Deduplicate
@     3    Get 4th element (index 3), modular indexing

Durum 1 - Her iki değer sıfır olmayan ve eşit

Sorted Input   [3,3]
Prepend 0      [0,3,3]
Deduplicate    [0,3] - index 3 yields 3

Durum 2 - Her iki değer sıfır olmayan ve eşit olmayan

Sorted Input   [1,2]
Prepend 0      [0,1,2]
Deduplicate    [0,1,2] - index 3 yields 0

Durum 3 - Tam olarak bir değer sıfır

Sorted Input   [0,1]
Prepend 0      [0,0,1]
Deduplicate    [0,1] - index 3 yields 1

Durum 4 - Her iki değer de sıfır

Sorted Input   [0,0]
Prepend 0      [0,0,0]
Deduplicate    [0] - index 3 yields 0

Alternatif çözüm, ayrıca 7 bayt

*eSQ}s{

Çevrimiçi deneyin

*eSQ}s{QQ   Trailing Q's inferred

      {Q    Deduplicate input
     s      Take the sum
    }   Q   Is this in the input? True treated as 1, false as 0
*           Multiplied by
 eSQ        Max from input (end of sorted input) 

Önceki sürüm, 8 bayt

@+0{-QZ3

@xnor Bunu tespit ettiğiniz için teşekkürler, şimdi düzeltilmesi gerekiyor
Sok

@{+0Q36 bayt için çalışır.
Bay Xcoder


4

Stax , 8 bayt

Ç∞∟∙◄╥*♣

Koş ve hata ayıkla

Ambalajsız, ağzı açılmış ve yorumlanmış gibi görünüyor.

    e.g.        [2, 0]
c:s [2, 0] 2    calculate the "span" of the input array (max(a) - min(a))
+   [2, 0, 2]   append the span to the input array
o   [0, 2, 2]   sort the 3-element array
E   0 2 2       explode the 3 elements into 3 separate stack entries
a   2 2 0       rotate the third stack element to the top of stack
!   2 2 1       logical not, produces 1 iff the top value was 0
*   2 2         multiply
                implicitly print top of stack

Bunu çalıştır




4

C (gcc), 25 bayt

f(a,b){a=a^b&&a*b?0:a|b;}

sözde kodu:

foo(A,B)
    if A XOR B and A*B are > 0
        return 0
    else 
        return A OR B`

3

C (gcc), 26 bayt

f(a,b){a=a*b?a-b?0:a:a+b;}

Çevrimiçi deneyin!

Genişleme / Ungolfed:

int f(int a, int b) { // implicit-int (C89)
    // return replaced with assignment: link
    return a*b ? // if a and b are both not zero, then
        a-b ? // if a != b
        0 : // a != b, so return 0
        a // a == b, so return a
    : a+b // one of a,b is zero, so return whichever is nonzero 
    ;
}

3

MATL , 9 bayt

dGp*~GX>*

Çevrimiçi deneyin!

Açıklama:

           % Implicit input as a vector with two elements implicitly. Stack: [0,2]
d          % The difference between the two elements. Stack: [2]
 G         % Push input again. Stack: [2], [0,2]
  p        % The product of the last element (the input). Stack: [2], [0]
   *       % Multiply the two elements on the stack. Stack: [0]
    ~      % Negate. Stack: [1]
     G     % Push input again. Stack: [1], [0,2]
      X>   % Maximum value. Stack: [1], [2]
        *  % Multiply the two elements on the stack. Stack: [2]
           % Implicit output

Başarısız outgolf:t?td~*]X>
sundar

3

GNU sed, 23 bayt

s/^0?(.)\1?0?$/\1/
t
c0

( -rbayrakla çalıştırılmalıdır )

Çevrimiçi deneyin!


1
PPCG'ye Hoş Geldiniz :) Mevcut fikir birliği, bayrakların sayılmadığı yönündedir (Telefonumdayım, bu yüzden ilgili Meta ile bağlantı kuramıyorum).
Shaggy

1
Oh harika! Telefonumda olduğumdan beri daha sonra düzenleyeceğim; -3 bayt PPCG'ye hoş geldiniz :)
KernelPanic

3

QBasic, 34 bayt

Farklı yaklaşım!

INPUT a,b
?(a OR b)*-(a*b=0OR a=b)

Çıktı ızgarasındaki sıfır olmayan değerlerin OR, iki giriş numarasının bit yönünde olduğunu gözlemleyin . Bu sadece a OR bQBasic dilinde. Biz çıkışa bu zaman değeri istiyorum a*b=0 OR a=b, ve 0(truthy olduğundan, negatif biz yukarıda belirtilen koşullu negatifliklerinden tarafından çarpılarak yapabilirsiniz aksi halde -1QBasic içinde).


2

brainfuck, 25 bayt

,>,[>]<<[[->->+<<]>[>]]>.

Giriş iki bayt değeridir (asci değil)


2

Swift , 118 bayt

func c(n1:Int,n2:Int){n1==n2 ? print("\(n1)") : (n1*n2 != 0 ? print("0") : (n1==0 ? print("\(n2)") : print("\(n1)")))}

4
PPCG'ye Hoşgeldiniz! Swift'i tanımıyorum ama değişken adlarını her biri 1 karakter yaparak !=ve üçlü gibi operatörlerin etrafındaki boşlukları kaldırarak büyük olasılıkla çok fazla bayt tasarrufu yapabilirsiniz .
Büyük

1
Merhaba, PPCG'ye hoş geldiniz! @ Euro tarafından belirtildiği gibi, onları kısaltmak için n1ve n2tek karakterleri değiştirebilirsiniz ; bazı boşlukları ve parantezleri kaldırın ve bazı boşlukları kaldırın. Ek olarak, ==0olabilir <1ve !=0olabilir >0, çünkü yalnızca girdilerin 0,1,2,3mümkün olduğunu biliyoruz . Daha önce de Swift'de programlanmadım, ancak bunu 91 bayta indirdim: func c(a:Int,b:Int){a==b ?print("\(a)"):a*b>0 ?print("0"):a<1 ?print("\(b)"):print("\(a)")} Çevrimiçi deneyin.
Kevin Cruijssen

Ayrıca, bunun gibi 51 bayta kadar kısaltabileceğiniz anlaşılıyor: func c(a:Int,b:Int){print(a==b||a*b<1 ?max(a,b):0)} Çevrimiçi deneyin. Yine PPCG'ye hoş geldiniz ve konaklamanızın tadını çıkarın!
Kevin Cruijssen

1
@ KevinCruijssen'in golf sahalarına ek olarak, gönderinizi 87 byte tasarruf etmek için adsız bir kapanmaya dönüştürebilirsiniz: {$0==$1||1>$0*$1 ?max($0,$1):0} Çevrimiçi deneyin!
Bay Xcoder

2

Toplu, 38 36 35 30 bayt

@cmd/cset/a"(%1|%2)>>(%1*%2&2)

@ Dennis’in Python limanı, Batch’de şartlı şartlar nedeniyle çok pahalı.



2

J , 8 7 bayt

H.PWiz tarafından kaydedilen 1 bayt.

>.*=^<.

Çevrimiçi deneyin!

H.PWiz'in APL çözümünün AJ portu

=sayılar eşit mi? (1 veya 0 sonuçlanır)

^ gücüne

<. küçük sayı

* çarpılır

>. daha büyük sayı


1
>.*=^<.7 bayt için
H.PWiz

@ H.PWiz Teşekkürler! Akıllıca kullanımı =ve ^!
Galen Ivanov

2

05AB1E , 9 8 bayt

àIËIP_+*

@MagicOctopusUrn sayesinde -1 bayt .

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

à         # Take the maximum of the input-list
          #  [0,2] → 2
IË        # Are all elements in the input-list equal?
          #  [0,2] → 0
  IP_     # Take the product of the input-list, and verify if it equals 0
          # (`_` transforms 0 into 1; everything else into 0)
          #  [0,2] → 0 (product) → 1 (==0)
     +    # Add them together (since only 1 is truthy in 05AB1E, this is basically an OR)
          #  0+1 → 1
*         # Multiply both values on the stack
          #  2*1 → 2

Genelleştirilmiş açıklama:

IËIP_+    # If both values are equal, or one of them is a zero:
 à        #  Output the maximum of the two values
          # Else:
          #  Output 0

Ës0å~iZë0benimdi; güzel. Aslında 9 byte'lık bir miktar geçebildiğinden emin değilim.
Magic Octopus Urn

1
Bunu geri almak için mantıksal olarak eşdeğerdirà®Ë®P_+*_
Sihirli Ahtapot Urn

_0, 1, diğer tüm değerler 0 olur.
Magic Octopus Urn

@MagicOctopusUrn Teşekkürler! Bu cevabı verdiğimde, bir == 0komut olup olmadığını görmek için doktora bakıyordum _, tam olarak bunu yaptığını bilmiyordum . Gelecekteki diğer zorluklar için de faydalı olmalıdır. TIL. :)
Kevin Cruijssen

2

Javascript, 35 bayt

f=(m,n)=>(m||n)&&(m!=n)?(m>n?m:n):0


2

Javascript ES6, 25 22 21 20 bayt

a=>b=>a?b-a?!b*a:a:b

14 13 bayt , Argümanlar sıralı düzende sağlanmışsa

a=>b=>a%b?0:b


2

QBasic, 38 36 35 bayt

INPUT a,b
?(a*b>0)*(b-a*(a<>b))+a+b

Kısmen Erik'in IF ... THEN ... ELSEcevabından ilham alan , işte matematiksel bir çözüm.

Buraya nasıl geldim

Matematik-Koşullamalar ile anlaşılması için önemli not: QBasic içinde, karşılaştırma operatörleri sonuçlarıdır 0ve -1değil 0ve 1.

Erik'in koduyla başlayalım:

IF a*b THEN?a*-(a=b)ELSE?a+b

Diğer bir deyişle, ave bher ikisi de sıfırdan farklı, daha sonra baskı a*-(a=b)( aeğer a=bbaşka türlü 0); başka bir şey (en az biri ave bsıfır), çıktı a+b(sıfır olmayan sayı veya 0her ikisi de sıfırsa).

Zaten burada şartlı bazı matematik var. Daha ileri bir adım atalım ve IFifadeyi tamamen ortadan kaldırabilir miyiz görelim . a*b>0Dış koşul için kullanmak zorunda kalacağız : a*bbirden fazla farklı truthy değerine sahip olabiliriz, ki bunlar için iyi IFfakat matematik için sorunlara neden olabilir.

c=a*b>0
?c*a*(a=b)+(c+1)*(a+b)

Bu standart hile ait IFeliminasyonu. Ne zaman c, doğrudur c*a*(a=b)olduğu -a*(a=b)ve (c+1)*(a+b)olduğu 0; ne zaman cyanlış, c*a*(a=b)öyle 0ve (c+1)*(a+b)öyle a+b. Yani bu ifade ile aynı sonuçları verir IF ... THEN ... ELSE. Tek sorun, programımızı 38 yerine 40 bayt yapar. Belki matematiği yeniden düzenleyerek kısaltabiliriz.

c=a*b>0
?c*a*(a=b)+c*(a+b)+a+b

Hala 40 bayt ...

c=a*b>0
?c*(a+b+a*(a=b))+a+b

Şimdi programımız 38 byte'a geri döndü. Ancak yalnızca bir ckez kullandığımızdan , artık bir değişkene atamak zorunda değiliz:

?(a*b>0)*(a+b+a*(a=b))+a+b

Şimdi 36 bayta düştük.

Ama bekleyin dahası var ... Bu a+b+a*(a=b)ifade biraz gereksiz görünüyor. a*(a=b)olup -aolmadığını a=bve 0aksi. Biz eklediğinizde a, biz olsun 0eğer a=bve aaksi. Belki aynı şeyi durumu daha az byte ile başarabiliriz.

b+a*-(a<>b)

İlk başta, bu daha kısa görünmüyor. Ancak, bir negatif eklemek yerine çıkartarak bir bayt kaydedebiliriz:

b-a*(a<>b)

Ve biz orada 35 baytlık çözümümüz var.


Orada güzel hile ...
Erik Outgolfer

1

Temiz , 46 43 42 bayt

import StdEnv
?[a,b]|a<1||a==b=b=0

?o sort

Çevrimiçi deneyin!

Anonim kompozisyon :: [Int] -> Int, çifti sıralar ve sonra ilk üyeyle eşleşir.

Kombine bir lamda olarak yapmak aynı uzunluktadır:

import StdEnv

(\[a,b]|a<1||a==b=b=0)o sort

1

Jöle , 7 6 bayt

׬o=a»

Çevrimiçi deneyin! veya Tüm kombinasyonları deneyin!

Nasıl?

׬o=a»   Dyadic link
×        Multiply the two arguments.
 ¬       Logical not. Gives 1 if one argument is 0, 1 otherwise.
   =     Are the two arguments equal?
  o      Logical or the result of = and ¬. 
     »   Greater of the two arguments.
    a    Logical and. Gives the greater of the two arguments if they are equal
         or if one of them is zero and gives 0 otherwise.

APL cevabındaki yöntemi kullanarak, aynı bayt sayısını elde ederiz. Bu cevaptan bir bayt daha uzun çünkü en düşük ortak çoklu iki bayttır.

6 bayt

«=æl×»

Çevrimiçi deneyin!


Ayrıca alternatif bir yönteme de dikkat
çekiyorum

@ H.PWiz Oh, bağlantıdakiyle aynı yöntemi kullandığınızı sanıyordum
dylnan

İki yöntem verdim ∧=⌊ve =*⌊. İkincisi Jelly
H.PWiz

@ H.PWiz APL konuşamıyorum, sadece tarif ettiğiniz yöntemi kullanıyordum. Ne yapar =*⌊?
dylnan

Jelly ile hemen hemen aynı, bunun dışında minimum. Ya da ×iki dilde de kullanabilirsiniz
H.PWiz
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.