İ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.