Fungsi ini harus mengambil empat input bilangan bulat ( a
, b
, c
, d
) dan kembali kata biner berdasarkan yang nilai sama dengan maksimum empat.
Nilai pengembalian akan berada di antara 1
dan 0xF
.
Sebagai contoh:
a = 6, b = 77, c = 1, d = 4
mengembalikan 2
(biner 0010
; hanya bit terkecil ke-2 yang disetel untuk b
menjadi satu-satunya nilai maks)
a = 4, b = 5, c = 10, d = 10
mengembalikan 0xC
(biner 1100
; bit signifikan ke-3 dan ke-4 ditetapkan sesuai dengan c
dan d
menyamai nilai maks)
a = 1, b = 1, c = 1, d = 1
mengembalikan 0xF
(biner 1111
; keempat bit diatur karena semua nilai sama dengan maks)
Berikut ini adalah implementasi sederhana:
int getWord(int a, int b, int c, int d)
{
int max = a;
int word = 1;
if (b > max)
{
max = b;
word = 2;
}
else if (b == max)
{
word |= 2;
}
if (c > max)
{
max = c;
word = 4;
}
else if (c == max)
{
word |= 4;
}
if (d > max)
{
word = 8;
}
else if (d == max)
{
word |= 8;
}
return word;
}
nilai kembali dapat berupa string 0's dan 1's, bool / bit vector, atau integer
Jawaban:
Jelly , 2 byte
Mengambil input sebagai
[d,c,b,a]
. Mengembalikan daftar Boolean.Cobalah online!
Ṁ
M aximum=
sama dengan (menyiratkan argumen lain adalah argumen asli; vectorises)sumber
R , 17 byte
Cobalah online!
Mengembalikan vektor boolean. Karena output ini telah dikonfirmasi, ini lebih disukai daripada output numerik, karena yang hampir dua kali lebih lama:
R , 33 byte
Cobalah online!
sumber
APL (Dyalog Unicode) , 4 byte SBCS
Fungsi awalan diam-diam anonim. Dibawa
[a,b,c,d]
sebagai argumen. Mengembalikan array bit-Boolean. *Cobalah online!
⌈/
Apakah argumen maksimal=
sama dengan (vektorisasi)⌽
kebalikan dari argumen?* Perhatikan bahwa APL menyimpan array Boolean menggunakan satu bit per nilai, jadi ini memang mengembalikan kata 4-bit, meskipun bentuk tampilannya sedang
0 0 1 0
.sumber
Haskell ,
2018 byte2 byte disimpan berkat haskeller yang bangga
Cobalah online!
sumber
map
bukannya(<$>)
dua byte lebih pendek!Perl 6 , 12 byte
Cobalah online!
Blok kode anonim yang mengambil daftar bilangan bulat dan mengembalikan daftar boolean. Jika kita perlu kembali sebagai angka, +4 byte untuk membungkus bagian dalam blok kode
2:[...]
.Penjelasan:
sumber
Japt, 5
Cobalah!
-4 byte terima kasih kepada @Oliver!
-2 byte terima kasih kepada @Shaggy!
Input adalah array 4-elemen dalam format berikut:
Output adalah array bit.
sumber
rw
mengkonversir("w")
menjadi mengurangi dengan berulang kali mendapatkan maks. Sama denganm¶
dikonversi menjadiU.m("===", ...)
. Bagaimanapun, terima kasih atas tipsnya!kode mesin x86 (MMX / SSE1), 26 byte (4x int16_t)
kode mesin x86 (SSE4.1), 28 byte (4x int32_t atau uint32_t)
kode mesin x86 (SSE2), 24 byte (4x float32) atau 27B ke cvt int32
(Versi terakhir yang mengonversi int32 ke float tidak sepenuhnya akurat untuk bilangan bulat besar yang bulat ke float yang sama. Dengan input float, pembulatan adalah masalah pemanggil dan fungsi ini berfungsi dengan benar jika tidak ada NaN, mengidentifikasi float yang membandingkan == maks. Versi integer bekerja untuk semua input, memperlakukannya sebagai pelengkap yang ditandatangani 2).
Semua ini bekerja dalam mode 16/32/64-bit dengan kode mesin yang sama.
Konvensi pemanggilan stack-args akan memungkinkan untuk mengulang argumen dua kali (menemukan maks dan kemudian membandingkan), mungkin memberi kami implementasi yang lebih kecil, tetapi saya belum mencoba pendekatan itu.
x86 SIMD memiliki bitmap vektor-> integer sebagai instruksi tunggal (
pmovmskb
ataumovmskps
pd), jadi itu wajar untuk ini meskipun instruksi MMX / SSE setidaknya sepanjang 3 byte. Instruksi SSSE3 dan yang lebih baru lebih panjang dari pada SSE2, dan instruksi MMX / SSE1 adalah yang terpendek. Versi berbedapmax*
(packed-integer vertical max) diperkenalkan pada waktu yang berbeda, dengan SSE1 (untuk mmx regs) dan SSE2 (untuk xmm regs) hanya memiliki kata yang ditandatangani (16-bit) dan byte yang tidak ditandatangani.(
pshufw
danpmaxsw
pada register MMX masih baru dengan Katmai Pentium III, jadi mereka benar-benar membutuhkan SSE1, bukan hanya fitur CPU MMX.)Ini bisa dipanggil dari C seperti
unsigned max4_mmx(__m64)
halnya i386 System V ABI, yang meneruskan__m64
argumen inmm0
. (Tidak x86-64 Sistem V, yang melewati__m64
dixmm0
!)Jika ada
pmovmskw
, apa yang akan menyelamatkanpacksswb
danand
(3 + 2 byte). Kami tidak perluand eax, 0x0f
karenapmovmskb
pada register MMX sudah nol byte atas. Register MMX hanya memiliki lebar 8 byte, jadi 8-bit AL mencakup semua bit yang tidak nol.Jika kita tahu input kita non-negatif, kita bisa
packsswb mm1, mm0
menghasilkan byte yang ditandatangani non-negatif di atas 4 bytemm1
, menghindari kebutuhan untukand
setelahpmovmskb
. Jadi 24 byte.paket x86 dengan saturasi yang telah ditandatangani memperlakukan input dan output sebagai yang ditandatangani, sehingga selalu mempertahankan bit tanda. ( https://www.felixcloutier.com/x86/packsswb:packssdw ). Fakta menyenangkan: paket x86 dengan saturasi yang tidak ditandatangani masih memperlakukan input yang ditandatangani. Ini mungkin mengapa
PACKUSDW
tidak diperkenalkan sampai SSE4.1, sementara 3 kombinasi ukuran dan signness lainnya ada sejak MMX / SSE2.Atau dengan bilangan bulat 32-bit dalam register XMM (dan
pshufd
bukannyapshufw
), setiap instruksi akan membutuhkan satu byte awalan lagi, kecuali untukmovmskps
mengganti paket / dan. Tapipmaxsd
/pmaxud
membutuhkan byte tambahan ekstra ...callable dari C sebagai
unsigned max4_sse4(__m128i);
dengan x86-64 System V, atau MSVC vectorcall (-Gv
), yang keduanya lulus__m128i
/__m128d
/__m128
args di regs XMM dimulai denganxmm0
.Atau jika kami menerima input
float
, kami dapat menggunakan instruksi SSE1. Thefloat
Format dapat mewakili berbagai nilai integer ...Atau jika Anda berpikir bahwa membengkokkan aturan terlalu jauh, mulailah dengan 3-byte
0F 5B C0 cvtdq2ps xmm0, xmm0
untuk dikonversi, membuat fungsi 27-byte yang bekerja untuk semua bilangan bulat yang benar-benar mewakili IEEE binary32float
, dan banyak kombinasi input di mana beberapa input mendapatkan dibulatkan menjadi kelipatan 2, 4, 8, atau apa pun selama konversi. (Jadi 1 byte lebih kecil dari versi SSE4.1, dan bekerja pada x86-64 apa saja hanya dengan SSE2.)Jika salah satu dari input float adalah NaN, perhatikan bahwa
maxps a,b
mengimplementasikan dengan tepat(a<b) ? a : b
, menjaga elemen dari operan ke-2 pada unordered . Jadi dimungkinkan untuk kembali dengan bitmap yang tidak nol bahkan jika inputnya mengandung beberapa NaN, tergantung di mana bitmap itu berada.unsigned max4_sse2(__m128);
salin-dan-kocok dengan
pshufd
masih taruhan terbaik kami:shufps dst,src,imm8
membaca input dari setengah rendahdst
daridst
. Dan kita perlu copy-and-shuffle non-destruktif kedua kali, sehingga 3-bytemovhlps
danunpckhps
/ pd keduanya keluar. Jika kita mempersempit ke skalar maks, kita bisa menggunakan itu, tetapi membutuhkan instruksi lain untuk disiarkan sebelum membandingkan jika kita belum memiliki maks dalam semua elemen.Terkait: SSE4.1
phminposuw
dapat menemukan posisi dan nilai minimumuint16_t
dalam register XMM. Saya tidak berpikir itu menang untuk mengurangi dari 65.535 untuk menggunakannya untuk maks, tetapi lihat jawaban SO tentang menggunakannya untuk maks byte atau bilangan bulat yang ditandatangani.sumber
Python 3.8 (pra-rilis) , 67 byte
Fungsi Lambda yang mengambil dalam 4 bilangan bulat, bit menggeser hasil boolean dari perbandingan mereka ke nilai maksimum dengan bantuan dari operator penugasan baru Python 3.8 , dan mengembalikan bitwise ATAU dari hasil
Cobalah online!
sumber
Java (JDK) , 78 byte
Cobalah online!
[a,b,c,d]
.sumber
05AB1E ,
32 byteInput sebagai daftar
[d,c,b,a]
, output sebagai daftar boolean.Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
sumber
JavaScript (ES6), 30 byte
Mengambil input sebagai
([d,c,b,a])
. Mengembalikan 4 nilai Boolean.Cobalah online!
sumber
Ruby ,
3422 byteMengambil input sebagai array
[d, c, b, a]
dan mengembalikan array 1s dan 0s.Cobalah online!
sumber
Python 3 ,
59 byte66 byteCobalah online!
Mengambil input sebagai
[a,b,c,d]
dan menampilkan daftar boolean.Diedit menjadi fungsi yang tepat, kemudian disimpan 2 byte dengan menghapus tanda kurung di sekitar bersyarat.
sumber
1. Python 3.5, 90 byte
Mengambil urutan angka sebagai parameter. Mengembalikan string "biner"
contoh:
Penjelasan
sumber
C # (Visual C # Interactive Compiler) , 26 byte
Cobalah online!
Mengambil input dalam format
[d,c,b,a]
. Semua yang lain di bawah mengambil input sebagai[a,b,c,d]
C # (Visual C # Interactive Compiler) , 35 byte
Mengembalikan sebuah
IEnumerable<bool>
.Cobalah online!
C # (Visual C # Interactive Compiler) , 39 byte
Mengembalikan
IEnumerable<int>
, yang mewakili bit.Cobalah online!
C # (Visual C # Interactive Compiler) , 49 byte
Mencetak string biner ke STDOUT.
Cobalah online!
sumber
IEnumerable<bool>
bisa diterima.PHP, 54 byte
atau
mengambil input dari argumen baris perintah. Jalankan dengan
-nr
atau coba online .sumber
Berikut adalah versi JS yang ditampilkan sebagai biner
pembaruan: Lebih pendek dengan bergabung, dan tanpa pencarian:
JavaScript (Node.js) , 42 byte
Cobalah online!
Sebelumnya, dengan pencarian, 49 byte
Cobalah online!
Sebelumnya, dengan pengurangan, 52 byte:
Cobalah online!
sumber
[0,1][...]
C # (Visual C # Interactive Compiler) , 51 byte
Cobalah online!
Di atas adalah fungsi anonim yang menghasilkan dengan mengubah argumen . Output adalah array dari 1 dan 0.
Di bawah ini adalah fungsi rekursif yang menghasilkan bilangan bulat.
C # (Visual C # Interactive Compiler) , 60 byte
Cobalah online!
Kedua fungsi mengambil input sebagai array 4-elemen.
sumber
Python 2 , 35 byte
Cobalah online!
Mengambil input dalam format [d, c, b, a] seperti dengan jawaban yang diterima dari Adm jadi saya kira tidak apa-apa.
Alternatif untuk 41 jika tidak ...
Python 2 , 41 byte
Cobalah online!
sumber
Python 3 , 42 byte
Cukup mengembalikan daftar apakah elemen tersebut adalah maks untuk setiap elemen dalam input. -2 byte jika Anda tidak menghitung
f=
tugas.Cobalah online!
sumber
f=
tidak dihitung kecuali dalam fungsi rekursifBatch, 92 byte
Mengambil argumen sebagai parameter baris perintah dalam urutan terbalik. Bekerja dengan menghitung secara hitung parameter maksimum dengan mengurangi parameternya dan menambahkan hanya perbedaan positif dari running maksimum, kemudian memetakan setiap parameter lagi kali ini membandingkannya dengan maksimum. Mudah
cmd/cset/a
tidak menampilkan baris baru, sehingga hasilnya secara otomatis digabungkan bersama. The%f%
hanya menghemat 5 byte pada apa yang akan menjadi sebuah konstruksi berulang.sumber