Bądź jak najbardziej sprawiedliwy


33

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ą 7129na dwie części, możesz to zrobić na 3 sposoby.

7,129, 71,29I 712,9są wszystkie możliwości, ale 71,29jest 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

Odpowiedzi:


11

Brachylog , 12 11 bajtów

Moja pierwsza odpowiedź Brachylog

Weź dane jako ciąg

{~cĊịᵐ-ȧ}ᶠ⌋

Wypróbuj online!

Wyjaśnienie:

będzie f ind wszystkie możliwe wyjścia dla orzeczenia w {…}i przechowywać je w postaci listy. ~cmówi, że wyjście to lista, gdy c oncatenated jest równa wejściu. Dalej Ċzapewnia, że ​​wyjście ~cma długość 2.

ịᵐkonwertuje oba elementy wyjścia na liczby całkowite (pozbywa się to wiodących 0s), przyjmuje bezwzględną różnicę dwóch elementów.

Gdy mamy już listę wszystkich możliwych wyników, otrzymujemy minimum elementu z


10

Haskell , 48 bajtów

f n=minimum[abs$n`div`10^k-n`mod`10^k|k<-[1..n]]

[1..n] czyni to zbyt wolnym dla większych przypadków testowych.

Wypróbuj online!


Dobra robota! Stałem tak jednostronnie za pomocą ciągów, że zapomniałem, że mogę użyć arytmetyki.
Wheat Wizard

9

05AB1E , 9 bajtów

Kod:

ā¤âε£ÆÄ}W

Wykorzystuje kodowanie 05AB1E . Wypróbuj online!

Wyjaśnienie

ā            # Get the array [1, 2, .., len(input)]
 ¤â          # Cartesian product with the last element, (e.g. for input 12345:
               [[1, 5], [2, 5], [3, 5], [4, 5], [5, 5]])
   ε   }     # For each element:
    £        #   Get the substrings (12345 [3, 5] £ --> [123, 45])
     Æ       #   Reduce by subtraction
      Ä      #   Get the absolute value
        W    # Take the minimum of all results

1
Jeśli zastąpić £z °‰was nie będzie musiała ¤âjuż.
Emigna


7

Perl 6 , 40 bajtów

{min map {abs [-] @$_},m:ex/^(.+)(.+)$/}

Sprawdź to

Rozszerzony:

{  # bare block lambda with implicit parameter 「$_」

  min
    map
      {
        abs
          [-]    # reduce with &infix:«-»
            @$_  # the input of this inner block as a Positional
      },

      # split 「$_」 into 2 in every possible way
      m
      :exhaustive
      /^ (.+) (.+) $/
}



6

Prolog (SWI) , 195 189 154 117 112 bajtów

35 bajtów zaoszczędzonych dzięki Emingi

A*H:-findall(X,(between(0,A,I),r(A,I,X)),L),sort(L,[H|_]),!.
r(A,B,C):-Z is 10**B,divmod(A,Z,X,Y),C is abs(X-Y).

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 *. *bierze Ai Hokreśla, czy Hjest to najmniejszy sposób podziału A.

    A*H:-
      findall(X,(between(0,A,I),call(r,A,I,X)),L),
      sort(L,[H|_]),
      !.

Pierwsza linia tutaj wykorzystuje technikę z tego wpisu SO , aby zasadniczo wykonać mapę predykatu r(A)na liczbach całkowitych od 0do A. Ponieważ rpotwierdza 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 w Ldowolnej 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. Najpierw roblicza dwa wyniki podziału, nazywając je Xi Y.

r(A,B,C):-
  Z is 10**B,
  divmod(A,Z,X,Y),
  C is abs(X-Y).

Twierdzimy, że Cto ich różnica i jest pozytywna.

  C is abs(X-Y).

Wydaje się, że jest tu błąd, X is div(A,10**B),Y is div(A,10**B)który zawsze da C=0(znaczenie Hzawsze będzie równe 0 ). Powinienem Y is mod(A,10**B)przypuszczać.
Emigna,

W drugim rzędzie można również 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).
Emigna

Pierwszy wiersz może zaczynać się na przykład, A*Hzamiast l(A,H)zapisywać kolejne 3. A jeśli używasz SWI, możesz dodać link TIO
Emigna

Poza tym nie sądzę, że potrzebujesz ,!tego? W tym momencie nie powinno być żadnego cofania.
Emigna,

@Emigna Dzięki za wskazówki, wkrótce je wdrożę. Pomyślałem również, ,!ż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, La następnie sortuje je wszystkie. Oznacza to, że da te same A!czasy odpowiedzi .
Kreator pszenicy,

5

Haskell , 68 65 bajtów

f x=minimum[abs$read(take i x)-read(drop i x)|i<-[1..length x-1]]

Wypróbuj online!

Wyjaśnienie

minimum              -- Minimum of ...
 [abs$               -- The absolute value of ...
  read(take i x)     -- The first i characters of x
  -                  -- Minus ...
   read(drop i x)    -- The last i characters of x
 |i<-[1..length x-1] -- From i=1 to i=length x - 1
 ]

4

Węgiel drzewny , 14 bajtów

I⌊Eθ↔⁻I…θκI✂θκ

Wypróbuj online! Link jest do pełnej wersji kodu. Dogodnie mogę skorzystać z 2-argowego wariantu Slice. Wyjaśnienie:

   θ            Input string
  E             Map over characters
        θ   θ   Input string
         κ   κ  Current map index
       …        Mold to length (i.e. head)
           ✂    Slice (i.e. tail)
      I   I     Cast to integer
     ⁻          Subtract
    ↔           Absolute value
 ⌊              Minimum
I               Cast to string
                Implicitly print

4

Galaretka , 9 8 bajtów

ḌÐƤḊạḌƤṂ

Wypróbuj online!

-1 bajt dzięki Dennisowi. Dane wejściowe to lista cyfr.

Wyjaśnienie

ḌÐƤḊạḌƤṂ
ḌÐƤ          Convert to integer from decimal for all Ƥostfixes. [1,2,3]->[123,23,3]
   Ḋ         Remove the first element ->[23,3]
     ḌƤ      Convert to integer from decimal for all Ƥrefixes [1,2,3]->[1,12,123]
    ạ        Absolute difference. [23,3]ạ[1,12,123]->[22,9,123]
       Ṃ     Minimum

Hm, twoje wyjaśnienie nie odzwierciedla tego, co faktycznie robi twój kod.
Erik the Outgolfer,

@EriktheOutgolfer Czy jest to część „usuń ostatni element”, kiedy powinna powiedzieć „usuń pierwszy element”? Naprawię to, dzięki za zwrócenie na to uwagi
dylnan

3

Funky , 159 134 99 bajtów

s=>{S={}fori=1i<#s i++{S[#S]=(((v=s::sublist)(0,i)::reduce@..-v(i)::reduce@..)^2)^.5};math.min...S}

Właściwie dopasowanie specyfikacji wydaje się krótsze.

Wypróbuj online!


3

Siatkówka , 36 bajtów

\B
,$'¶$`
\d+
$*
(1*),\1

Om`^.*
\G1

Wypróbuj online!

Wyjaśnienie

\B
,$'¶$`

To generuje wszystkie możliwe partycje na osobnych liniach, a także linię końcową z oryginalnym wejściem.

\d+
$*

Konwertuj każdy numer w każdej partycji na unarny.

(1*),\1

Usuń maksymalną i równą liczbę 1s z obu części każdej partycji (tj. Usuń minimum i odejmij od maksimum, co daje absolutną różnicę).

Om`^.*

Sortuj linie.

\G1

Policz 1s w pierwszym wierszu, co daje minimalną różnicę bezwzględną.


3

J , 32, 27 23 bajtów

-5 bajtów dzięki FrownyFrog! -4 bajty, jeśli wejście jest ciągiem.

[:<./}:@(".\)|@-1}.".\.

Wypróbuj online!

Oryginał: Pobiera liczbę jako dane wejściowe

(".\(}:@[([:<./|@-)}.@])".\.)@":

Jak to działa:

                             @": - convert the number to list of chars and
(".\                    ".\.)    - form all prefixes/suffixes and convert them to numbers
    (}:@[          }.@])         - drop the last prefix / first suffix
         (     |@-)              - find the absolute differences
          [:<./                  - find the minimum

Wypróbuj online!


@FrownyFrog - Dzięki!
Galen Iwanow,

3

JavaScript (ES6), 64 bajty

Pobiera dane wejściowe jako ciąg.

f=([c,...s],l=0)=>c?Math.min(Math.abs((l+=c)-s.join``),f(s,l)):l

Przypadki testowe

Skomentował

f = ([c, ...s],           // c = current character, s = array of remaining characters
                l = 0) => // l = left part of the integer, initialized to 0 (see footnote)
  c ?                     // if c is defined:
    Math.min(             //   return the minimum of:
      Math.abs(           //     1) the absolute value of:
        (l += c) -        //       the updated left part
        s.join``          //       minus the right part
      ),                  //     end of Math.abs()
      f(s, l)             //     2) the result of a recursive call
    )                     //   end of Math.min()
  :                       // else:
    l                     //   stop the recursion by returning l (now equal to the input)

Nierekurencyjne (ES7), 65 bajtów

Pobiera dane wejściowe jako ciąg.

s=>Math.min(...[...s].map(c=>((l+=c)-s.slice(++i))**2,i=l=0))**.5

Przypadki testowe

Skomentował

s =>                            // given s
  Math.min(...                  // get the minimum value in the result of this map():
    [...s].map(c =>             //   for each character c in s:
      ((l += c)                 //     append c to l (the left part)
                - s.slice(++i)) //     and subtract the right part from it
      ** 2,                     //     square the result
      i =                       //     start with i = 0 (split position)
      l = 0                     //     and l = 0 (left part, see footnote)
    )                           //   end of map()
  )                             // end of Math.min()
  ** .5                         // return the square root of the smallest square

Uwaga : W obu wersjach ljest wymuszany na ciąg znaków przy pierwszej iteracji. Zwykle powinniśmy uważać na wiodące zera w literałach liczbowych: 0123 - 10 === 73ponieważ 0123jest on analizowany jako wartość ósemkowa (jest to obecnie przestarzałe, ale nadal obowiązuje w trybie nie ścisłym). Ale '0123' - '10' === 113wiodące zero jest tym razem ignorowane. Brzmi to rozsądnie.

Ze specyfikacji operacji abstrakcyjnej ToNumberzastosowanej do łańcucha:

StringNumericLiteral, który jest dziesiętny, może mieć dowolną liczbę początkowych 0 cyfr


3

APL (Dyalog) , 27 bajtów

{⌊/|-/⍎¨↑⊂∘⍵¨↓1,∘.=⍨⍳¯1+≢⍵}

Wypróbuj online!

W jaki sposób?

¯1+≢⍵- długość nminus 1

∘.=⍨⍳ - macierz jednostkowa

      1,∘.=⍨⍳3
1 1 0 0
1 0 1 0
1 0 0 1

1,- prepend 1dla każdego wiersza

- podzielone na rzędy

⊂∘⍵¨ - dla każdego podziel ciąg według niego

      1 0 1 0  '7129'
┌──┬──┐
7129
└──┴──┘

- spłaszczyć

-/ - zmniejszaj każdą parę odejmując

| - przyjąć wartości bezwzględne

⌊/ - minimum


APL (Dyalog) , 35 bajtów

{⌊/|-/⍎¨(⊂∘⍵⍤1)1,∘.=⍨⍳¯1+≢⍵}

Wypróbuj online!


3

Galaretka , 11 bajtów

ŒṖṖLÐṂḌạ/€Ṃ

Wypróbuj online!

-3 bajty dzięki dylnan

Jak to działa

ŒṖṖLÐṂḌạ/€Ṃ - Main link. Argument: n (integer)    e.g    7129
ŒṖ          - Partitions of n's digits;                  [[7, 1, 2, 9], [7, 1, [2, 9]], [7, [1, 2], 9], [7, [1, 2, 9]], [[7, 1], 2, 9], [[7, 1], [2, 9]], [[7, 1, 2], 9], [7, 1, 2, 9]]
  Ṗ         - Remove the final element                   [[7, 1, 2, 9], [7, 1, [2, 9]], [7, [1, 2], 9], [7, [1, 2, 9]], [[7, 1], 2, 9], [[7, 1], [2, 9]], [[7, 1, 2], 9]]
    ÐṂ      - Keep the lists with the minimum...         [[7, [1, 2, 9]], [[7, 1], [2, 9]], [[7, 1, 2], 9]]
   L        -   length
      Ḍ     - From digits                                [[7, 129], [71, 29], [712, 9]]
        /   - Reduce...
         €  - ...each...
       ạ    - ...by absolute difference                  [122, 42, 703]
          Ṃ - Take the minimum                           42

Możesz zmienić L=2$$Ðfna ṖLÐṂw tym przypadku
dylnan



1

MATL , 15 bajtów

"GX@:&)UwU-|vX<

Dane wejściowe to ciąg znaków reprezentujący liczbę całkowitą.

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

"         % Implicit input. Do the following as many times as input length
  G       %   Push input
  X@      %   Push iteration index (1-based), k
  :       %   Range: gives [1 2 ... k]
  &)      %   Two-ouput reference indexing: gives a substring with the first
          %   k characters in the input and then a substring with the rest
  U       %   Convert to number
  wU      %   Swap, convert to number
  -|      %   Absolute difference
  v       %   Vertically concatenate stack. This concatenates the obtained
          %   absolute difference with the minimum so far; does nothing in 
          %   the first iteration
  X<      %   Minimum of array
          % Implicit end. Implicit display


1

Czysty , 106 83 bajtów

import StdEnv
@n#f=toInt o(%)n
=hd(sort[abs(f(0,i)-f(i+1,size n))\\i<-[0..size n]])

Definiuje funkcję @, biorąc ciąg.

Przeważnie oczywistym, jedynym trudnym bitem jest f=toInt o(%)n: bierze toIntklasę funkcji i tworzy ją ( o) z klasą operatora wycinanego curry ( %) już dostarczoną z pierwszym argumentem ( n). Ponieważ istnieje tylko jeden typ ( Stringrównoważny {#Char}), który ma przeciążenia dla obu %i toIntlinia faktycznie się kompiluje, podczas gdy normalnie trudno jest komponować funkcje podczas gry w golfa z powodu braku informacji kontekstowych przekazywanych kompilatorowi.

Wypróbuj online!


1

Galaretka , 12 bajtów

JṬ€œṗ€⁸Ḍạ/€Ṃ

Monadyczny link pobierający listę cyfr i zwracający liczbę całkowitą.

Wypróbuj online!

W jaki sposób?

JṬ€œṗ€⁸Ḍạ/€Ṃ - Link: list of digits     e.g. [7,1,2,9]
J            - range of length               [1,2,3,4]
 Ṭ€          - untruth €ach                  [[1],[0,1],[0,0,1],[0,0,0,1]]
      ⁸      - chain's left argument         [7,1,2,9]
   œṗ€       - partition at truthy for €ach  [[[],[7,1,2,9]],[7,[1,2,9]],[[7,1],[2,9]],[[7,1,2],9]]
       Ḍ     - undecimal (vectorises)        [[0,7129],[7,129],[71,29],[712,9]]
         /€  - reduce €ach by:
        ạ    - absolute difference           [7129,122,42,703]
           Ṃ - minimum                       42

1

Pyth, 10 bajtów

hSaMv<./Ql

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 vzastosowane do listy list ciągów ocenia wszystkie ciągi.

hSaMv<./Ql
hSaMv<./QlQ    Implicit variable
      ./Q      Form all partitions of the input string.
               Split it in all possible ways, maintaining the order.
               Partitions are ordered from shortest to longest.
     <   lQ    Take the prefix as long as the input string.
               This keeps just the splits into one and two pieces.
    v          Evaluate. All strings are converted to numbers.
  aM           Map the absolute difference function.
hS             Minimum

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.


1

Tcl , 116 bajtów

foreach d [split [set b [set R $argv]] {}] {append L $d
regexp .(.+) $R - R
set b [expr min($b,abs($L-$R))]}
puts $b

Wypróbuj online!

Wyjaśnienie

b ← R ← input number
for each digit (d) in the input number:
  L += d
  strip first digit off of R using a regular expression
  b ← min( b, distance between L and R )
print b

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:

1 2345 → 2344
12 345 → 333
123 45 → 78
1234 5 → 1229
12345 5 → 12340 (degenerate case)

Możesz golić bajty używając lmapzamiast foreach: tio.run/##LYuxCsMgFEV3v@IOb1DaZO8/ZHItDlolBEx4qC2FkG9/…
sergiol


1

APL + WIN, 31 bajtów

⌊/|(⍎¨m↓¨⊂n)-⍎¨(m←⍳¯1+⍴n)↑¨⊂n←⎕

Monituje o wpisanie na ekranie liczby całkowitej jako ciągu.

Wyjaśnienie:

m←⍳¯1+⍴n Create a list of numbers from 1 to length of string - 1

↑¨⊂n←⎕ Using m create a nested vector taking successively characters from the front of the string defined by m

⍎¨ Convert from character to integer

(⍎¨m↓¨⊂n) Using m create a nested vector dropping successively characters from the front of the string defined by m 

⌊/| take the minimum absolute value after subtracting the two vectors of integers

Nie wiem APL, czy istnieje sposób na przetestowanie tego?
ბიმო

Niestety APL + WIN nie jest w TIO. Jeśli chcesz grać z APL, możesz bezpłatnie pobrać kopię APLX ze strony internetowej Dyalog, a mój kod działa z tym. Nie działa w trybie Try APL on-line firmy Dyalog. dyalog.com/aplx.htm
Graham


1

C # (.NET Core) , 112 107 + 18 = 125 bajtów

n=>Enumerable.Range(1,n.Length-1).Min(i=>System.Math.Abs(int.Parse(n.Remove(i))-int.Parse(n.Substring(i))))

Wypróbuj online!

Liczba obejmuje 18 bajtów w using System.Linq;. Pobiera dane wejściowe jako string.

  • 5 bajtów zapisanych przez Caiusa Jarda!

string.Removemoże zaoszczędzić ci kilka bajtów
Caius Jard,

1

Common 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:

(defun f (s) (loop for i from 1 below (length s) minimizing (abs (- (parse-integer (subseq s 0 i)) (parse-integer (subseq s i))))))

Dane wejściowe muszą być ciągiem, a nie liczbą całkowitą lub listą.


3
Witamy w PPCG! Niestety nie znam Lispa, ale zauważyłem, że możesz go skrócić o 11 bajtów, jeśli uczynisz go funkcją nienazwaną i usuniesz spacje, patrz tutaj . Jeśli nie widzieliście tego , może znajdziesz kilka wskazówek.
ბიმო
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.