Bersikap seadil mungkin

33

pengantar

Dalam tantangan ini, Anda harus membagi bilangan bulat menjadi dua bagian. Karena tidak ada yang suka mendapatkan sepotong kue yang lebih kecil, tujuan Anda adalah bersikap seadil mungkin. Misalnya jika Anda ingin membagi bilangan bulat 7129menjadi dua bagian, ada 3 cara yang memungkinkan untuk melakukannya.

7,129, 71,29dan 712,9semuanya kemungkinan, tetapi 71,29merupakan cara paling adil untuk membaginya menjadi dua bagian karena meminimalkan perbedaan antara keduanya:

7 129 -> |7-129| = 122
71 29 -> |71-29| = 42
712 9 -> |712-9| = 703

Tantangan

Diberikan bilangan bulat menentukan cara terbaik untuk mempartisi seperti dijelaskan di atas dan melaporkan perbedaan yang dihasilkan.

Aturan

  • Pemisahan hanya masuk akal untuk bilangan bulat dengan panjang setidaknya dua, input akan selalu ≥ 10
  • Input dapat berupa bilangan bulat, daftar digit atau string
  • Anda tidak harus menangani input yang tidak valid

Testcases

Anda hanya perlu melaporkan perbedaan yang dihasilkan, partisi hanya ada di sini untuk ilustrasi:

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
ბიმო
sumber

Jawaban:

11

Brachylog , 12 11 byte

Jawaban Brachylog pertamaku

Ambil input sebagai string

{~cĊịᵐ-ȧ}ᶠ⌋

Cobalah online!

Penjelasan:

akan f ind memungkinkan output untuk predikat di {…}dan menyimpannya dalam daftar. ~cmengatakan bahwa output adalah daftar yang, ketika c oncatenated, sama dengan input. Selanjutnya Ċmenegaskan bahwa output ~cmemiliki panjang 2.

ịᵐmengubah kedua elemen output menjadi bilangan bulat (ini menghilangkan terkemuka 0s), mengambil perbedaan absolut dari dua elemen.

Setelah kami memiliki daftar semua output yang mungkin, kami mendapatkan elemen minimum

H.Piz
sumber
10

Haskell , 48 byte

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

[1..n] membuat ini terlalu lambat untuk kasus uji yang lebih besar.

Cobalah online!

Dennis
sumber
Pekerjaan yang baik! Saya menjadi begitu buta memihak dengan menggunakan string sehingga saya lupa bahwa saya bisa menggunakan aritmatika.
Wheat Wizard
9

05AB1E , 9 byte

Kode:

ā¤âε£ÆÄ}W

Menggunakan 05AB1E penyandian . Cobalah online!

Penjelasan

ā            # 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
Adnan
sumber
1
Jika Anda mengganti £dengan °‰Anda tidak perlu ¤âlagi.
Emigna
8

Python 2 , 64 byte

lambda n:min(abs(int(n[i:])-int(n[:i]))for i in range(1,len(n)))

Cobalah online!

Neil
sumber
7

Perl 6 , 40 byte

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

Menguji

Diperluas:

{  # 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
      /^ (.+) (.+) $/
}
Brad Gilbert b2gills
sumber
6

C, 94 byte

c,r,d,a;f(n){for(c=1,r=0,d=n<11?1:n;n;r+=n%10*c,c*=10,n/=10)a=abs(r-n),d=r&&a<d?a:d;return d;}

Cobalah online!

Steadybox
sumber
6

Prolog (SWI) , 195 189 154 117 112 byte

35 byte disimpan berkat Eminga

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).

Cobalah online!

Ini adalah percobaan pertama saya di prolog golf sehingga mungkin agak menghebohkan. Inilah cara kerjanya.

Pada level tertinggi yang kita miliki *. *mengambil Adan H, dan menentukan apakah Hcara terkecil untuk membagi A.

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

Baris pertama di sini menggunakan teknik dari posting SO ini , untuk dasarnya melakukan peta predikat r(A)atas bilangan bulat dari 0ke A. Karena rmengonfirmasi nilai dari setiap partisi, ini akan memberi kita nilai dari semua partisi yang mungkin, ditambah seluruh muatan sampah tambahan. Semua partisi ini akan disimpan Ltanpa urutan tertentu. Setelah selesai, kami mengurutkan daftar untuk menemukan elemen terkecil. Kami kemudian menggunakan potongan untuk mencegah backtracing.

Selanjutnya kita memiliki definisi r. Pertama rmenghitung dua hasil dari penamaan yang memberi mereka Xdan Y.

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

Kemudian kami menyatakan bahwa Citulah perbedaan mereka dan itu positif.

  C is abs(X-Y).
Wisaya Gandum
sumber
Tampaknya ada kesalahan langkah di sini karena X is div(A,10**B),Y is div(A,10**B)akan selalu memberi C=0(artinya Hakan selalu menjadi 0 juga). Seharusnya Y is mod(A,10**B)saya kira.
Emigna
Baris kedua juga bisa r(A,B,C):-Z is 10**B,divmod(A,Z,X,Y),C is abs(X-Y).menghemat 32 byte (Jika Anda menggunakan prolog SWI setidaknya, tidak yakin tentang versi lain).
Emigna
Baris pertama dapat dimulai dengan misalnya A*Halih-alih l(A,H)menyimpan 3 lainnya. Dan jika Anda menggunakan SWI, Anda dapat menambahkan tautan TIO
Emigna
Juga, saya tidak berpikir Anda perlu kan ,!? Seharusnya tidak ada langkah mundur pada saat itu.
Emigna
@Emigna Terima kasih atas tipsnya, saya akan segera menerapkannya. Saya juga berpikir ,!tidak akan diperlukan tetapi ketika saya menguji program itu melakukan backtrace. Tampaknya mencoba setiap kemungkinan pemesanan Ldan kemudian memilah semuanya. Berarti itu akan memberikan waktu jawaban yang sama A!.
Wheat Wizard
5

Haskell , 68 65 byte

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

Cobalah online!

Penjelasan

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
 ]
Wisaya Gandum
sumber
4

Arang , 14 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Mudah saya bisa menggunakan varian 2-arg Slice. Penjelasan:

   θ            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
Neil
sumber
4

Jelly , 9 8 byte

ḌÐƤḊạḌƤṂ

Cobalah online!

-1 byte terima kasih kepada Dennis. Input adalah daftar digit.

Penjelasan

ḌÐƤḊạḌƤṂ
ḌÐƤ          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
dylnan
sumber
Hm, penjelasan Anda tampaknya tidak mencerminkan apa kode Anda sebenarnya.
Erik the Outgolfer
@EriktheOutgolfer Apakah ini "menghapus elemen terakhir" ketika seharusnya mengatakan "menghapus elemen pertama"? Saya akan memperbaikinya, terima kasih telah menunjukkannya
dylnan
3

Funky , 159 134 99 byte

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

Sebenarnya pas spek sepertinya lebih pendek.

Cobalah online!

ATaco
sumber
3

Retina , 36 byte

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

Om`^.*
\G1

Cobalah online!

Penjelasan

\B
,$'¶$`

Ini menghasilkan semua partisi yang mungkin pada baris yang terpisah, serta garis trailing dengan input asli.

\d+
$*

Konversi setiap angka di setiap partisi ke unary.

(1*),\1

Hapus jumlah 1s maksimal dan sama dari kedua bagian setiap partisi (yaitu menghapus minimum, dan kurangi dari maksimum, yang memberikan perbedaan absolut).

Om`^.*

Urutkan garis.

\G1

Hitung 1s pada baris pertama, yang memberikan perbedaan absolut minimal.

Martin Ender
sumber
3

J , 32, 27 23 byte

-5 byte terima kasih kepada FrownyFrog! -4 byte jika input berupa string.

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

Cobalah online!

Asli: Mengambil nomor sebagai masukan

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

Bagaimana itu bekerja:

                             @": - 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

Cobalah online!

Galen Ivanov
sumber
@FrownyFrog - Terima kasih!
Galen Ivanov
3

JavaScript (ES6), 64 byte

Mengambil input sebagai string.

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

Uji kasus

Berkomentar

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)

Non-rekursif (ES7), 65 byte

Mengambil input sebagai string.

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

Uji kasus

Berkomentar

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

Catatan : Di kedua versi,l dipaksa untuk string pada iterasi pertama. Biasanya, kita harus berhati-hati tentang memimpin nol dalam literal numerik: 0123 - 10 === 73karena 0123diuraikan sebagai nilai oktal (ini sekarang sudah ditinggalkan, tetapi masih berlaku dalam mode non-ketat). Tapi '0123' - '10' === 113, nol di awal kali ini diabaikan. Jadi, itu suara untuk melakukannya.

Dari spesifikasinya operasi abstrak yang ToNumberditerapkan ke string:

StringNumericLiteral yang desimal dapat memiliki angka 0 digit terdepan

Arnauld
sumber
3

APL (Dyalog) , 27 byte

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

Cobalah online!

Bagaimana?

¯1+≢⍵- panjang nminus 1

∘.=⍨⍳ - matriks identitas

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

1,- Prepend 1untuk setiap baris

- dibagi dengan baris

⊂∘⍵¨ - untuk masing-masing, partisi string dengan itu

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

- Ratakan

-/ - kurangi setiap pasangan dengan pengurangan

| - ambil nilai absolut

⌊/ - minimum


APL (Dyalog) , 35 byte

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

Cobalah online!

Uriel
sumber
3

Jelly , 11 byte

ŒṖṖLÐṂḌạ/€Ṃ

Cobalah online!

-3 byte terima kasih kepada dylnan

Bagaimana itu bekerja

ŒṖṖ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
caird coinheringaahing
sumber
Anda dapat mengubah L=2$$Ðfke ṖLÐṂdalam kasus ini
dylnan
2

Python 2 , 58 byte

lambda n:min(abs(n%10**i-n/10**i)for i in range(len(`n`)))

Cobalah online!

ovs
sumber
1

MATL , 15 byte

"GX@:&)UwU-|vX<

Input adalah string yang mewakili integer.

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

"         % 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
Luis Mendo
sumber
1

Bersih , 106 83 byte

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

Menentukan fungsi @, mengambil string.

Sebagian besar terbukti sendiri, satu-satunya bit yang rumit adalah f=toInt o(%)n: Ini mengambil toIntkelas fungsi, dan mengkomposisinya ( o) dengan kelas operator irisan kari ( %) sudah disertakan dengan argumen pertama ( n). Karena hanya ada satu jenis ( String, setara dengan {#Char}) yang memiliki kelebihan untuk keduanya %dan toIntgaris sebenarnya mengkompilasi, sedangkan biasanya sulit untuk menyusun fungsi ketika bermain golf karena kurangnya informasi kontekstual yang diberikan kepada kompiler.

Cobalah online!

Suram
sumber
1

Jelly , 12 byte

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

Tautan monadik yang mengambil daftar angka dan mengembalikan bilangan bulat.

Cobalah online!

Bagaimana?

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
Jonathan Allan
sumber
1

Pyth, 10 byte

hSaMv<./Ql

Suite uji

Mengambil input sebagai string.

Ini menggunakan salah satu fitur Pyth yang lebih baru, yaitu menerapkan fungsi ke daftar default untuk memetakan fungsi di daftar, jika tidak ada perilaku lain yang didefinisikan. Ini berarti bahwa vditerapkan ke daftar daftar string mengevaluasi semua string.

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

Perhatikan bahwa daftar pemisahan memungkinkan pemisahan menjadi 1 bagian, tetapi nilai ini akan selalu lebih besar dari minimum, sehingga diabaikan dengan aman.

isaacg
sumber
1

Tcl , 116 byte

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

Cobalah online!

Penjelasan

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

Ini bekerja dengan menggunakan trik regex yang memungkinkan kasus akhir merosot yang akan selalu menghitung lebih dari perbedaan minimum. Untuk "12345" nilainya adalah:

1 2345 → 2344
12 345 → 333
123 45 → 78
1234 5 → 1229
12345 5 → 12340 (degenerate case)
Dúthomhas
sumber
Anda dapat mencukur byte menggunakan lmapsebagai ganti foreach: tio.run/##LYuxCsMgFEV3v@IOb1DaZO8/ZHItDlolBEx4qC2FkG9/…
sergiol
1

APL + WIN, 31 byte

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

Meminta input layar integer sebagai string.

Penjelasan:

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
Graham
sumber
Saya tidak tahu APL, apakah ada cara untuk menguji ini?
ბიმო
Sayangnya APL + WIN tidak ada dalam TIO. Jika Anda ingin bermain dengan APL, Anda dapat mengunduh salinan APLX dari situs web Dyalog secara gratis dan kode saya berfungsi dengannya. Ini tidak berfungsi di Coba APL Dyalog online. dyalog.com/aplx.htm
Graham
1

Perl 5 , 51 41 + 1 ( -p) = 42 byte

$\=$_;$\=$\>($"=abs$'-$`)?$":$\while//g}{

Cobalah online!

terinspirasi oleh komentar @ Nahuel-Fouilleul

Xcali
sumber
46 byte $\--;$d=abs$``-$',$\=$\<0|$d<$\?$d:$\while//g}{
Nahuel Fouilleul
1

C # (.NET Core) , 112 107 + 18 = 125 byte

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

Cobalah online!

Hitungan termasuk 18 byte di using System.Linq;. Mengambil input sebagai a string.

  • 5 byte disimpan oleh Caius Jard!
Charlie
sumber
string.Removemungkin menghemat beberapa byte
Caius Jard
1

Common Lisp, 131 byte

Pertama kali saya berpartisipasi dalam golf kode dan saya memutuskan untuk menggunakan Lisp, karena saya menyukainya.

Ini solusinya:

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

Input harus berupa string, bukan bilangan bulat atau daftar.

JNevens
sumber
3
Selamat datang di PPCG! Sayangnya saya tidak tahu Lisp, tetapi saya perhatikan bahwa Anda dapat mempersingkat ini dengan 11 byte jika Anda membuatnya menjadi fungsi yang tidak disebutkan namanya dan menghapus beberapa spasi putih, lihat di sini . Jika Anda belum melihat ini , mungkin Anda akan menemukan beberapa tips.
ბიმო