Hãy công bằng nhất có thể


33

Giới thiệu

Trong thử thách này, bạn nên chia một số nguyên thành hai phần. Vì không ai thích nhận được miếng bánh nhỏ hơn, mục tiêu của bạn là công bằng nhất có thể. Ví dụ: nếu bạn muốn chia số nguyên 7129thành hai phần, có 3 cách có thể thực hiện.

7,129, 71,29712,9là tất cả khả năng, nhưng 71,29là công bằng nhất để tách nó thành hai mảnh vì nó giảm thiểu sự chênh lệch giữa hai:

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

Thử thách

Cho một số nguyên xác định cách tốt nhất có thể phân vùng nó như được mô tả ở trên và báo cáo sự khác biệt kết quả.

Quy tắc

  • Việc chia tách chỉ có ý nghĩa đối với các số nguyên có độ dài ít nhất hai, đầu vào sẽ luôn là ≥ 10
  • Đầu vào có thể là số nguyên, danh sách các chữ số hoặc chuỗi
  • Bạn không phải xử lý đầu vào không hợp lệ

Tủ thử

Bạn chỉ cần báo cáo sự khác biệt kết quả, phân vùng chỉ ở đây để minh họa:

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

Câu trả lời:


11

Brachylog , 12 11 byte

Câu trả lời Brachylog đầu tiên của tôi

Lấy đầu vào dưới dạng chuỗi

{~cĊịᵐ-ȧ}ᶠ⌋

Hãy thử trực tuyến!

Giải trình:

sẽ f tất cả các đầu ra có thể cho vị từ {…}và lưu trữ chúng trong một danh sách. ~cnói rằng đầu ra là một danh sách mà khi c oncatenated, bằng với đầu vào. Tiếp theo Ċkhẳng định rằng đầu ra của~c có độ dài 2.

ịᵐchuyển đổi cả hai phần tử của đầu ra thành số nguyên (điều này được loại bỏ các 0s hàng đầu ), lấy sự khác biệt tuyệt đối của hai phần tử.

Khi chúng tôi có danh sách tất cả các đầu ra có thể, chúng tôi sẽ nhận được phần tử tối thiểu với


10

Haskell , 48 byte

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

[1..n] làm cho điều này quá chậm cho các trường hợp thử nghiệm lớn hơn.

Hãy thử trực tuyến!


Công việc tốt! Tôi đã bị mù mặt bằng cách sử dụng các chuỗi mà tôi quên rằng tôi có thể sử dụng số học.
Thuật sĩ lúa mì

9

05AB1E , 9 byte

Mã số:

ā¤âε£ÆÄ}W

Sử dụng mã hóa 05AB1E . Hãy thử trực tuyến!

Giải trình

ā            # 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
Nếu bạn thay thế £bằng °‰bạn sẽ không cần ¤ânữa.
Emigna


7

Perl 6 , 40 byte

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

Kiểm tra nó

Mở rộng:

{  # 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 byte

35 byte được lưu nhờ 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).

Hãy thử trực tuyến!

Đây là lần thử đầu tiên của tôi khi chơi golf prolog nên có thể hơi kinh khủng. Đây là cách nó làm việc.

Ở cấp độ cao nhất chúng ta có *. *mất AH, và xác định nếu Hlà cách nhỏ nhất để phân chia A.

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

Dòng đầu tiên ở đây sử dụng một kỹ thuật từ bài SO này , về cơ bản để thực hiện một bản đồ của vị từ r(A)trên các số nguyên từ 0đến A. Vì rxác nhận các giá trị của từng phân vùng, điều này sẽ cung cấp cho chúng tôi các giá trị của tất cả các phân vùng có thể, cộng với toàn bộ tải thêm rác. Tất cả các phân vùng này sẽ được lưu trữ Lkhông theo thứ tự cụ thể. Khi đã xong, chúng tôi sắp xếp danh sách để tìm phần tử nhỏ nhất. Sau đó chúng tôi sử dụng một vết cắt để ngăn chặn backtracing.

Tiếp theo chúng ta có định nghĩa về r. Đầu tiên rtính toán hai kết quả của việc đặt tên tách chúng XY.

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

Sau đó, chúng tôi khẳng định đó Clà sự khác biệt của họ và là tích cực.

  C is abs(X-Y).

Dường như có một sai lầm ở đây vì X is div(A,10**B),Y is div(A,10**B)sẽ luôn luôn đưa ra C=0(có nghĩa là Hluôn luôn là 0 ). Y is mod(A,10**B)Tôi nên đoán.
Emigna

Hàng thứ hai cũng có thể r(A,B,C):-Z is 10**B,divmod(A,Z,X,Y),C is abs(X-Y).tiết kiệm 32 byte (Nếu bạn đang sử dụng SWI prolog ít nhất, không chắc chắn về các phiên bản khác).
Emigna

Hàng đầu tiên có thể bắt đầu bằng ví dụ A*Hthay vì l(A,H)lưu thêm 3. Và nếu bạn đang sử dụng SWI, bạn có thể thêm liên kết TIO
Emigna

Ngoài ra, tôi không nghĩ bạn cần ,!bạn? Không nên có bất kỳ quay lại tại thời điểm đó.
Emigna

@Emigna Cảm ơn các mẹo, tôi sẽ sớm triển khai chúng. Tôi cũng nghĩ rằng ,!sẽ không cần thiết nhưng khi tôi kiểm tra chương trình thì nó lại bị lạc hậu. Nó dường như cố gắng mọi thứ tự có thể Lvà sau đó sắp xếp tất cả. Có nghĩa là nó sẽ cho cùng một câu trả lời A!lần.
Thuật sĩ lúa mì

5

Haskell , 68 65 byte

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

Hãy thử trực tuyến!

Giải trình

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

Than , 14 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Thuận tiện tôi có thể sử dụng biến thể 2-arg của Slice. Giải trình:

   θ            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

Thạch , 9 8 byte

ḌÐƤḊạḌƤṂ

Hãy thử trực tuyến!

-1 byte nhờ Dennis. Đầu vào là một danh sách các chữ số.

Giải trình

ḌÐƤḊạḌƤṂ
ḌÐƤ          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

Hừm, lời giải thích của bạn dường như không phản ánh những gì mã của bạn thực sự làm.
Erik the Outgolfer 23/12/17

@EriktheOutgolfer Đây có phải là phần tử loại bỏ phần tử cuối cùng hay không khi nói nên loại bỏ phần tử đầu tiên. Tôi sẽ sửa nó, cảm ơn vì đã chỉ ra
dylnan

3

Funky , 159 134 99 byte

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

Trên thực tế phù hợp với thông số kỹ thuật là ngắn hơn.

Hãy thử trực tuyến!


3

Võng mạc , 36 byte

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

Om`^.*
\G1

Hãy thử trực tuyến!

Giải trình

\B
,$'¶$`

Điều này tạo ra tất cả các phân vùng có thể trên các dòng riêng biệt, cũng như một dòng cuối với đầu vào ban đầu.

\d+
$*

Chuyển đổi từng số trong mỗi phân vùng để unary.

(1*),\1

Loại bỏ một lượng 1s tối đa và bằng nhau từ cả hai phần của mỗi phân vùng (nghĩa là loại bỏ tối thiểu và trừ nó khỏi mức tối đa, điều này mang lại sự khác biệt tuyệt đối).

Om`^.*

Sắp xếp các dòng.

\G1

Đếm số 1s trên dòng đầu tiên, mang lại sự khác biệt tuyệt đối tối thiểu.


3

J , 32, 27 23 byte

-5 byte nhờ FrownyFrog! -4 byte nếu đầu vào là một chuỗi.

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

Hãy thử trực tuyến!

Bản gốc: Lấy một số làm đầu vào

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

Làm thế nào nó hoạt động:

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

Hãy thử trực tuyến!


@FrownyFrog - Cảm ơn!
Galen Ivanov

3

JavaScript (ES6), 64 byte

Đưa đầu vào dưới dạng một chuỗi.

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

Các trường hợp thử nghiệm

Đã bình luận

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)

Không đệ quy (ES7), 65 byte

Đưa đầu vào dưới dạng một chuỗi.

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

Các trường hợp thử nghiệm

Đã bình luận

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

Lưu ý : Trong cả hai phiên bản, lđược ép buộc thành một chuỗi trong lần lặp đầu tiên. Thông thường, chúng ta nên cẩn thận về các số 0 đứng đầu theo nghĩa đen: 0123 - 10 === 73bởi vì 0123được phân tích cú pháp dưới dạng giá trị bát phân (điều này hiện không được chấp nhận, nhưng vẫn hợp lệ trong chế độ không nghiêm ngặt). Nhưng '0123' - '10' === 113, số không dẫn đầu là lần này bị bỏ qua. Vì vậy, đó là âm thanh để làm như vậy.

Từ đặc tả của hoạt động trừu tượng ToNumberđược áp dụng cho một chuỗi:

StringNumericLiteral là số thập phân có thể có bất kỳ số 0 chữ số hàng đầu nào


3

APL (Dyalog) , 27 byte

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

Hãy thử trực tuyến!

Làm sao?

¯1+≢⍵ - độ dài của n âm 1

∘.=⍨⍳ - ma trận danh tính

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

1, - trả trước 1 cho mỗi hàng

- chia theo hàng

⊂∘⍵¨ - cho mỗi, phân vùng chuỗi theo nó

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

- làm phẳng

-/ - giảm từng cặp với phép trừ

| - lấy giá trị tuyệt đối

⌊/ - tối thiểu


APL (Dyalog) , 35 byte

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

Hãy thử trực tuyến!


3

Thạch , 11 byte

ŒṖṖLÐṂḌạ/€Ṃ

Hãy thử trực tuyến!

-3 byte nhờ dylnan

Làm thế nào nó hoạt động

ŒṖṖ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

Bạn có thể thay đổi L=2$$Ðfđể ṖLÐṂtrong trường hợp này
dylnan



1

MATL , 15 byte

"GX@:&)UwU-|vX<

Đầu vào là một chuỗi đại diện cho số nguyên.

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

"         % 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

Sạch , 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]])

Xác định hàm @, lấy một chuỗi.

Chủ yếu là hiển nhiên, bit duy nhất khó khăn là f=toInt o(%)n: Điều này nhận toIntlớp các hàm và kết hợp nó ( o) với lớp toán tử lát cắt ( %) đã được cung cấp với đối số đầu tiên ( n). Vì chỉ có một loại ( Stringtương đương {#Char}) có quá tải cho cả hai %toInt dòng thực sự biên dịch, trong khi thông thường, rất khó để soạn các hàm khi chơi golf do thiếu thông tin theo ngữ cảnh được cung cấp cho trình biên dịch.

Hãy thử trực tuyến!


1

Thạch , 12 byte

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

Một liên kết đơn âm lấy một danh sách các chữ số và trả về số nguyên.

Hãy thử trực tuyến!

Làm sao?

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

Bình thường, 10 byte

hSaMv<./Ql

Bộ kiểm tra

Đưa đầu vào dưới dạng một chuỗi.

Điều này sử dụng một trong những tính năng gần đây của Pyth, đó là áp dụng chức năng cho danh sách mặc định để ánh xạ chức năng qua danh sách, nếu không có hành vi nào khác được xác định. Điều này có nghĩa là váp dụng cho một danh sách các chuỗi đánh giá tất cả các chuỗi.

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

Lưu ý rằng danh sách các phần tách cho phép chia thành 1 phần, nhưng giá trị của phần này sẽ luôn lớn hơn mức tối thiểu, vì vậy nó được bỏ qua một cách an toàn.


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

Hãy thử trực tuyến!

Giải trình

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

Nó hoạt động bằng cách sử dụng thủ thuật regex cho phép trường hợp cuối cùng suy biến sẽ luôn tính toán lớn hơn mức chênh lệch tối thiểu. Đối với văn bản 12345, các giá trị là:

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

Bạn có thể cạo byte bằng cách sử dụng lmapthay vì foreach: tio.run/##LYuxCsMgFEV3v@IOb1DaZO8/ZHItDlolBEx4qC2FkG9/ trộm
sergiol


1

APL + THẮNG, 31 byte

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

Nhắc về đầu vào màn hình của số nguyên dưới dạng chuỗi.

Giải trình:

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

Tôi không biết APL, có cách nào để kiểm tra điều này không?
18/12/17

Thật không may, APL + WIN không có trong TIO. Nếu bạn muốn chơi với APL, bạn có thể tải xuống một bản sao APLX từ trang web Dyalog miễn phí và mã của tôi hoạt động với nó. Nó không hoạt động trong Thử APL trực tuyến của Dyalog. dyalog.com/aplx.htm
Graham


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

Hãy thử trực tuyến!

Số lượng bao gồm 18 byte trong using System.Linq; . Lấy đầu vào là a string.

  • 5 byte được lưu bởi Caius Jard!

string.Removecó thể giúp bạn tiết kiệm một vài byte
Caius Jard

1

Lisp thông thường, 131 byte

Lần đầu tiên tôi tham gia chơi golf mã và tôi đã quyết định sử dụng Lisp, vì tôi thích nó.

Đây là giải pháp của tôi:

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

Đầu vào cần phải là một chuỗi, không phải là số nguyên hoặc danh sách.


3
Chào mừng đến với PPCG! Thật không may, tôi không biết Lisp, nhưng tôi nhận thấy rằng bạn có thể rút ngắn 11 byte nếu bạn biến nó thành một hàm không tên và xóa một số khoảng trắng, xem tại đây . Nếu bạn chưa thấy điều này , có thể bạn sẽ tìm thấy một số lời khuyên.
ბიმო
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.