Wprowadzenie
W tym wyzwaniu powinieneś podzielić liczbę całkowitą na dwie części. Ponieważ nikt nie lubi kupować mniejszego kawałka ciasta, Twoim celem jest zachowanie jak największej uczciwości. Na przykład, jeśli chcesz podzielić liczbę całkowitą 7129
na dwie części, możesz to zrobić na 3 sposoby.
7,129
, 71,29
I 712,9
są wszystkie możliwości, ale 71,29
jest najpiękniejszy sposób dzieląc go na dwie części, ponieważ minimalizuje różnicę między nimi:
7 129 -> |7-129| = 122
71 29 -> |71-29| = 42
712 9 -> |712-9| = 703
Wyzwanie
Podając liczbę całkowitą określ najlepszy możliwy sposób podziału na partycje, jak opisano powyżej i zgłoś wynikową różnicę.
Zasady
- Dzielenie ma sens tylko w przypadku liczb całkowitych o długości co najmniej dwóch, wartość wejściowa zawsze będzie wynosić ≥ 10
- Dane wejściowe mogą być liczbą całkowitą, listą cyfr lub łańcuchem
- Nie musisz obsługiwać nieprawidłowych danych wejściowych
Przypadki testowe
Musisz tylko zgłosić wynikową różnicę, partycjonowanie jest tutaj tylko dla ilustracji:
10 -> 1,0 -> 1
11 -> 1,1 -> 0
12 -> 1,2 -> 1
13 -> 1,3 -> 2
101 -> 1,01 -> 0
128 -> 12,8 -> 4
313 -> 3,13 -> 10
1003 -> 1,003 -> 2
7129 -> 71,29 -> 42
81128 -> 81,128 -> 47
999999 -> 999,999 -> 0
9999999 -> 999,9999 or 9999,999 -> 9000
05AB1E , 9 bajtów
Kod:
Wykorzystuje kodowanie 05AB1E . Wypróbuj online!
Wyjaśnienie
źródło
£
z°‰
was nie będzie musiała¤â
już.Python 2 , 64 bajty
Wypróbuj online!
źródło
Perl 6 , 40 bajtów
Sprawdź to
Rozszerzony:
źródło
C, 94 bajty
Wypróbuj online!
źródło
Python 2 , 51 bajtów
Wypróbuj online!
źródło
Prolog (SWI) ,
195189154117112 bajtów35 bajtów zaoszczędzonych dzięki Emingi
Wypróbuj online!
To moja pierwsza próba gry w golfa w prologu, więc może być trochę przerażająca. Oto jak to działa.
Na najwyższym poziomie mamy
*
.*
bierzeA
iH
określa, czyH
jest to najmniejszy sposób podziałuA
.Pierwsza linia tutaj wykorzystuje technikę z tego wpisu SO , aby zasadniczo wykonać mapę predykatu
r(A)
na liczbach całkowitych od0
doA
. Ponieważr
potwierdza wartości każdej partycji, daje nam to wartości wszystkich możliwych partycji oraz całe mnóstwo dodatkowych śmieci. Wszystkie te partycje będą przechowywane wL
dowolnej kolejności. Po wykonaniu tej czynności sortujemy listę w celu znalezienia najmniejszego elementu. Następnie używamy cięcia, aby zapobiec nawrotom.Następnie mamy definicję
r
. Najpierwr
oblicza dwa wyniki podziału, nazywając jeX
iY
.Twierdzimy, że
C
to ich różnica i jest pozytywna.źródło
X is div(A,10**B),Y is div(A,10**B)
który zawsze daC=0
(znaczenieH
zawsze będzie równe 0 ). PowinienemY is mod(A,10**B)
przypuszczać.r(A,B,C):-Z is 10**B,divmod(A,Z,X,Y),C is abs(X-Y).
zapisać 32 bajty (jeśli używasz przynajmniej prologu SWI, nie jesteś pewien innych wersji).A*H
zamiastl(A,H)
zapisywać kolejne 3. A jeśli używasz SWI, możesz dodać link TIO,!
tego? W tym momencie nie powinno być żadnego cofania.,!
że nie będzie to konieczne, ale kiedy testuję program, wykonuje on śledzenie wstecz. Wydaje się, że wypróbowuje każde możliwe zamówienie,L
a następnie sortuje je wszystkie. Oznacza to, że da te sameA!
czasy odpowiedzi .Haskell ,
6865 bajtówWypróbuj online!
Wyjaśnienie
źródło
Węgiel drzewny , 14 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Dogodnie mogę skorzystać z 2-argowego wariantu
Slice
. Wyjaśnienie:źródło
Galaretka ,
98 bajtówWypróbuj online!
-1 bajt dzięki Dennisowi. Dane wejściowe to lista cyfr.
Wyjaśnienie
źródło
Funky ,
15913499 bajtówWłaściwie dopasowanie specyfikacji wydaje się krótsze.
Wypróbuj online!
źródło
Siatkówka , 36 bajtów
Wypróbuj online!
Wyjaśnienie
To generuje wszystkie możliwe partycje na osobnych liniach, a także linię końcową z oryginalnym wejściem.
Konwertuj każdy numer w każdej partycji na unarny.
Usuń maksymalną i równą liczbę
1
s z obu części każdej partycji (tj. Usuń minimum i odejmij od maksimum, co daje absolutną różnicę).Sortuj linie.
Policz
1
s w pierwszym wierszu, co daje minimalną różnicę bezwzględną.źródło
J ,
32, 2723 bajtów-5 bajtów dzięki FrownyFrog! -4 bajty, jeśli wejście jest ciągiem.
Wypróbuj online!
Oryginał: Pobiera liczbę jako dane wejściowe
Jak to działa:
Wypróbuj online!
źródło
JavaScript (ES6), 64 bajty
Pobiera dane wejściowe jako ciąg.
Przypadki testowe
Pokaż fragment kodu
Skomentował
Nierekurencyjne (ES7), 65 bajtów
Pobiera dane wejściowe jako ciąg.
Przypadki testowe
Pokaż fragment kodu
Skomentował
Uwaga : W obu wersjach
l
jest wymuszany na ciąg znaków przy pierwszej iteracji. Zwykle powinniśmy uważać na wiodące zera w literałach liczbowych:0123 - 10 === 73
ponieważ0123
jest on analizowany jako wartość ósemkowa (jest to obecnie przestarzałe, ale nadal obowiązuje w trybie nie ścisłym). Ale'0123' - '10' === 113
wiodące zero jest tym razem ignorowane. Brzmi to rozsądnie.Ze specyfikacji operacji abstrakcyjnej
ToNumber
zastosowanej do łańcucha:źródło
APL (Dyalog) , 27 bajtów
Wypróbuj online!
W jaki sposób?
¯1+≢⍵
- długośćn
minus 1∘.=⍨⍳
- macierz jednostkowa1,
- prepend1
dla każdego wiersza↓
- podzielone na rzędy⊂∘⍵¨
- dla każdego podziel ciąg według niego↑
- spłaszczyć-/
- zmniejszaj każdą parę odejmując|
- przyjąć wartości bezwzględne⌊/
- minimumAPL (Dyalog) , 35 bajtów
Wypróbuj online!
źródło
Galaretka , 11 bajtów
Wypróbuj online!
-3 bajty dzięki dylnan
Jak to działa
źródło
L=2$$Ðf
naṖLÐṂ
w tym przypadkuPython 2 , 58 bajtów
Wypróbuj online!
źródło
Pyth , 15 bajtów
Wypróbuj online!
źródło
MATL , 15 bajtów
Dane wejściowe to ciąg znaków reprezentujący liczbę całkowitą.
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
źródło
Wolfram Language (Mathematica) , 66 bajtów
Pobiera listę cyfr.
Wypróbuj online!
źródło
Czysty ,
10683 bajtówDefiniuje funkcję
@
, biorąc ciąg.Przeważnie oczywistym, jedynym trudnym bitem jest
f=toInt o(%)n
: bierzetoInt
klasę funkcji i tworzy ją (o
) z klasą operatora wycinanego curry (%
) już dostarczoną z pierwszym argumentem (n
). Ponieważ istnieje tylko jeden typ (String
równoważny{#Char}
), który ma przeciążenia dla obu%
itoInt
linia faktycznie się kompiluje, podczas gdy normalnie trudno jest komponować funkcje podczas gry w golfa z powodu braku informacji kontekstowych przekazywanych kompilatorowi.Wypróbuj online!
źródło
Galaretka , 12 bajtów
Monadyczny link pobierający listę cyfr i zwracający liczbę całkowitą.
Wypróbuj online!
W jaki sposób?
źródło
Pyth, 10 bajtów
Zestaw testowy
Pobiera dane wejściowe jako ciąg.
Wykorzystuje jedną z nowszych funkcji Pytha, a mianowicie zastosowanie funkcji do listy domyślnie do mapowania funkcji na liście, jeśli nie zdefiniowano żadnego innego zachowania. Oznacza to, że
v
zastosowane do listy list ciągów ocenia wszystkie ciągi.Zauważ, że lista podziałów pozwala na podział na 1 sztukę, ale wartość tego zawsze będzie większa niż minimum, więc jest bezpiecznie ignorowana.
źródło
Tcl , 116 bajtów
Wypróbuj online!
Wyjaśnienie
Działa przy użyciu sztuczki wyrażenia regularnego, pozwalając na zdegenerowany końcowy przypadek, który zawsze będzie obliczany na wartość większą niż minimalna różnica. Dla „12345” wartości są następujące:
źródło
lmap
zamiastforeach
: tio.run/##LYuxCsMgFEV3v@IOb1DaZO8/ZHItDlolBEx4qC2FkG9/…Rubinowy , 44 bajty
Wypróbuj online!
źródło
APL + WIN, 31 bajtów
Monituje o wpisanie na ekranie liczby całkowitej jako ciągu.
Wyjaśnienie:
źródło
Perl 5 ,
5141 + 1 (-p
) = 42 bajtyWypróbuj online!
zainspirowany komentarzem @ Nahuel-Fouilleul
źródło
$\--;$d=abs$``-$',$\=$\<0|$d<$\?$d:$\while//g}{
C # (.NET Core) ,
112107 + 18 = 125 bajtówWypróbuj online!
Liczba obejmuje 18 bajtów w
using System.Linq;
. Pobiera dane wejściowe jakostring
.źródło
string.Remove
może zaoszczędzić ci kilka bajtówCommon Lisp, 131 bajtów
Pierwszy raz brałem udział w Code Golf i postanowiłem skorzystać z Lisp, ponieważ lubię to.
Oto moje rozwiązanie:
Dane wejściowe muszą być ciągiem, a nie liczbą całkowitą lub listą.
źródło