Bana minimum bir sihir toplamı yap


27

Bu zorluğu kısa tutmak.

Size 4 sayı verilmiştir: p1, p2, p3 ve p4.

Sayıların sihirli toplamı şu şekilde tanımlanır:

magic_sum = |p1 - p2| + |p2 - p3| + |p3 - p4| + |p4 - p1|

Yalnızca yukarıdaki tamsayı değerlerinden birini değiştirmenize izin verilir (p1, p2, p3 veya p4). Değeri, değerlerin sihirli toplamının minimum değerine ulaşacağı şekilde değiştirmeniz gerekir.

Örneğin:

p1, p2, p3, p4 = 17, -6, 15, 33. Bu durumda sihirli toplamın değeri 78'dir.

Burada -6'yı 16'ya değiştirebilirsin, ve sihir toplamının değeri 36, asgari ulaşılabilir değer olacak.

Sayıların pozitif veya negatif tamsayılar olabileceğini unutmayın.

Bu kod-golf, yani koddaki en az bayt kazanıyor. Brownie, Pratik Bir Dili, Rekreasyonel bir dil üzerinde kullanmaya işaret ediyor. Dördüncü kişi seninle olsun.

Tekrarlamak için:

Örnek 1

Giriş 1

17 -6 15 33

Çıkış 1

36

Açıklama 1

-6, 16 ile değiştirilebilir ve bu bize mümkün olan asgari minimum sihir miktarını verir.

Örnek 2

Giriş 2

10 10 10 10

Çıkış 2

0 or 2

ya kabul edilebilir

Açıklama 2

Elde edilebilir minimum büyü toplamı 0'dır, çünkü minimum 4 pozitif tamsayının toplamı 0'dır. Bir sayı değişmesi gerekiyorsa, 10'lardan biri 9 olarak değiştirilebilir ve bu sayede 2 çıkışı elde edilir.

Örnek 3

Giriş 3

1 2 3 4

Çıkış 3

4

Açıklama 3

Kendi başına girdi, sihirli toplamı olarak 6'yı verir. 4 ile 1 arasında değişme ve minimum büyü toplamı 4 olan elde edilir.


10
+1, ancak daha fazla örnekle yapabilirdi.
Jonathan Allan

2
Tamamen işe yaramış bir örnek ve birkaç test sonucu daha ve +1benden.
Shaggy,

@Shaggy bitti. + 1'im nerede? : P
Koishore Roy

1
@ KooishoreRoy Durum 3'ün değişiklik olmasaydı 6 olacağını düşünmez miydin?
wizzwizz4

@ wizzwizz4 | 1 - 2 | + | 2 - 3 | + | 3 - 4 | + | 4 - 1 | = 1 + 1 + 1 + 3 = 6. Haklısın. Düzenlemeyi yaptım.
Koishore Roy

Yanıtlar:



20

Python 2,44 bayt

a,b,c,d=sorted(input())
print min(c-a,d-b)*2

Çevrimiçi deneyin!

Olarak girdi sıralar a,b,c,d,artan düzende, daha küçük alır c-ave d-bve bunu iki katına çıkar. Bu neden işe yarıyor?

İlk olarak, toplam döngüsel uzaklık toplamını maksimize etmek için bir elementi değiştirdiğimizde, bunun gibi bir komşuya eşitlemek için optimal (veya optimal için bağlı) olduğuna dikkat edin 17, -6, 15, 33 -> 17, 17, 15, 33. Bunun nedeni, sol ve sağ döngüsel komşularına olan yeni toplam mesafesinin, en azından bu komşular arasındaki mesafeden oluşu, bu yüzden eşit olmaları, yapabileceğimiz en iyisidir.

Şimdi, bir sayının iki bitişik kopyasından birini silmek, aynı döngüsel mesafelerin toplamını verir. Örnekte, bu, 17, 15, 33mesafeler vermek 2 + 18 + 16. Bu yüzden dört sayıdan birini değiştirmek yerine, sadece üç sayı bırakarak ve döngüsel uzaklıklarının toplamını kullanarak silmek yeterlidir.

3 sayı ile en büyük mesafenin, daha küçük olanların toplamı olduğuna dikkat edin. Çünkü sahip olduğumuz sayıları sıralarsak a ≤ b ≤ c, o zaman |a - c| = |a - b| + |b - c|. Başka bir deyişle, ortadaki sayıyı bir çukur durağı olarak kullanarak, en büyük ve en küçük sayı arasında iki kez seyahat ediyoruz. Dolayısıyla, üç mesafenin toplamı, minimum ve maksimum arasındaki mesafenin sadece iki katıdır (c-a)*2.

Dolayısıyla, kalan üç sayının minimum ve maksimum değerleri arasındaki en küçük mesafeyi elde etmek için hangi sayıyı sileceğimiz sorusudur. Açıkça sayıların en küçüğünü veya en büyüğünü siliyoruz. Onları a, b, c, dsıralı olarak çağırmak , ayaprakları silmek d - bve dyaprakları silmek c - a; sonuç, hangisi daha küçükse ikiye katlanır.


Bana bir test davası ile yardımcı olun. Sihir toplamı zaten 0 ise, ulaşılabilir en düşük sayı. Bu durumda, cevap 0 olmalı mı? veya mümkün olan en düşük sayı. Girişin [10,10,10,10] olması durumunda, sihir toplamı 0'dır. Mümkün olan en düşük ikinci ise 2'dir. Bana ne düşündüğünü söyle.
Koishore Roy

Söylediğinizi duyduğum, verilen dört sayının sırasını görmezden gelebileceğinizdir (ilk adımınız bunları sıralamaktır). Ama biz için sormuştu ne olur beş numaraları p1aracılığıyla p5ve yine sadece bir numara değiştirme izin verdi? Dört numaralı dava çok kolay görünüyor (ancak cevabınızı gördükten sonra).
Jeppe Stig Nielsen

@KoishoreRoy Her ikisine de izin verme çözümünüzü beğendim.
Xnor

@JeppeStigNielsen Evet, siparişin önemli olmadığı gerçeği 4 sayıya özeldir ve bir tanesini üç sayı yapmak için sildikten sonra, tüm sayı çiftleri döngüsel olarak bitişiktir. Beş sayı ile bu işe yaramaz (kesinlikle bir örnek bulabilirsiniz) ve zorluk çok farklı olurdu.
xnor

Keşke iki kez oy kazabilseydim. Güzel gözlem, iyi açıkladı.
Jonah

9

R , 66 33 bayt

function(x)2*min(diff(sort(x),2))

Çevrimiçi deneyin!

Xnor'ın algoritması ile çok daha kısa (açıklamalarını okuyun ve yayınlarını oylayın!).

Eski versiyon:

R , 66 bayt

function(x,m=matrix(x,3,4))min(colSums(abs(diff(rbind(m,m[1,])))))

Çevrimiçi deneyin!

4 tamsayının vektörü olarak girdiyi alır.

Bu işe yarar çünkü asgari sayılardan birini komşularından birine eşit olarak ayarlayarak elde edilebilir (asgari seviyeye ulaşmanın tek yolu bu değildir). Bunun neden doğru olduğunu görmek için, asgari seviyeye ulaşan bir konfigürasyon bulun; değiştirdiğimizi söylep2p2p1p2p3|p1-p2|+|p2-p3|p2=p1.

Hangi sayıyı değiştireceğimizi seçmenin 4 yolu vardır; Bunların her biri için sadece 3 mutlak farkın toplamını hesaplamamız gerekiyor.

3x4rbind


4

Jöle , 11 10 bayt

I;SASƲ$-ƤṂ

Çevrimiçi deneyin!

Girdi olarak tamsayı varsa bir liste alan bir monadik bağlantı. Keyfi liste boyutu için çalışmalı. Her sayı listeden çıkarılarak test edilerek, sihir toplamının hesaplanmasında ve asgari puanın alınmasında asgari miktarın elde edilebileceği esasına göre çalışır.


3

Jöle , 8 bayt

ṁ-Ƥ⁸IA§Ṃ

Bir tamsayı veren bir tamsayı listesini * kabul eden bir tek yönlü Bağlantı

* 1'den fazla olduğu sürece herhangi bir sayı olabilir; Etrafını saran komşuları farklılıkları toplayan aynı stil sihirli formülü kullanarak.

Çevrimiçi deneyin!

Nasıl?

ṁ-Ƥ⁸IA§Ṃ - Link: list of integers, X       e.g. [17,-6,15,33]
 -Ƥ      - for overlapping "outfixes" of length length(X)-1:
         -                                      [[-6,15,33],[17,15,33],[17,-6,33],[17,-6,15]]
ṁ  ⁸     -   mould like X                       [[-6,15,33,-6],[17,15,33,17],[17,-6,33,17],[17,-6,15,17]]
    I    - incremental differences              [[21,18,-39],[-2,18,-16],[-23,39,-16],[-23,21,2]]
     A   - absolute (vectorises)                [[21,18,39],[2,18,16],[23,39,16],[23,21,2]]
      §  - sums                                 [78,36,78,46]
       Ṃ - minimum                              36

3

Japt -Q , 11 bayt

ñÍó ®r- ÑÃn

@ Xnor'ın algoritmasını kullanır, bu da beni 4 byte kurtardı.

@Shaggy sayesinde 5 bayt kaydedildi

Dene


iyi çalışıyor gibi görünüyor, ancak bunun neden işe yaradığını açıklar mısınız?
Koishore Roy,

@KoishoreRoy Bir açıklama eklendi
Ignorance

29 bayt (I Sanırım )
Shaggy,

Cevabımı güncellediğim zaman @Shaggy, yanlışlıkla haritaların yerini aldım, bazı golfleri geçersiz kıldım, ancak diğerleri iyi
Ignorance'ın Düzeni

Güzel (daha fazla) golf oynadı :) Yeni bir satırla değiştirerek 1 bayttan daha fazla tasarruf edebilirsiniz ÃÃ.
Shaggy,

3

J , 24 20 18 17 bayt

xnor algoritmasını kullanarak alternatif versiyon:

2*[:<./2 2-/@$\:~

Nasıl

İki kez 2 *dak [:<./ilk satırdan çıkarılır 2. sıra [:-/şekillendirme ile oluşturulan 2x2 matris 2 2$giriş aşağı kriteri\:~

Çevrimiçi deneyin!

orijinal cevap: J , 24 bayt

[:<./1(1#.2|@-/\],{.)\.]

Çevrimiçi deneyin!

Nick Kennedy'nin fikrini kullanmak.

  • 1(...)\.] fiilleri parens cinsinden uzunluk 1'deki bütün dış cisimlere uygulayın (n uzunluktaki n eki, n bitişik elemanların kaldırıldığı bir listedir, bu yüzden 1 elm kaldırılmış olan her olası listeyi oluşturur)
  • (1 #. 2 |@-/\ ] , {.) Bu, ilk toplamı girişe ekleyerek sihir toplamını hesaplar. ] , {. ve abs farkını |@-/uzunluk 2'deki eklere uygulayarak 2 ...\ve sonucu toplayarak1 #. .
  • [:<./ dk döndürür

2

05AB1E , 11 7 bayt

Port @xnor 'ın Jelly cevap . @Emigna ve @Grimy
sayesinde -4 byte .

{2ô`αß·

Çevrimiçi deneyin.

Yalnızca 05AB1E'nin eski sürümünde çalışan 7 bayt alternatif ( yeni sürümden önce gerekir ¥):

{2ôø¥W·

Çevrimiçi deneyin.

Açıklama:

{        # Sort the (implicit) input-list
         #  i.e. [17,-6,15,33] → [-6,15,17,33]
 2ô      # Split this list into parts of size 2
         #  → [[-6,15],[17,33]]
   `     # Push both separated to the stack
    α    # And take their absolute differences
         #  → [23,18]
     ß   # Pop and push the minimum
         #  → 18
      ·  # Double it (and output implicitly as result)
         #  → 36

{        # Sort the (implicit) input-list
         #  i.e. [17,-6,15,33] → [-6,15,17,33]
 2ô      # Split this list into parts of size 2
         #  → [[-6,15],[17,33]]
   ø     # Zip/transpose, swapping rows/columns
         #  → [[-6,17],[15,33]]
    ¥    # Get the deltas/forward differences of the inner lists
         #  → [[23],[18]]
     W   # Get the flattened minimum (without popping)
         #  → 18
      ·  # Double it (and output implicitly as result)
         #  → 36

1
Mirası 7 bayt: {2ôø¥W·veya yeniden yazma ile 8 .
Emigna

2
{2ô`αW·
Mirassız

@Emigna Smart, teşekkürler!
Kevin Cruijssen

@Grimy de teşekkürler!
Kevin Cruijssen

1

C ++ (gcc)

tam program: 138 bayt

#include<iostream>
#include<regex>
using namespace std;int main(){int a[4];for(int&b:a)cin>>b;sort(a,a+4);cout<<min(a[2]-*a,a[3]-a[1])*2;}

Çevrimiçi deneyin!

çekirdek işlevi: 84 bayt

#include<regex>
int m(int*a){std::sort(a,a+4);return std::min(a[2]-*a,a[3]-a[1])*2;}

Çevrimiçi deneyin!

Ayrıca xnor algoritmasını kullanarak Python 2 yazısında açıklanmıştır.


0

Kömür , 20 bayt

I⌊EEθΦθ⁻κμΣEι↔⁻λ§ι⊕μ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Anladığım kadarıyla @ NickKennedy'nin fikrini kullanıyorum. Açıklama:

   Eθ                   Map over input array
     Φθ                 Filter over input array where
       ⁻κμ              Outer and inner indices differ
  E                     Map over resulting list of lists
           Eι           Map over remaining values in list
                §ι⊕μ    Get the next value in the list
             ↔⁻λ        Compute the absolute difference with the current value
          Σ             Take the sum of absolute differences
 ⌊                      Take the minimum sum
I                       Cast to string and implicitly print



0

Java 8 , 235 bayt

@ Xnor'ın Python cevap ve algoritmasının limanı

import java.util.*;interface M{static void main(String[]A){Scanner I=new Scanner(System.in);int a[]={0,0,0,0};for(int i=0;i<4;a[i++]=I.nextInt());java.util.Arrays.sort(a);System.out.print(2*(a[2]-a[0]>a[3]-a[1]?a[3]-a[1]:a[2]-a[0]));}}

Çevrimiçi deneyin!

Java 10 , kanıtlanmamış, 222 bayt

Java 10 ile Tarayıcı bildiriminin sol tarafını değiştirmem gerekir var , , ancak çevrimiçi olarak derleyemedim ve bu nedenle yalnızca önemsiz şeyler ekleyebilirim. Üzgünüm.

interface M{static void main(String[]A){var I=new java.util.Scanner(System.in);int a[]={0,0,0,0};for(int i=3;i<4;a[i++]=I.nextInt());java.util.Arrays.sort(a);System.out.print(2*(a[2]-a[0]>a[3]-a[1]?a[3]-a[1]:a[2]-a[0]));}}

1
AFAIK, diğer cevapların yaptığı gibi, gönderiminiz gibi bir işleviniz olabilir. Çevredeki sınıfı, arayüzü vb
Tau
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.