Gabungkan dua nilai

44

Anda memiliki dua nilai yang masing-masing 0mewakili "tidak dikenal", atau salah satunya 1,2,3. Gabungkan mereka menjadi satu nilai sebagai berikut:

  • Jika kedua nilai tersebut bukan nol dan sama, keluarkan nilai tersebut:
    (3,3) -> 3
  • Jika kedua nilai bukan nol tetapi tidak sama, hasilkan 0 untuk tidak diketahui:
    (1,2) -> 0
  • Jika satu nilai nol dan yang lainnya tidak, output nilai bukan nol:
    (2,0) -> 2, (0,1) -> 1
  • Jika kedua nilai tersebut nol, hasilkan nol:
    (0,0) -> 0

Kasus uji:

Ada 16 pasangan input yang memungkinkan.

  | 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

Papan peringkat

Tidak
sumber
8
Aturan keempat cocok dengan aturan pertama, jadi saya tidak tahu mengapa Anda memisahkan mereka.
Fatalkan
1
Nitpick: Poin ke-4 berlebihan, Anda bisa menghapus "bukan nol" dari titik pertama. EDIT: Wow, apa itu Ninja?
Erik the Outgolfer
Juga, 3 tidak benar-benar diperlukan di sini, meskipun meningkatkan jumlah input yang mungkin.
Erik the Outgolfer
2
Saya mempertimbangkan untuk memadatkan peraturan, tetapi saya pikir itu akan menjadi paling jelas untuk hanya daftar semua nol / bukan nol kasus dan meninggalkan optimasi hingga pegolf.
xnor
2
Ini membutuhkan papan peringkat , halaman pertama mulai mendapatkan jawaban yang sudah dikalahkan di halaman kedua.
Ørjan Johansen

Jawaban:

22

Python 3 , 27 25 byte

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

Cobalah online!

Dennis
sumber
5
Saya suka bahwa ini istirahat untuk input lebih dari 3. Bagaimana Anda datang dengan ini?
Jakob
4
Pada dasarnya banyak trial and error.
Dennis
1
Menarik. Sejenak saya berpikir untuk mengotomatiskan pencarian melalui ekspresi panjang-terbatas yang melibatkan dua int dan beberapa operator, tetapi ruangnya terlalu besar bahkan pada sekitar 20 byte. Dibutuhkan sejumlah kecerdasan!
Jakob
16

Jelly , 4 byte

gf|S

Cobalah online!

Bagaimana itu bekerja

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.
Dennis
sumber
10

APL (Dyalog) , 5 byte

⌈×∧=⌊

Cobalah online!

Referensi yang berguna

∧=⌊: Mengembalikan 1jika kelipatan umum terendah sama dengan minimum. Ini hanya benar jika salah satu nilai adalah nol, atau keduanya sama. Atau saya bisa=*⌊

⌈×: Maksimum dikalikan dengan yang di atas.

H.Piz
sumber
7

Bahasa Pemrograman Shakespeare , 296 byte

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]

Cobalah online!

Partisipasi pertama untuk tantangan kode-golf, jadi mari kita mulai dengan salah satu bahasa lelucon favorit saya!

Penjelasan: Deklarasi dua variabel Ford dan Ajax (nama variabel terpendek tersedia)

Z.Ford,.Ajax,.

Adegan Pertama: Masukkan dua nilai ke dalam variabel, kemudian uji untuk kesetaraan, lalu uji Ajax terhadap 0. Jika nilai yang harus kita kembalikan disimpan dalam variabel Ford, pergi ke Adegan C.

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.

Jika Ford bernilai 0, cetak Ajax, jika tidak set Ajax sebagai 0 lalu cetak Ajax. Lalu pergi ke akhir program.

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

Adegan C: Cetak Ford

Scene C:.
Ajax:open heart.

Adegan V: Akhir dari program.

Scene V:.
[Exeunt]
Guillaume Ruchot
sumber
221 byte
Jo King
2
@JoKing versi Anda tidak dapat disangkal lebih baik daripada versi saya, saya pikir akan lebih baik jika Anda mempostingnya sebagai jawaban karena alasan di balik program ini sangat berbeda dan saya tidak ingin mengambil kredit untuk pekerjaan Anda
Guillaume Ruchot
6

Ruby , 21 byte

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

Cobalah online!

Karena Ruby

Penjelasan singkat:

  • a|b bitwse OR, jadi itu memberi kita angka yang tepat jika a == b atau salah satunya adalah nol.

  • Angka ajaib 531adalah 2 ^ 9 + 2 ^ 4 + 2 ^ 1 + 2 ^ 0, dan operator [] mengekstrak bit tunggal. Ini berarti: kalikan dengan 1 jika a * b adalah 0, 1, 2, 4 atau 9, kalikan dengan 0 sebaliknya.

  • Ini tidak akan berfungsi untuk nilai> 3
GB
sumber
5

JavaScript (Node.js) , 17 byte, port entah bagaimana dari jawaban Python

a=>b=>a*b&2?0:a|b

Cobalah online!

JavaScript (Node.js) , 21 byte

a=>b=>a-b?a*b?0:a+b:a

Cobalah online!

l4m2
sumber
?0:... Bisakah Anda melakukannya ||, atau apakah presedensi mengacaukannya?
Stan Strum
@StanStrum ?0:berarti mengembalikan nol jika cond tidak nol, ||mengembalikan non-nol jika cond tidak nol
l4m2
5

Pyth , 8 7 byte

@{+0SQ3

Cobalah online!

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

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

Kasus 1 - Keduanya bernilai nol dan sama

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

Kasus 2 - Keduanya bernilai bukan nol dan tidak sama

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

Kasus 3 - Persis satu nilai nol

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

Kasus 4 - Keduanya bernilai nol

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

Solusi alternatif, juga 7 byte

*eSQ}s{

Cobalah online

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

Versi sebelumnya, 8 byte

@+0{-QZ3
Sok
sumber
@ xnor Terima kasih telah melihatnya, itu harus diperbaiki sekarang
Sok
@{+0Q3bekerja selama 6 byte.
Tn. Xcoder
4

Stax , 8 byte

Ç∞∟∙◄╥*♣

Jalankan dan debug itu

Dibongkar, tidak diserang, dan dikomentari, sepertinya ini.

    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

Jalankan yang ini

rekursif
sumber
4

(pengiriman pertama jadi tolong jangan menendang terlalu keras)

Python 2 , 57 44 43 byte

lambda a,b:(0 if a*b else a+b)if a-b else a

Cobalah online!

(Dikompres sedikit setelah melihat jawaban python pertama )

Oct18 adalah hari hening di SE
sumber
33 byte
Jo King
Dicoret 44 masih 44; (
Jo King
@ Bersenang-senang ya wut? Solusi Anda hebat, saya mencoba melakukannya dengan aritmatika, tetapi gagal dan kembali ke jika / lain
Oct18 adalah hari hening pada
4

C (gcc), 25 byte

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

pseudo-code:

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

C (gcc), 26 byte

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

Cobalah online!

Ekspansi / Tidak Terkumpul:

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 
    ;
}
pizzapants184
sumber
3

MATL , 9 byte

dGp*~GX>*

Cobalah online!

Penjelasan:

           % 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
Stewie Griffin
sumber
Gagal outgolf:t?td~*]X>
sundar - Reinstate Monica
3

GNU sed, 23 byte

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

(harus dijalankan dengan -rbendera)

Cobalah online!

KernelPanic
sumber
1
Selamat datang di PPCG :) Konsensus saat ini adalah bahwa bendera tidak dapat dihitung (Saya menggunakan ponsel saya sehingga tidak dapat menautkan Meta yang relevan).
Shaggy
1
Oh keren! Saya akan mengedit nanti karena saya juga di ponsel saya; gratis -3 byte adalah sambutan yang bagus untuk PPCG :)
KernelPanic
3

QBasic, 34 byte

Pendekatan yang berbeda!

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

Perhatikan bahwa nilai-nilai bukan nol dalam kisi-kisi keluaran adalah bitwise ORdari dua angka input. Ini hanya a OR bdi QBasic. Kami ingin menampilkan nilai ini kapan a*b=0 OR a=b, dan 0sebaliknya, yang dapat kami lakukan dengan mengalikannya dengan negatif dari persyaratan yang disebutkan di atas (negatif, karena kebenaran ada -1dalam QBasic).

DLosc
sumber
2

brainfuck, 25 byte

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

Input adalah nilai dua byte (bukan ascii)

KSab
sumber
2

Swift , 118 byte

func c(n1:Int,n2:Int){n1==n2 ? print("\(n1)") : (n1*n2 != 0 ? print("0") : (n1==0 ? print("\(n2)") : print("\(n1)")))}
onnoweb
sumber
4
Selamat datang di PPCG! Saya tidak tahu Swift, tetapi Anda mungkin dapat menyimpan banyak byte dengan membuat nama variabel masing-masing 1 karakter, dan menghapus spasi di sekitar operator seperti !=dan ternary.
Οurous
1
Hai, selamat datang di PPCG! Seperti yang disebutkan oleh @ Οurous, Anda dapat mengubah n1dan n2untuk karakter tunggal untuk mempersingkat mereka; hapus beberapa spasi putih dan kurung, dan hapus beberapa spasi. Selain itu, ==0bisa <1dan !=0bisa >0, karena kita tahu hanya input 0,1,2,3yang mungkin. Belum pernah diprogram dalam Swift sebelumnya, tetapi saya mendapatkannya hingga 91 byte seperti ini: func c(a:Int,b:Int){a==b ?print("\(a)"):a*b>0 ?print("0"):a<1 ?print("\(b)"):print("\(a)")} Coba online.
Kevin Cruijssen
Selain itu, tampaknya Anda dapat mempersingkat menjadi 51 byte seperti ini: func c(a:Int,b:Int){print(a==b||a*b<1 ?max(a,b):0)} Coba online. Sekali lagi selamat datang di PPCG, dan nikmati masa tinggal Anda!
Kevin Cruijssen
1
Selain golf @ KevinCruijssen, Anda dapat mengubah kiriman Anda menjadi penutupan anonim untuk menghemat 87 byte: {$0==$1||1>$0*$1 ?max($0,$1):0} Cobalah secara online!
Tn. Xcoder
2

Batch, 38 36 35 30 byte

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

Port of @ Dennis's Python menjawab, karena persyaratan terlalu mahal di Batch.

Neil
sumber
2

J , 8 7 byte

1 byte disimpan oleh H.PWiz.

>.*=^<.

Cobalah online!

Port AJ dari solusi APL H.PWiz

=apakah angkanya sama? (hasil dalam 1 atau 0)

^ untuk kekuatan

<. jumlah yang lebih kecil

* dikalikan dengan

>. jumlah yang lebih besar

Galen Ivanov
sumber
1
>.*=^<.untuk 7 byte
H.PWiz
@ H.PWiz Terima kasih! Penggunaan cerdas =dan ^!
Galen Ivanov
2

05AB1E , 9 8 byte

àIËIP_+*

-1 byte terima kasih kepada @MagicOctopusUrn .

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

à         # 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

Penjelasan umum:

IËIP_+    # If both values are equal, or one of them is a zero:
 à        #  Output the maximum of the two values
          # Else:
          #  Output 0
Kevin Cruijssen
sumber
Ës0å~iZë0adalah milikku; bagus Tidak benar-benar yakin Anda bisa mengalahkan 9 byte dengan banyak.
Magic Gurita Guci
1
Saya mengambil kembali itu di à®Ë®P_+*mana _secara logis setara dengan
Magic Octopus Mm
_mengubah 0 menjadi 1, semua nilai lainnya menjadi 0.
Magic Gurita Guci
@MagicOctopusUrn Terima kasih! Ketika saya membuat jawaban ini, saya melihat dokumen untuk melihat apakah ada == 0perintah, tidak tahu _persis seperti itu. Seharusnya bermanfaat untuk tantangan lain di masa depan juga. TIL. :)
Kevin Cruijssen
2

Javascript, 35 byte

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

Javascript ES6, 25 22 21 20 byte

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

14 13 byte , Jika argumen disediakan dalam urutan

a=>b=>a%b?0:b
MattH
sumber
2

Python 2 , 34 28 byte

lambda i,j:(i|j,0)[0<i!=j>0]

Cobalah online!

-6 dengan terima kasih kepada @Dennis

ElPedro
sumber
[0<i!=j>0]menghemat beberapa byte.
Dennis
2

QBasic, 38 36 35 byte

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

Sebagian terinspirasi oleh jawaban ErikIF ... THEN ... ELSE , ini solusi matematika saja.

Bagaimana saya sampai di sini

Catatan penting untuk memahami matematika dengan persyaratan: dalam QBasic, hasil dari operator perbandingan adalah 0dan -1, bukan 0dan 1.

Kita mulai dengan kode Erik:

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

Dengan kata lain, jika adan bkeduanya bukan nol, maka cetak a*-(a=b)( ajika a=b, sebaliknya 0); lain (setidaknya satu adan bnol), output a+b(angka bukan nol, atau 0jika keduanya nol).

Sudah ada beberapa matematika dengan persyaratan yang terjadi di sini. Mari kita selangkah lebih jauh dan lihat apakah kita bisa menghilangkan IFpernyataan itu sepenuhnya. Kita harus menggunakan a*b>0untuk kondisi luar: a*bdapat memiliki beberapa nilai kebenaran yang berbeda, yang bagus untuk IFtetapi menyebabkan masalah untuk matematika.

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

Ini adalah trik standar dari IF-elimination. Kapan cbenar, c*a*(a=b)adalah -a*(a=b)dan (c+1)*(a+b)sedang 0; ketika csalah, c*a*(a=b)adalah 0dan (c+1)*(a+b)sekarang a+b. Jadi ungkapan ini memberikan hasil yang sama dengan IF ... THEN ... ELSE. Satu-satunya masalah adalah, itu membuat program kita 40 byte, bukan 38. Mungkin kita bisa mempersingkatnya dengan mengatur ulang matematika.

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

Masih 40 byte ...

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

Sekarang program kami kembali ke 38 byte. Tetapi karena kita hanya menggunakan csekali, kita tidak harus menugaskannya ke variabel lagi:

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

Sekarang kita turun ke 36 byte.

Tapi tunggu ada lagi ... Itu a+b+a*(a=b)ekspresi terlihat berlebihan sedikit. a*(a=b)adalah -ajika a=bdan 0sebaliknya. Ketika kita menambahkannya a, kita dapat 0jika a=bdan asebaliknya. Mungkin kita dapat mencapai hal yang sama dalam lebih sedikit byte dengan membalikkan kondisinya.

b+a*-(a<>b)

Pada awalnya, ini tidak terlihat lebih pendek. Tetapi kita dapat menyimpan byte dengan mengurangi alih-alih menambahkan negatif:

b-a*(a<>b)

Dan di sana kami memiliki solusi 35-byte kami.

DLosc
sumber
Trik yang bagus di sana ...
Erik the Outgolfer
1

Bersih , 46 43 42 byte

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

?o sort

Cobalah online!

Komposisi anonim :: [Int] -> Int, mengurutkan pasangan dan kemudian mencocokkan anggota pertama.

Melakukannya sebagai lambda yang tersusun memiliki panjang yang sama:

import StdEnv

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

Jelly , 7 6 byte

׬o=a»

Cobalah online! atau Coba semua kombinasi!

Bagaimana?

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

Menggunakan metode dalam jawaban APL , kami mendapatkan jumlah byte yang sama. Satu byte lebih panjang dari jawaban itu karena kelipatan umum terendah adalah dua byte.

6 byte

«=æl×»

Cobalah online!

dylnan
sumber
Saya juga mencatat metode alternatif di bawah ini
H.PWiz
@ H.PWiz Oh, saya pikir Anda menggunakan metode yang sama dengan yang ada di tautan
dylnan
Saya memberikan dua metode ∧=⌊dan =*⌊. Yang kedua lebih disukai oleh Jelly
H.PWiz
@ H. Wiz Saya tidak berbicara APL, saya hanya menggunakan metode yang Anda jelaskan. Apa yang =*⌊harus dilakukan
dylnan
Ini hampir sama dengan Jelly, kecuali itu minimum. Atau bisa digunakan ×dalam kedua bahasa
H.PWiz