Funkcja ta powinna wziąć cztery wejścia Integer ( a
, b
, c
, d
) i powrócić binarne słowo na podstawie których wartości są równe maksymalnie cztery.
Wartość zwracana będzie pomiędzy 1
a 0xF
.
Na przykład:
a = 6, b = 77, c = 1, d = 4
zwraca 2
(binarny 0010
; ustawiony jest tylko 2. bit o znaczeniu najmniejszym odpowiadający b
jedynej maksymalnej wartości)
a = 4, b = 5, c = 10, d = 10
zwraca 0xC
(binarny 1100
; trzeci i czwarty najmniej znaczący zestaw bitów odpowiadający c
i d
równy wartości maksymalnej)
a = 1, b = 1, c = 1, d = 1
zwraca 0xF
(binarny 1111
; wszystkie cztery bity ustawione, ponieważ wszystkie wartości są równe maksimum)
Oto prosta implementacja:
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;
}
wartością zwracaną może być ciąg zer i jedynek, wektor bool / bit lub liczba całkowita
Odpowiedzi:
Galaretka , 2 bajty
Pobiera dane wejściowe jako
[d,c,b,a]
. Zwraca listę wartości logicznych.Wypróbuj online!
Ṁ
M aximum=
równa (implikuje, że drugi argument jest argumentem oryginalnym; wektoryzacja)źródło
R , 17 bajtów
Wypróbuj online!
Zwraca wektor wartości logicznych. Ponieważ to wyjście zostało potwierdzone, jest to lepsze niż wyjście numeryczne, ponieważ jest ono prawie dwa razy dłuższe:
R , 33 bajty
Wypróbuj online!
źródło
APL (Dyalog Unicode) , 4 bajty SBCS
Anonimowa ukryta funkcja prefiksu. Bierze się
[a,b,c,d]
za argument. Zwraca tablicę bitów logicznych. *Wypróbuj online!
⌈/
Czy maksimum argumentu=
równe (wektoryzacja)⌽
odwrotność argumentu?* Zauważ, że APL przechowuje tablice booleanów przy użyciu jednego bitu na wartość, więc to rzeczywiście zwraca 4-bitowe słowo, pomimo że jest wyświetlany
0 0 1 0
.źródło
Haskell ,
2018 bajtów2 bajty zapisane dzięki dumnemu haskellerowi
Wypróbuj online!
źródło
map
zamiast(<$>)
byłoby dwa bajty krótsze!Perl 6 , 12 bajtów
Wypróbuj online!
Anonimowy blok kodu, który pobiera listę liczb całkowitych i zwraca listę wartości logicznych. Jeśli musimy zwrócić jako liczbę, to +4 bajty, aby owinąć wnętrze bloku kodu
2:[...]
.Wyjaśnienie:
źródło
Japt, 5
Spróbuj!
-4 bajty dzięki @Oliver!
-2 bajty dzięki @Shaggy!
Dane wejściowe to tablica 4-elementowa w następującym formacie:
Dane wyjściowe to tablica bitów.
źródło
rw
konwertuje nar("w")
redukuje, wielokrotnie otrzymując maks. To samo dotyczym¶
konwersji doU.m("===", ...)
. W każdym razie dzięki za wskazówki!kod maszynowy x86 (MMX / SSE1), 26 bajtów (4x int16_t)
kod maszynowy x86 (SSE4.1), 28 bajtów (4x int32_t lub uint32_t)
kod maszynowy x86 (SSE2), 24 bajty (4x float32) lub 27B na cvt int32
(Ostatnia wersja, która konwertuje int32 na liczbę zmiennoprzecinkową, nie jest idealnie dokładna dla dużych liczb całkowitych, które zaokrąglają do tej samej liczby zmiennoprzecinkowej. Przy wprowadzaniu liczby zmiennoprzecinkowej zaokrąglanie jest problemem osoby wywołującej, a funkcja ta działa poprawnie, jeśli nie ma NaN, identyfikując liczby zmiennoprzecinkowe, które = maksymalnie. Wersje całkowite działają dla wszystkich danych wejściowych, traktując je jak uzupełnienie ze znakiem 2).
Wszystkie działają w trybie 16/32/64-bit z tym samym kodem maszynowym.
Konwencja wywoływania stosu-argumentów umożliwia dwukrotne zapętlenie argumentów (znalezienie maksimum, a następnie porównanie), co może dać nam mniejszą implementację, ale nie próbowałem tego podejścia.
SIM86 x86 ma bitmapę wektor-> liczba całkowita jako pojedynczą instrukcję (
pmovmskb
lubmovmskps
pd), więc było to naturalne, mimo że instrukcje MMX / SSE mają co najmniej 3 bajty. Instrukcje SSSE3 i nowsze są dłuższe niż SSE2, a instrukcje MMX / SSE1 są najkrótsze. Różne wersjepmax*
(maksymalne upakowane pionowe maksimum) zostały wprowadzone w różnym czasie, przy czym SSE1 (dla rejestrów mmx) i SSE2 (dla rejestrów xmm) miały tylko podpisane słowo (16-bit) i bajt bez znaku.(
pshufw
Ipmaxsw
na MMX rejestry są nowe z Pentium III Katmai, tak naprawdę wymagają one SSE1, a nie tylko funkcji bitowy procesor MMX).Można to wywołać z poziomu C, podobnie jak
unsigned max4_mmx(__m64)
w systemie ABI systemu i386 V, który przekazuje__m64
argumentmm0
. (Nie x86-64 System V, który przechodzi__m64
wxmm0
!)Gdyby istniał
pmovmskw
, co zaoszczędziłobypacksswb
iand
(3 + 2 bajty). Nie potrzebujemy,and eax, 0x0f
ponieważpmovmskb
w rejestrze MMX już zeruje górne bajty. Rejestry MMX mają tylko 8 bajtów szerokości, więc 8-bitowy AL obejmuje wszystkie możliwe niezerowe bity.Gdybyśmy wiedzieli, że nasze dane wejściowe są nieujemne, moglibyśmy
packsswb mm1, mm0
wygenerować nieujemne bajty ze znakiem w górnych 4 bajtachmm1
, unikając potrzebyand
późniejszegopmovmskb
. Zatem 24 bajty.Pakiet x86 z podpisanym nasyceniem traktuje wejście i wyjście jako podpisane, więc zawsze zachowuje bit znaku. ( https://www.felixcloutier.com/x86/packsswb:packssdw ). Ciekawostka: pakiet x86 z niepodpisanym nasyceniem nadal traktuje dane wejściowe jako podpisane. Być może dlatego
PACKUSDW
został wprowadzony dopiero w SSE4.1, podczas gdy pozostałe 3 kombinacje rozmiaru i podpisu istniały od MMX / SSE2.Lub z 32-bitowymi liczbami całkowitymi w rejestrze XMM (i
pshufd
zamiastpshufw
) każda instrukcja wymagałaby jeszcze jednego bajtu prefiksu, z wyjątkiemmovmskps
zastąpienia pack / i. Alepmaxsd
/pmaxud
potrzebujesz dodatkowego dodatkowego bajtu ...wywoływalne z C jak
unsigned max4_sse4(__m128i);
w x86-64 System V lub MSVC vectorcall (-Gv
), z których oba przekazują__m128i
/__m128d
/__m128
args w regach XMM, zaczynając odxmm0
.Lub jeśli zaakceptujemy dane wejściowe jako
float
, możemy użyć instrukcji SSE1.float
Format może reprezentować szeroki zakres liczb całkowitych ...Lub jeśli uważasz, że to wygina reguły zbyt daleko, zacznij od 3-bajtowego
0F 5B C0 cvtdq2ps xmm0, xmm0
do konwersji, tworząc 27-bajtową funkcję, która działa dla wszystkich liczb całkowitych, które są dokładnie reprezentowane jako binarne IEEE32float
, oraz dla wielu kombinacji danych wejściowych, do których trafiają niektóre dane wejściowe zaokrąglona do wielokrotności 2, 4, 8 lub dowolnej innej wartości podczas konwersji. (Więc jest o 1 bajt mniejszy niż wersja SSE4.1 i działa na każdym x86-64 z tylko SSE2.)Jeśli którekolwiek z danych zmiennoprzecinkowych to NaN, zauważ, że
maxps a,b
dokładnie to implementuje(a<b) ? a : b
, utrzymując element z drugiego argumentu na nieuporządkowanym . Może więc być możliwe zwrócenie z niezerową bitmapą, nawet jeśli wejście zawiera trochę NaN, w zależności od tego, gdzie się znajdują.unsigned max4_sse2(__m128);
kopiowanie i tasowanie
pshufd
jest nadal naszym najlepszym wyborem:shufps dst,src,imm8
odczytuje dane wejściowe dla dolnej połowydst
zdst
. I potrzebujemy nieniszczącego kopiowania i tasowania za każdym razem, więc 3-bajtowemovhlps
iunpckhps
/ pd są wyłączone. Gdybyśmy zawężali do skalarnego maksimum, moglibyśmy je wykorzystać, ale kosztuje to kolejną instrukcję do nadania przed porównaniem, jeśli nie mamy jeszcze maksimum we wszystkich elementach.Powiązane: SSE4.1
phminposuw
może znaleźć pozycję i wartość minimumuint16_t
w rejestrze XMM. Nie sądzę, aby wygrywanie odejmowało od 65535, aby używać go dla maksimum, ale zobacz odpowiedź SO na temat używania go dla maks. Bajtów lub liczb całkowitych ze znakiem.źródło
Python 3.8 (wersja wstępna) , 67 bajtów
Funkcja Lambda, która przyjmuje 4 liczby całkowite, bit przesuwa wynik boolean ich porównania do wartości maksymalnej z pewną pomocą nowego operatora przypisania Pythona 3.8 i zwraca bitową OR wyników
Wypróbuj online!
źródło
Java (JDK) , 78 bajtów
Wypróbuj online!
[a,b,c,d]
.źródło
05AB1E ,
32 bajtyDane wejściowe jako lista
[d,c,b,a]
, dane wyjściowe jako lista wartości logicznych.Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
JavaScript (ES6), 30 bajtów
Pobiera dane wejściowe jako
([d,c,b,a])
. Zwraca 4 wartości logiczne.Wypróbuj online!
źródło
Rubin ,
3422 bajtówPobiera dane wejściowe jako tablicę
[d, c, b, a]
i zwraca tablicę 1 i 0.Wypróbuj online!
źródło
Python 3 ,
59 bajtów66 bajtówWypróbuj online!
Pobiera dane wejściowe jako
[a,b,c,d]
i wyświetla listę wartości logicznych.Edytowano, aby była poprawną funkcją, a następnie zapisano 2 bajty, usuwając nawiasy wokół warunku.
źródło
1. Python 3.5, 90 bajtów
Przyjmuje ciąg liczb jako parametry. Zwraca ciąg „binarny”
przykład:
Wyjaśnienie
źródło
C # (interaktywny kompilator Visual C #) , 26 bajtów
Wypróbuj online!
Pobiera dane wejściowe w formacie
[d,c,b,a]
. Wszystkie pozostałe poniżej przyjmują dane jako[a,b,c,d]
C # (interaktywny kompilator Visual C #) , 35 bajtów
Zwraca an
IEnumerable<bool>
.Wypróbuj online!
C # (interaktywny kompilator Visual C #) , 39 bajtów
Zwraca an
IEnumerable<int>
, które reprezentują bity.Wypróbuj online!
C # (interaktywny kompilator Visual C #) , 49 bajtów
Drukuje ciąg binarny do STDOUT.
Wypróbuj online!
źródło
IEnumerable<bool>
jest do przyjęcia.PHP, 54 bajty
lub
pobrać dane wejściowe z argumentów wiersza poleceń. Uruchom je
-nr
lub wypróbuj online .źródło
Oto wersja JS, która generuje dane binarne
aktualizacja: Krótsza z łączeniem i bez wyszukiwania:
JavaScript (Node.js) , 42 bajty
Wypróbuj online!
Poprzednio, z wyszukiwaniem, 49 bajtów
Wypróbuj online!
Poprzednio, ze zmniejszeniem, 52 bajty:
Wypróbuj online!
źródło
[0,1][...]
ponieważ używasz już istniejącego indeksuC # (interaktywny kompilator Visual C #) , 51 bajtów
Wypróbuj online!
Powyżej znajduje się anonimowa funkcja, która generuje dane poprzez modyfikację argumentu . Dane wyjściowe to tablica 1 i 0.
Poniżej znajduje się funkcja rekurencyjna, która wypisuje liczbę całkowitą.
C # (interaktywny kompilator Visual C #) , 60 bajtów
Wypróbuj online!
Obie funkcje przyjmują dane wejściowe jako tablicę 4-elementową.
źródło
Python 2 , 35 bajtów
Wypróbuj online!
Pobiera dane w formacie [d, c, b, a] jak w przypadku odpowiedzi przyjętej przez Adám więc myślę, że jest OK.
Alternatywa dla 41, jeśli nie jest ...
Python 2 , 41 bajtów
Wypróbuj online!
źródło
Python 3 , 42 bajty
Po prostu zwraca listę, czy element jest wartością maksymalną dla każdego elementu na wejściu. -2 bajty, jeśli nie policzysz
f=
zadania.Wypróbuj online!
źródło
f=
nie liczy się, z wyjątkiem funkcji rekurencyjnychPartia, 92 bajty
Pobiera argumenty jako parametry wiersza polecenia w odwrotnej kolejności. Działa poprzez arytmetyczne obliczenie maksimum parametrów przez zmniejszenie ich i dodanie tylko dodatnich różnic od działającego maksimum, a następnie ponowne mapowanie każdego parametru, tym razem porównując go z maksimum. Dogodnie
cmd/cset/a
nie generuje nowego wiersza, więc wyniki są automatycznie łączone razem. Po%f%
prostu oszczędza 5 bajtów na tym, co byłoby powtarzaną konstrukcją.źródło