Mümkün olduğunca adil olun


33

Giriş

Bu mücadelede bir tamsayıyı iki parçaya bölmelisiniz. Kimse küçük pastayı almaktan hoşlanmadığından, hedefiniz mümkün olduğunca adil olmaktır. Örneğin, tamsayıyı 7129iki parçaya bölmek istiyorsanız , bunu yapmanın 3 olası yolu vardır.

7,129, 71,29Ve 712,9tüm olasılıklar vardır, ama 71,29o ikisi arasındaki fark en aza indirir çünkü iki parçaya bölme bunu perilisi yoludur:

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

Meydan okuma

Bir tamsayı verildiğinde, yukarıda açıklandığı şekilde bölümlemenin mümkün olan en iyi yolunu belirleyin ve ortaya çıkan farkı bildirin.

kurallar

  • Bölünme, yalnızca en az iki uzunluktaki tamsayılar için anlamlıdır, giriş her zaman ≥ 10 olacaktır.
  • Giriş, bir tam sayı, rakamların listesi veya bir dize olabilir.
  • Geçersiz girişi işlemek zorunda değilsin

testcases

Sadece ortaya çıkan farkı bildirmeniz gerekir, bölümleme sadece örnekleme amaçlıdır:

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

Yanıtlar:


11

Brachylog , 12 11 bayt

İlk Brachylog cevabım

Girdiyi dize olarak al

{~cĊịᵐ-ȧ}ᶠ⌋

Çevrimiçi deneyin!

Açıklama:

will f yüklemi için ind tüm olası çıkışları {…}ve bir liste halinde saklayın. ~cÇıktının, c başlatıldığında, girişe eşit bir liste olduğunu söyler. Daha Ċsonra çıktının ~cuzunluğu 2 olduğunu iddia eder .

ịᵐÇıktının her iki öğesini de tam sayılara dönüştürür (bu, öncülerden kurtulur 0), iki öğenin mutlak farkını alır.

Olası tüm çıktıların bir listesi elimize geçtiğinde, asgari unsuru elde ederiz.



9

05AB1E , 9 bayt

Kod:

ā¤âε£ÆÄ}W

05AB1E kodlamasını kullanır . Çevrimiçi deneyin!

açıklama

ā            # 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
Eğer değiştirirseniz £ile °‰size gerekmez ¤âartık.
Emigna





6

Prolog (SWI) , 195 189 154 117 112 bayt

Eminga sayesinde 35 bayt kurtarıldı

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

Çevrimiçi deneyin!

Bu benim prolog golf'deki ilk denemem, bu yüzden biraz korkunç olabilir. İşte nasıl çalışıyor.

Sahip olduğumuz en üst seviyede *. *alır Ave H, ve Hbölmenin en küçük yol olup olmadığını belirler A.

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

Buradaki ilk satır, bu SO post'undan bir teknik kullanır , esasen r(A)ile tamsayılar üzerinden bir yüklem haritası 0yapar A. Yana rteyit her bölümlerin değerleri bu bize tüm olası bölümleri değerlerini, artı ekstra önemsiz bir bütün yük verecektir. Tüm bu bölümler Lbelirli bir düzende depolanmayacak . Bu yapıldıktan sonra en küçük elemanı bulmak için listeyi sıralarız. Daha sonra geri çekilmeyi önlemek için bir kesim kullanırız.

Daha sonra tanımımız var r. Önce rbölünmüş isimlerin iki sonucunu Xve bunları hesaplar Y.

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

Öyleyse Caralarındaki farkın bu olduğunu ve olumlu olduğunu iddia ediyoruz .

  C is abs(X-Y).

Burada X is div(A,10**B),Y is div(A,10**B)her zaman vereceğiniz gibi bir yanlışlık var gibi görünüyor C=0(anlam Hher zaman 0 da olacak ). Var olmalıyım Y is mod(A,10**B).
Emigna

İkinci satır da r(A,B,C):-Z is 10**B,divmod(A,Z,X,Y),C is abs(X-Y).32 bayt kaydediyor olabilir (En azından SWI prolog kullanıyorsanız, diğer sürümlerden emin değilsiniz).
Emigna

İlk satır, başka 3'ü kaydetmek A*Hyerine örneğin başlayabilir l(A,H). Ve eğer SWI kullanıyorsanız, bir TIO bağlantısı
Emigna

Ayrıca, sana ihtiyacın olduğunu sanmıyorum ,!? Bu noktada herhangi bir geri izleme olmamalıdır.
Emigna

@Emigna Tavsiyeler için teşekkürler, kısa bir süre sonra bunları uygulayacağım. Ayrıca ,!gerekli olmayacağını düşündüm ama programı test ettiğimde geri adım atıyor. Her olası siparişten birini deniyor Lve sonra hepsini sıralıyor gibi görünüyor . Yani aynı cevap A!zamanlarını verecek .
Buğday Sihirbazı

5

Haskell , 68 65 bayt

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

Çevrimiçi deneyin!

açıklama

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

Kömür , 14 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. 2-arg değişkenini kullanabiliyorum Slice. Açıklama:

   θ            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

Jöle , 9 8 bayt

ḌÐƤḊạḌƤṂ

Çevrimiçi deneyin!

Dennis sayesinde -1 bayt. Giriş, basamakların bir listesidir.

açıklama

ḌÐƤḊạḌƤṂ
ḌÐƤ          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, açıklamanız kodunuzun gerçekte ne yaptığını yansıtmıyor gibi görünüyor.
Outgolfer Erik

@EriktheOutgolfer “İlk elemanı kaldır” demesi gereken “son elemanı kaldır” kısmı mı? Bunu düzelteceğim, işaret ettiğiniz için teşekkürler
dylnan

3

Funky , 159 134 99 bayt

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

Aslında teknik özelliklere uymak göründüğü kadar kısa.

Çevrimiçi deneyin!


3

Retina , 36 bayt

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

Om`^.*
\G1

Çevrimiçi deneyin!

açıklama

\B
,$'¶$`

Bu, orijinal girdiyle birlikte son satırın yanı sıra ayrı satırlardaki tüm olası bölümleri oluşturur.

\d+
$*

Her bölümdeki her sayıyı birliğe dönüştürün.

(1*),\1

1Her bölümün her iki bölümünden maksimum ve eşit miktarda s çıkarın (yani minimum değeri kaldırın ve mutlak fark yaratan maksimumdan çıkarın).

Om`^.*

Çizgileri sırala.

\G1

1En düşük mutlak farkı veren ilk satırdaki sayıları s.


3

J , 32, 27 23 bayt

FrownyFrog sayesinde -5 bayt! Girdi bir dizge ise -4 byte.

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

Çevrimiçi deneyin!

Orijinal: Giriş olarak bir sayı alır

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

Nasıl çalışır:

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

Çevrimiçi deneyin!


@ FrownyFrog - Teşekkürler!
Galen Ivanov

3

JavaScript (ES6), 64 bayt

Bir dize olarak girdi alır.

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

Test durumları

Yorumlananlar

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)

Özyinelemeli olmayan (ES7), 65 bayt

Bir dize olarak girdi alır.

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

Test durumları

Yorumlananlar

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

Not : Her iki versiyonda dal , ilk yinelemedeki bir dizeye zorlanır. Normalde, sayısal bir değişmezde baştaki sıfırlara dikkat etmeliyiz: 0123 - 10 === 73çünkü 0123bir sekizlik değer olarak ayrıştırılır (bu şimdi kullanımdan kaldırılmıştır, ancak katı olmayan modda hala geçerlidir). Ancak '0123' - '10' === 113, bu kez önde gelen sıfır yoksayıldı. Yani, bunu yapmak için ses.

Gönderen şartname soyut operasyonun ToNumberbir dize uygulanan:

Ondalık olan bir StringNumericLiteral, herhangi bir sayıda öncü 0 basamağa sahip olabilir.


3

APL (Dyalog) , 27 bayt

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

Çevrimiçi deneyin!

Nasıl?

¯1+≢⍵- neksi uzunluğu 1

∘.=⍨⍳ - kimlik matrisi

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

1,- 1Her satır için hazırla

- satırlara bölün

⊂∘⍵¨ - Her biri için, dize tarafından bölümleme

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

- yassılaştırmak

-/ - Her bir çifti çıkarma ile azaltma

| - mutlak değerler almak

⌊/ - minimum


APL (Dyalog) , 35 bayt

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

Çevrimiçi deneyin!


3

Jöle , 11 bayt

ŒṖṖLÐṂḌạ/€Ṃ

Çevrimiçi deneyin!

Dylnan sayesinde -3 bayt

Nasıl çalışır

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

Değişebilirsin L=2$$Ðfiçin ṖLÐṂbu durumda
dylnan



1

MATL , 15 bayt

"GX@:&)UwU-|vX<

Giriş, tamsayıyı temsil eden bir dizedir.

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

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

Temiz , 106 83 bayt

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

@Bir dize alarak işlevi tanımlar .

Çoğunlukla açık, tek zorlu bit f=toInt o(%)n: Bu toInt, fonksiyonların sınıfını alır ve zaten o( %) ilk argümanı ( n) ile birlikte verilmiş olan kavrulmuş dilim işleç sınıfı ( ) ile oluşturur . Sadece bir türü vardır (bu yana String, eşdeğer {#Char}her ikisi için de aşırı yükleme vardır) %ve toIntaslında hattı derlenir, buna karşın normal olarak bu oluşturma işlevlerine sabit olduğunda nedeniyle derleyici verilen bağlamsal bilgi eksikliği golf.

Çevrimiçi deneyin!


1

Jöle , 12 bayt

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

Rakamların bir listesini alan ve tamsayıyı döndüren tek renkli bir bağlantı.

Çevrimiçi deneyin!

Nasıl?

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 bayt

hSaMv<./Ql

Test odası

Bir dize olarak girdi alır.

Bu, Pyth’in en yeni özelliklerinden birini kullanır; bu, başka bir davranış tanımlanmadığında, işlevi listeye eşlemek için bir varsayılan listeye işlev uygulamaktır. Bu v, bir dizi listesine uygulanan tüm dizelerin değerlendirildiği anlamına gelir .

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

Bölmeler listesinin 1 parçaya bölünmesine izin verdiğini unutmayın, ancak bunun değeri her zaman minimumdan daha büyük olacaktır, bu nedenle güvenle yoksayılır.


1

Tcl , 116 bayt

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

Çevrimiçi deneyin!

açıklama

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

Her zaman minimum farktan daha büyük hesaplayacak olan dejenere bir final vakasına izin veren bir regex numarası kullanarak çalışır. “12345” için değerler:

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

Sen kullanarak bayt tıraş edebilirsiniz lmapyerine foreach: tio.run/##LYuxCsMgFEV3v@IOb1DaZO8/ZHItDlolBEx4qC2FkG9/...
sergiol


1

APL + WIN, 31 bayt

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

Bir tamsayı ekran dize olarak ekran girişi ister.

Açıklama:

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

APL'yi tanımıyorum, bunu test etmenin bir yolu var mı?
17'de

Ne yazık ki APL + WIN, TIO'da değil. APL ile oynamak istiyorsanız, APLX'in bir kopyasını Dyalog web sitesinden ücretsiz olarak indirebilirsiniz ve kodum bununla birlikte çalışır. Dyalog'un Try APL'sini on-line olarak çalışmıyor. dyalog.com/aplx.htm
Graham


1

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

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

Çevrimiçi deneyin!

Sayı, içinde 18 bayt içerir using System.Linq;. Girişi a olarak alır string.

  • Caius Jard! Tarafından kaydedilen 5 bayt!

string.Removebirkaç bayt kurtarabilir
Caius Jard

1

Ortak Lisp, 131 bayt

İlk kez golf koduna katılıyor ve beğendiğimden beri Lisp kullanmaya karar verdim.

İşte benim çözümüm:

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

Giriş bir tamsayı veya liste değil bir dize olmalıdır.


3
PPCG'ye Hoşgeldiniz! Ne yazık ki Lisp'i tanımıyorum, ancak adsız bir işlev yapar ve bazı boşlukları kaldırırsanız bunu 11 bayt kısaltabileceğinizi fark ettim, buraya bakın . Eğer görmediyseniz bu , belki bazı ipuçları bulacaksınız.
ბიმო
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.