Wprowadzenie
Znajomy zadał dziś to pytanie w nieco inny sposób - „Czy jedno polecenie [Python] może określić największą z liczb całkowitych ORAZ, że nie są one równe?”.
Chociaż nie znaleźliśmy sposobu na zrobienie tego w rozsądnych definicjach „jednego polecenia”, pomyślałem, że może to być fajny problem z golfem.
Wyzwanie
„ Zwraca największą z liczb całkowitych, jeśli-i-tylko-jeśli nie wszystkie są równe. ”
Dokładniej:
Biorąc pod uwagę ciąg zawierający tylko listę liczb całkowitych oddzielonych przecinkami:
- Jeśli wszystkie są równe, nic nie zwraca / zwraca
- W przeciwnym razie zwracaj / wysyłaj największe
Zasady
- Dane wejściowe muszą być ciągiem zawierającym tylko listę liczb całkowitych oddzielonych przecinkami
- Dane wyjściowe muszą być albo niczym (brak danych wyjściowych), albo też największym elementem z danych wejściowych, przedstawionym tak, jak w danych wejściowych
Wpisy mogą być pełnym programem lub tylko funkcją, pod warunkiem, że podasz sposób ich przetestowania!
Założenia
- Załóżmy, że elementy listy wprowadzania mogą mieć więcej niż jedną cyfrę, ale nie mogą być większe niż (2 32-1 )
- Załóżmy, że lista wejściowa zawiera nie więcej niż milion elementów
- Załóż, że dane wejściowe nie będą zawierać wartości ujemnych
- Załóż, że dane wejściowe nigdy nie będą puste
Aby uniknąć wątpliwości, wyjaśnienie wyzwania podane tuż po „Bardziej szczegółowo” zastępuje oświadczenie o wyzwaniu powyżej („Zwróć największe ...”).
Przykłady
(1) Wszyscy równi:
Input: 1,1
Output:
(2) Odmienne:
Input: 1,2
Output: 2
(3) Zero !:
Input: 0,0,0,0,0,0,0,1,0,0
Output: 1
(4) Losowo:
Input: 7,3,8,4,8,3,9,4,6,1,3,7,5
Output: 9
(5) Większe liczby, większa lista:
Input: 627,3894,863,5195,7789,5269,8887,3262,1448,3192
Output: 8887
Dodatkowe przykłady:
(6) Wszystkie równe, większa lista:
Input: 7,7,7,7,7,7,7,7,7
Output:
(7) Wszystkie równe, większa lista, większe liczby:
Input: 61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976
Output:
(8) Nie równa, większa lista, większe liczby:
Input: 96185,482754,96185,96185,96185,96185,96185,96185,7,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,961185,96185,96185,96185
Output: 961185
Punktacja
Tak code-golf
więc wygrywa kod z najmniejszą liczbą bajtów!
None
w pythonie) zamiast niczego? Ponadto, dlaczego dane wejściowe muszą być ciągiem, a nie listą? A co rozumiesz przez największy element z wejścia, reprezentowany tak, jak jest na wejściu7,3,7,2
.,
do danych wejściowych?Odpowiedzi:
R ,
5037 bajtów-33 bajtów dzięki digEmAll! -13 bajtów dzięki rturnbull!
Wypróbuj online!
źródło
MathGolf , 5 bajtów
Wypróbuj online!
Wyjaśnienie
Działa to, ponieważ zarówno operator maksymalny, jak i odrzucenie od lewego operatora nie robią nic dla pustych list. Cóż, operator max usuwa listę i nie wypycha niczego dla pustych list.
Może to być 4 bajty, jeśli dane wejściowe można by traktować jako listę.
źródło
Perl 6 ,
26 2322 bajtów-1 bajt dzięki nwellnhof
Wypróbuj online!
Zwraca pusty kupon, jeśli wszystko jest równe.
Wyjaśnienie
źródło
EVAL
Sztuką jest schludny i można nawet zapisać bajt zo&EVAL
.if +.Set
działałoby?Galaretka , 4 bajty
Pełny program akceptujący dane wejściowe jako argument wiersza poleceń (niecytowany), który wypisuje wymagane dane wyjściowe
(Należy pamiętać, że dotyczy to: pustych danych wejściowych jak
, danych wejściowych dla pojedynczego elementu, takich jak dane wejściowe dla
7
wielu elementów, jak na7,8,7
przykład specyfikacja.Wypróbuj online!
W jaki sposób?
źródło
APL (Dyalog Classic) , 6 bajtów
Wypróbuj online!
pociąg obliczenie maksimum (
⌈/
) (bez~
) Do minium (⌊/
) zmienił się w matrycy (⍪
)jeśli wejście zawiera tylko jeden odrębny element,
⌈/~⌊/
będzie puste i⍪
zwróci macierz 0 × 1, która jest renderowana jako nicw przeciwnym razie
⌈/~⌊/
będzie to wektor 1-elementowy i⍪
będzie to macierz 1x1 (wizualnie nie do odróżnienia od skalara), która zawiera maksimumźródło
CJam ,
1613 bajtówWypróbuj online!
źródło
Python 2 , 37 bajtów
wyjścia do stderr (debugowanie na tio).
Wypróbuj online!
źródło
Python 2 ,
4241 bajtówWypróbuj online!
źródło
element, element, ...
. tzn. nie musi być ujęte w nawiasy.input
domyślnieeval
s cokolwiek łańcuch jest przekazywany ze standardowego wejścia.,
, ponieważ twoje rozwiązanie zawiera błędy, jeśli dane wejściowe są tylko jedną liczbą!=
a,>
ponieważ dane wejściowe nigdy nie będą puste?Haskell ,
777561 bajtówWypróbuj online!
('[':).(++"]")
bierze ciąg (np."1,2,1,3"
) i zamyka go w nawiasach kwadratowych ("[1,2,1,3]"
). Następnieread
zamienia ciąg w listę liczb całkowitych ([1,2,1,3]
).Funkcja
f
używa tej wskazówki dla krótszych warunków, jeśli jednym z wyników jest pusta lista.any(/=a!!0+0)a
sprawdza, czy listaa
zawiera dowolny element, który nie jest równy pierwszemu elementowia!!0
. (+0
Potrzebny jest taki, któryread
wie, że musi szukać listy liczb.) Jeśli wszystkie elementy są równe, to wynik testuFalse
i zwracany jest pusty ciąg znaków. W przeciwnym razieshow(maximum a)
zwracana jest maksymalna liczba list przekonwertowanych na ciąg.źródło
Czerwony, 81 bajtów
Podobnie jak w przypadku rozwiązania R, duża część kodu obsługuje ciąg wejściowy „1,1,2,44,1”. Jeśli możemy mieć to jako blok, np .::
x: [1 1 2 44 1]
, możemy to zrobić w 41 bajtach:źródło
sort x: unique load replace/all input","" "if 1 <>length? x[last x]
dla 67 bajtów. Niestetyinput
nie działa w TIO. Jeśli sprawisz, że będzie to func, to działa dobrze w TIO: 73 bajtyAPL (Dyalog Unicode) , 12 bajtów
Pełny program Monituje o ciąg znaków ze standardowego wejścia.
Wypróbuj online!
⎕
monituj i oceniaj wyrażenie (przecinki łączą liczby w listę){
…}
Zastosuj następującą anonimową lambda (⍵
argument; lista liczb):1≠
[jeśli] 1 różni się od…≢
zestawienie…∪
unikalne liczby w…⍵
Lista:
następnie⌈/
zwróć maks. w poprzek (podświetlona maksymalna redukcja)…⍵
Lista[else: nic nie rób]
źródło
⌈/~⌊/
JavaScript (Node.js) , 49/53 bajtów
Moja oryginalna wersja
.every()
, 53 bajtówCzy funkcja zwracająca „” liczy się jako brak wyjścia? Jasne, że można to poprawić po ...
Wypróbuj online!
Ulepszona wersja wykorzystaniem
Set()
przez Kudłaty , 49 bajtówWypróbuj online!
źródło
Neim , 4 bajty
Wyjaśnienie:
Wypróbuj online!
źródło
Oktawa , 28 bajtów
Zwraca maksimum (liczbę, która jest macierzą 1x1) lub pustą (1x0) macierz.
Wypróbuj online!
źródło
Japt, 16 bajtów
Byłoby to 9, gdyby nie niepotrzebnie ścisły format wejściowy, 7, jeśli zgłoszenie błędu jest liczone jako brak wyjścia.
Zakłada, że ciąg zawiera co najmniej 2 liczby całkowite.
Spróbuj
źródło
Common Lisp, 102 bajty
Wypróbuj online!
Rozmiar wynika głównie z wprowadzania danych; przy wprowadzaniu jako regularnej liście długość zmniejsza się do 46 bajtów:
źródło
XPath 3.1, 54 bajty
z ciągiem wejściowym jako elementem kontekstu:
Można zmniejszyć o jeden znak, jeśli pozwalasz kontekstowi na powiązanie krótszego prefiksu niż „xs” z przestrzenią nazw schematu XML.
Objaśnienie: pobiera ciąg wejściowy, tokenizuje na separatorze „,”, stosuje się
xs:int()
do każdego tokenu do konwersji na liczbę całkowitą, oblicza maksimum sekwencji, wyprowadza maksimum pod warunkiem, że predykat$t!=$t
jest prawdziwy. Jeśli A i B są sekwencjami, toA!=B
jest prawdą, jeśli istnieje para elementów (a z A, b z B), takich jaka!=b
.Jeśli dane wejściowe można podać jako ciąg liczb całkowitych $ s zamiast ciągu oddzielonego przecinkami, wówczas rozwiązanie zmniejsza się do
(15 bajtów - co może być najkrótszym rozwiązaniem w języku, który nie jest przeznaczony do zwięzłości)
UWAGA : nie spełnia to wymogu „reprezentowanego tak, jak jest na wejściu” - jeśli na wejściu jest liczba całkowita z zerami wiodącymi lub znakiem plus, zostaną one utracone. Podejrzewam, że dotyczy to również wielu innych rozwiązań.
źródło
K4 ,
3835 bajtówPrzypadki testowe:
Nie jestem biegły w żadnym z wariantów K dostępnych na TiO, więc nie ma dostępnego przykładu online, spróbuję jednak wymyślić jeden
Wyjaśnienie
Jeśli zastanawiasz się, dlaczego niektóre operacje są wykonywane przed innymi, K4 nie ma pierwszeństwa operatora, zamiast tego interpretuje od prawej do lewej (chociaż możesz użyć nawiasów dla pierwszeństwa). Wyrażenia rozdzielone średnikami.
Prawdopodobnie można go bardziej pograć w golfa, a nie fanem konieczności korzystania z tej prowizorycznej funkcji max na końcu.
EDYCJA: Jeśli przecinki w danych wyjściowych stanowią problem, można to naprawić za pomocą dwóch dodatkowych bajtów:
Biorąc w sumie
4037, ale przecinek przed liczbą oznacza po prostu, że jest to lista pojedynczego elementu w przeciwieństwie do atomu.źródło
PHP (<= 5,6)
6474 bajtyUruchom jako potok
-nR
lub przetestuj go onlinesplit
został usunięty w PHP7, ale ponieważ musiałem dodać 10, aby naprawić kilka problemów, warto było użyć zamiast tego wexplode
przybliżeniu w tym przypadku.źródło
Also this doesn't work when there are more than one element with the max value
Nie rozumiem, coIf they are all equal, return/output nothing
toIf they are equal, return/output nothing
znaczy, jeśli jest więcej niż jeden do wypisania pustego. Dodanie==count($a)
naprawia to. Ponieważarray_count_values
liczy się, ile razy pojawia się w tablicy, jeśli jest to równa całkowitej liczbie elementów w tablicy, wówczas wypisuje „” w przeciwnym razie wypisuje maksimum$argn
jej bierze od standardowego (to zostało użyte w wielu odpowiedziach golfa) Mogę podać przykłady nie tylko mojego, ale innych użytkowników.Japt
-hF
, 8 bajtówSpróbuj
-3
bajty, jeśli dane wejściowe można przyjąć jako tablicę.źródło
05AB1E ,
98 bajtów-1 bajt dzięki @Cowabunghole .
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
',¡ZsËiõ
, oszczędzając 1 bajtPython 2 , 44 bajty
Wypróbuj online!
źródło
eval
w Pythonie konwertuje ciąg rozdzielany przecinkami na listę?k=input()
i uzyskać ten sam wynik.Ohm v2 , 9 bajtów
Wypróbuj online! Wyjaśnienie:
źródło
Węgiel drzewny , 15 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Podziel dane wejściowe przecinkami i wyrzuć każdą wartość na liczbę całkowitą.
Sprawdź, czy maksymalna wartość jest większa niż wartość minimalna.
Jeśli tak, wyrzuć maksymalną wartość na ciąg i wydrukuj.
źródło
Mathematica, 43 bajty
Czysta funkcja. Pobiera na wejściu ciąg rozdzielany przecinkami i zwraca liczbę lub
Null
. Uważam, że jest to poprawne, ponieważNull
nie jest przedstawione graficznie:źródło
C (gcc) , 91 bajtów
Wypróbuj online!
Degolf
źródło
M(char*s)
zamiastM(s)char*s;
iindex()
zamiaststrchr()
Pyth, 7 bajtów
Wypróbuj online!
Wszystkie przypadki testowe (nieco inny kod dla lepszego formatowania wyjściowego)
Ponieważ Pyth jest oparty na Pythonie, dane wejściowe użytkownika są zawsze interpretowane jako ciąg znaków, który następnie można przekazać
Wyjaśnienie:eval()
. Wszystkie programy Pyth są automatycznie uruchamianeQ=eval(input())
jako pierwsza instrukcja.źródło
Java (JDK) , 101 bajtów
Wypróbuj online!
Wyjaśniono
Rozwiązanie premiowe!
Mimo dołożenia wszelkich starań nie mogłem uzyskać tego rozwiązania przy użyciu wyrażeń regularnych i strumieni do mniej niż 105 bajtów, ale naprawdę podobała mi się jego elegancja, dlatego musiałem wyróżnić ją;
źródło
?
) i zwykłej pętli i powrotu (zamiast strumienia).MATL ,
159 bajtówWypróbuj online!
Wiele przypadków testowych
Staram się tylko, żeby moje kotlety MATL nie zardzewiały!
Edytować : w końcu zardzewiały; zapisane 6 bajtów, dzięki @LuisMendo.
Wyjaśnienie
źródło
Pip , 13 bajtów
Wypróbuj online!
Wykorzystuje podejście z rozwiązania APL firmy ngn :
Pierwsze 5 bajtów
a^:',
podzieliło łańcuch wejściowy na przecinki.Alternatywne 13-bajtowe rozwiązania:
źródło