Cüceler ve Paralar


32

Durum:

Birkaç ( M) cüceler goblinin göğsünü Naltın paralarla buldu ve bölmek zorunda kaldı. Yaşlılık sırasına göre yağma korsanlarının tahsis edilmesini düzenleyen eski kurallar nedeniyle, en yaşlı cüce bir sonraki en eski cüceden bir jeton almalı ve böylece en genç cüce M-1en eski cüceden daha az para alacaktır. Ek olarak, hiçbir cücenin herhangi bir madeni paraya atması gerekmez (yani herhangi bir cüceye negatif madeni para yok)

Cücelere paraları bu şekilde bölmeleri için yardım edin veya onlara bunun imkansız olduğunu söyleyin.

Kazananın kodu her zaman doğru cevap vermelidir (bu meydan okuma belirleyicidir) ve genel kurallarına uymalıdır.

Giriş

Madeni para sayısı için bir tamsayı N (3 ≤ N ≤ 1000) ve boşlukla ayrılmış, cüce sayısı için bir tamsayı M (3 ≤ M ≤ N) verilir.

Çıktı

Bozuk paraları cücelerin istediği şekilde bölmek mümkün değilse, -1 (eksi bir) değerini yazdırın. Aksi takdirde, her cücenin alacağı para sayısını, en eskiye doğru en küçük olana kadar yazdırın. Sayıları boşluklarla ayırın.

Örnekler :

giriş

3 3

çıktı

2 1 0

giriş

9 3

çıktı

4 3 2

giriş

7 3

çıktı

-1

giriş

6 4

çıktı

3 2 1 0

4
Bir "korsan" özledin.
Rawling


3
İyi bul, @Raystafarian. Belki de öğretmen sadece 3 yerine M cüceleri için genel bir çözücü aldığında, kullanıcının cevabı kalabalıklaştırdığını anlar :) - özellikle bu çözücü J'de ise
ProgramcıDan

Ödev olsun ya da olmasın, Şirin güzel bir soru!
Seviye River St

Yanıtlar:


18

J - 32 29 28 25

Değil diğer J çözümlerinden daha kısa, fakat ve farklı bir fikir kullanır

(]{.[:i:-:@-.@]-%)/ ::_1:

En yüksek dereceli cücenin aldığı para sayısının cevabı basitçe N/M+(M-1)/2(eğer bir tamsayıysa), bunun negatifini oluştururuz -:@-.@]-%. Sonra argüman için i:böyle bir dizi yapar ve ondan M elementini alırız.2 1 0 _1 _2_2


1
Pırıl pırıl bir kullanım için +1 i:. Başka bir üç karakterin %yerine yazarak [%]ve -.@]yerine kullanarak kaydedebilirsiniz (1-]).
algoritmshark

@algorithmshark Teşekkürler J meraklısı!
homoseksüel

1
@Swish olarak soyamayacağımız cüceler gibi gözüküyor. ;)
Consonstor,

11

J - 30 karakter

Golf için çok eğlenceli. Bir çok şey düzgünce çözüldü.

((+/@s~i.[){ ::_1:s=.+/&i.&-)/

Açıklama:

  • /- Boşluk ile ayrılmış tamsayıları argüman olarak alın ve işlevi aralarında kaydırın. Yani, parantez içindeki fonksiyonun sol argümanını N düşünün (...)ve M de sağ argümanını M

  • i.&-- Negate ( -) ve ardından tam sayıları ( i.) alın. Normalde, yaptığınız gibi bir şey i.5yaptığınızda 0 1 2 3 4. Ne zaman i.negatif bir sayı alsa, o çıktı listesini tersine çevirir. Yani örneğin i._5verecek 4 3 2 1 0.

  • s=.+/&- Her argümanda ( &) yukarıdaki işlemi yapın ve daha sonra +/bu dizilerin dışında bir ek tablo ( ) yapın. Şimdi her satırın M cücelerine muhtemel bir jeton dağılımı olduğu bir tablomuz var, ancak N jetonu olsa bile. Sonunda, bu tablo yapma fiili o kadar kullanışlıdır ki, sonu sonra arayacağız ve tekrar kullanacağız.

  • +/@s~- Şimdi stekrar kullanıyoruz, fakat ~argümanların sırasını değiştiriyoruz , böylece masayı değiştiriyoruz. Bu, tabloyu ( +/@) oluşturduktan sonra her bir sıranın toplamını almanın, J'nin çok boyutlu listeleri toplama yöntemiyle bir ilgisi var .

  • i.[ - Bu toplamlar listesinde, sola, yani N'ye verilen argümanları ararız.

  • { ::_1:- Şimdi dizini tablodan bir satır çıkarmak için kullanmaya çalışıyoruz s. {Dizin geçersizse bir etki alanı hatası atar; bu durumda hatayı ( ::) alırız ve -1 ( _1:) döndürür . Bu her şeyi halleder. i.&-Daha önce kullandığımızdan , madeni para dağılımı gerektiği gibi azalan sırada olacaktır.

Kullanımı:

   ((+/@s~i.[){ ::_1:s=.+/&i.&-)/ 9 3
4 3 2
   ((+/@s~i.[){ ::_1:s=.+/&i.&-)/ 7 3
_1
   ((+/@s~i.[){ ::_1:s=.+/&i.&-)/ 6 4
3 2 1 0
   ((+/@s~i.[){ ::_1:s=.+/&i.&-)/ 204 17
20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4

Girdi 9 3dönmelidir 4 3 2değil -1. Örnek kullanımınızda bir geçiş var mı?
ProgrammerDan

@ProgrammerDan Teşekkürler, bunu anlamadı. Örnekleri yanlış yazdım. beklendiği gibi 9 3verir 4 3 2ve 7 3verir _1.
algorithmshark

Düzeltme gördüm ve uygun şekilde + 1'ledi: D. J'ye bakmalıyım, şık görünüyor.
ProgramcıDan

7

R - 71 70 67 66 65 karakter

s=scan();m=s[2];x=s[1]-sum(1:m);cat(if(x%%m|-m>x)-1 else x/m+m:1)

Ungolfed:

s = scan()    # Reads N and M by stdin.
m = s[2]
x = s[1] - m*(m-1)/2
cat(if (x %% m | x < -m) -1 else x/m + m:1)

Çözüm:

Eğer M cücelerin sayısıysa, o zaman ücretli altın dizisi iki tekil diziye ayrıştırılabilir. İlk önce sıfır ile biten bir seri: M-1, ..., 2, 1, 0 ve sabit bir dizi c, c, ..., c. İlk serinin toplamı her zaman M * (M-1) / 2'dir. Böylece, kalan (x = N - M * (M-1) / 2) geri kalan kısım olmadan bölünebilirse (modulo eşit 0), her cüce x / M artı azalan serinin bir kısmını alır.

Kullanımı:

> s=scan()
1: 10 4
3: 
Read 2 items
> m=s[2]
> x = s[1] - m*(m-1)/2
> cat(if (x %% m || x<0) -1 else x/m + (m-1):0)
4 3 2 1

-1, soru bir fonksiyon değil, tam bir program yazmayı gerektirir. Bkz. Meta.codegolf.stackexchange.com/a/1146/8766
user80551

@ user80551 Haklısın. Şimdi pasajı düzelttim: şimdi boşlukla ayrılmış girişi alıyor; çıktı ayrıca artık '[1]' göstermiyor.
lambruscoAcido

1
Sen yerine başka bir karakter kaydedebilirsiniz m*(m+1)/2ilesum(1:m)
Brian Diggs

@ Brian Thx, kodumu değiştireceğim!
lambruscoAcido

4

PHP (187)

Bu benim ilk golf denemem ve daha iyi olabileceğini biliyorum ama yine de :)

golfed:

<?php
$b=fgets(STDIN);list($c,$d)=explode(' ',$b);if((($d&1)AND($c%$d==0))OR($c%$d==$d/2)){for($e=floor($c/$d)+floor($d/2);$e>floor($c/$d)-round($d/2);$e--){echo"$e ";}}else{die('-1');}?>

Ungolfed:

<?php
$a = fgets(STDIN);
list($coins, $dwarves) = explode(' ', $a);
if ((($dwarves & 1) AND ($coins % $dwarves == 0)) OR ($coins % $dwarves == $dwarves / 2)) {
    for (
        $i = floor($coins / $dwarves) + floor($dwarves / 2);
        $i > floor($coins / $dwarves) - round($dwarves / 2);
        $i--
    ) {
        echo "$i ";
    }
}
else { 
  die('-1');
}
?>

Bir kabukta yürütün

Temel fikir:

Bunlardan biri doğruysa, paralar bu kurallarla ayrılabilir:

  1. Cüceler tek sayıdır ve madeni paralar artıkları olmayan cüceler tarafından bölünebilir
  2. Cüceler çift sayılardır ve paraları / cüceleri böldükten sonra kalan paralar cüce sayısının yarısına eşittir

Öyleyse, cüce başına ortalama paraları (ACPD) temel alıyoruz. Fakat en yüksekten başlayıp, en düşük seviyeye ulaşana kadar çıkmalıyız. Bu nedenle, ACPD + 'dan başlayarak, cücelerin geri kalanının sayısını daha yüksek olan sonlara doğru sayacı olan bir döngü yapıyoruz ve ACPD'ye ulaşana kadar devam ediyoruz - cücelerin geri kalanının alt ucuna kadar.

Cüceler tek ise (yani 5 cüce - ortadaki 3 3 ve her iki ucunda da 2 kalır) temelde aynıdır, ama eğer öyle değillerse - zemine ve yuvarlaklığa güveniyoruz.

Şimdiye kadarki problemler: Çok düşük jeton sayısına sahip olan işler, bu da bazı cücelerin bertaraf edileceği ve kıymetli kazançlarından mahrum bırakılacağı anlamına gelir. Ve bu üzücü. Ya da en azından cüceleri seviyorsan.

Çözüm :

  1. En düşük para miktarını hesaplamanın bir yolunu düşünün, böylece hesaplama tozdaki cüceler ile sonuçlanmayacaktır.
  2. Açgözlü olmayan cüceler tasarlayın.

Daha akıllı çözüm :

Paralar metaldir. Cücelerin hepsini eritmelerini sağlayın ve daha sonra daha küçük / daha büyük madeni paralarla doldurun, böylece her durumda bölünebilirler.

En akıllı çözüm :

Dağlarını çal, kendini Smaug olarak yeniden adlandır ve hepsini kendine sakla. Sonuçta, neden huysuz cücelerle uğraşmak zorundasın?


4

Piton 3 (100)

@Geobits ile aynı fikri kullanmak, ancak giriş ve çıkış gereksinimlerine uymak.

n,m=map(int,input().split())
κ,ρ=divmod(n-m*(m-1)//2,m)
x=[-1]if ρ else range(κ,κ+m)[::-1]
print(*x)

Yardımların için teşekkürler. Giriş taleplerine eklenen boşlukların farkına varmadım.
Geobits

Bunlar 100 karakter olabilir, ancak Yunan değişken adları nedeniyle, 105 bayt gerektirir.
Jonathan Frech

4

Python 3 - 109 107 103 102 90 93

Evpok ile aynı fikri kullanmak, ancak bazı iyileştirmeler yapmak.

n,m=map(int,input().split())
k=n/m+m/2
a=int(k)
print(*(range(a,a-m,-1),[-1])[k-a-.5or~a>-m])

İyileştirmeler:

  1. Boşlukları birbiri ardına ve öncesi '' ortadan kaldırmak. 1 karakter
  2. İçinde bölme () işlevinin kaldırılması, çünkü boşluklarda bölme varsayılandır. 3 karakter
  3. Divmod içindeki -1 ila +1'i değiştirerek x'i 1'e düşürün ve ardından aralığın tersine çevrilmiş sırasını kullanmak için aralık işlevini değiştirin. 3 karakter
  4. EDIT: ... eğer ... else ... ... ve ... veya ... 2 karakter olarak değiştirildi.
  5. EDIT: Divmod açıkça yapıldı, r kaldırıldı. 4 karakter
  6. EDIT: x kaldırıldı, m // n açıkça kullanıldı. 1 karakter
  7. EDIT: '' .join yerine yıldızlı ifadeler kullandı (harita (str, ...)), tekrarı () tekrarlamaktan kaçınmak için x eklendi. 12 karakter
  8. EDIT: Cücelere verilmiş negatif paraların alınmasına izin verdiğimi fark ettim. Bundan kaçınmak için kodu değiştirdim.

Aferin, öğretici oldu :) Gereksiz yere soyunmak için cevabımı değiştirdim, ancak tasarruf etme numaralarınız [::-1]benim çözümümden daha iyi. +1
Evpok

Bir şey eksik olabilir, ancak 94 yerine 93 bayt saydım.
Jonathan Frech

3

Python 3 - 114

n,m=map(int,input().split(' '))
r=range(m);n-=sum(r)
if n%m<1:
 for x in r:print(m-x+n//m-1,end=' ')
else:print -1

Tarafından N-(M*(M-1)/2)eşit olarak bölünebilir olup olmadığını kontrol ederek çalışır M. Python için yeni, bu yüzden herhangi bir ipucu takdir etti.

Ideone.com örneği

Input:
735 30
Output:
39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10

Python 2'nin printifade tarzını destekleyen bir Python 3 sürümü var mıydı ? Veya son satırın ( else:print -1) bir hataya neden olmaması nasıl ?
Jonathan Frech

3

C # - 322

using System;using System.Linq;namespace D{class P{static void Main(string[]args){int n=Convert.ToInt16(args[0]);int m=Convert.ToInt16(args[1]);bool b=false;int q=n/2+1;g:b=!b;int[]z=new int[m];for(int i=0;i<m;i++){z[i]=q-i;}if(z.Sum()==n)foreach(int p in z)Console.Write(p+" ");else{q--;if(b)goto g;Console.Write(-1);}}}}

Korkunç bir skor ama farklı bir yaklaşım kullandım ve kullanmaya başladım goto:)

Sonra kısaltacağım.


1
Bu Convert.ToInt16çağrıların hepsini kesinlikle kısaltabilirsiniz int.Parse. Önceden atanmış herhangi bir değişkeni var(örneğin yerine int[]) ile ilan edebilirsiniz . Komut satırı paragraflarınızın aranmasına gerek yok args. Ve sık kullanılan türler takma ad olabilir using C = Console. Ayrıca, bu kadar uzun bir çözüm için, birkaç karakter kaydetmek yerine bozulmamış satır aralıklarını sunmaktan daha iyi olduğunu düşünüyorum. Oh, ve neden gotoburada alternatiflerden daha iyi olduğundan da emin değilim .
Aaronaught

3

Java 210

class A { public static void main(String[] a){int d=Integer.parseInt(a[0]),c=Integer.parseInt(a[1]);if (2*c%d==0) for (int i=0;i<d;i++) System.out.print((((1+(2*c/d)-d)/2)+i)+" "); else System.out.print(-1);}}

2
PPCG'ye hoş geldiniz, kaldırılabilecek çok fazla boş alan bulunduğunu görüyorum.
pastebin.com 0mr8spkT'yi

Cevabınızı biraz daha arttırmak için daha fazla yer ayırabilirsiniz - örneğin class A{public static void main(String[]a)geçerli ve size 3 karakter kazandırır. Her biri ifve her biri etrafından forboşlukları ... vs. kaldırın.
ProgrammerDan

"Genel statik boşluk ana (S") bölümünün J çözümünün tamamı kadar olması çok çılgınca :)
Robert Grant

3

R: 77 73 70 karakter

a=scan();r=a[2]:1-1;while((n=sum(r))<a[1])r=r+1;cat(`if`(n>a[1],-1,r))

(M-1) 'den 0 a giden bir vektör oluşturun ve toplam artık N'den aşağı çıkmayacak olana kadar her sayıya 1 ekler.

Girintili ve hafifçe çirkin:

a=scan()   #Reads in stdin (by default numeric, space-separated)
r=a[2]:1-1 #Creates vector (M-1) to 0
while(sum(r)<a[1])r=r+1 #Increments all member of vector by 1 until sum is not inferior to N
cat( #Outputs to stdout
    `if`(sum(r)>a[1], -1, r) #If superior to N: impossible, returns -1
    )

Örnek kullanım:

> a=scan();r=a[2]:1-1;while((n=sum(r))<a[1])r=r+1;cat(`if`(n>a[1],-1,r))
1: 9 3
3: 
Read 2 items
4 3 2
> a=scan();r=a[2]:1-1;while((n=sum(r))<a[1])r=r+1;cat(`if`(n>a[1],-1,r))
1: 7 3
3: 
Read 2 items
-1
> a=scan();r=a[2]:1-1;while((n=sum(r))<a[1])r=r+1;cat(`if`(n>a[1],-1,r))
1: 204 17
3: 
Read 2 items
20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4

2

Julia, 45

f(n,m)=(x=n/m-m/2+1/2;x%1==0?[x+m-1:-1:x]:-1)
julia> f(6,4)'
1x4 Array{Float64,2}:
 3.0  2.0  1.0  0.0

Sadece bir miktar cebir, olması gerekenden daha uzun sürdü.


2

JavaScript - 76

K + (k - 1) + ... + (k - (M - 1)) = M (k - (M - 1) / 2) Bunu N'ye eşit ayarlamanın k = N / M + (M) verdiğini gözlemleyin. En yüksek miktar için -1) / 2. Bu tamsayıysa, k% 1 == 0 ve aradığımız miktarlar k, k - 1, ..., k - (M - 1).

Muhtemelen bu kısaltmayı başka bir dilde de yazabilirdim, ancak henüz bir JS çözümü yoktu, işte burada:

N=3;M=3;if((r=N/M+(M-1)/2)%1)console.log(-1);else while(M--)console.log(r--)

Konsolda koş.

Örnek giriş:

N=3;M=3;if((r=N/M+(M-1)/2)%1)console.log(-1);else while(M--)console.log(r--)

Çıktı:

3
2
1 

Giriş:

N=6;M=4;if((r=N/M+(M-1)/2)%1)console.log(-1);else while(M--)console.log(r--)

Çıktı:

3
2
1
0

Giriş:

N=7;M=3;if((r=N/M+(M-1)/2)%1)console.log(-1);else while(M--)console.log(r--)

Çıktı: -1

Console.log çok kötü, hecelemek çok uzun :) :) Ne yazık ki, ilan l=console.log.bind(console)daha kısa sürmez ve sadece l=console.logişe yaramaz.

Giriş:

"N=3;M=3;if((r=N/M+(M-1)/2)%1)console.log(-1);else while(M--)console.log(r--)".length

Çıktı:

76

Kısaltmak için kullanabilir c=consoleve kullanabilirsiniz c.log().
user2428118

2

Golf Betiği, 35

~:M.(*2/-.M%{;-1}{M/M+,-1%M<' '*}if

Nasıl çalışır

Aşağıdaki örnekte, giriş 9 3.

          # STACK: "9 3"
~         # Interpret the input string.
          # STACK: 9 3
:M        # Store the top of the stack (number of dwarves) in variable `M'.
.         # Duplicate the top of the stack.
          # STACK: 9 3 3
(         # Decrement the top of the stack.
          # STACK: 9 3 2
*         # Multiply the topmost elements of the stack.
          # STACK: 9 6
2/        # Divide the top of the stack by `2'.
          # STACK: 9 3
          # So far, we've transformed `M' into `M*(M-1)/2', which is the minimum amount of
          # coins all dwarves together will get. This number comes from the fact that the
          # youngest dwarf will get at least 0 coins, the next at least 1 coin, etc., and
          # 0 + 1 + ... + (M - 1) = M*(M-1)/2.
-         # Subtract the topmost elements of the stack.
          # STACK: 6
          # The remaining coins have to get reparted evenly to all dwarves.
.         # Duplicate the top of the stack.
          # STACK: 6 6
M%        # Calculate the top of the stack modulus `M'.
          # STACK: 6 0
{         # If the modulus is positive, the remaining coins cannot get reparted evenly.
    ;-1   # Replace the top of the stack by `-1'.
}
{         # If the modulus is zero, the remaining coins can get reparted evenly.
    M/    # Divide the top of the stack by `M'.
          # STACK: 2
          # This is the number of coins all dwarves will get after giving 1 to the second
          # youngest, etc.
    M+    # Add `M' to the top of the stack.
          # STACK: 5
    ,     # Replace the top of the stack by an array of that many elements.
          # STACK: [ 0 1 2 3 4 ]
          # The rightmost element is the number of coins the oldest dwarf will get.
    -1%   # Reverse the array.
          # STACK: [ 4 3 2 1 0 ]
    M<    # Keep the leftmost `M' elements.
          # STACK: [ 4 3 2 ]
          # There are only `M' dwarves.
    ' '*  # Join the array, separating by spaces.
          # STACK: "4 3 2"
}if

1

Delphi XE3 (176)

uses SysUtils;var d,c,i:integer;begin read(c,d);for I:=1to d-1do c:=c-i;if c mod d>0then writeln(-1)else begin c:=c div d;for I:=d-1downto 0do write(IntToStr(i+c)+' ');end;end.

Nasıl çalışır.

2 tam sayı, sikke ve cüceleri okur.
Cüce başına farkı çıkarır.
Kalan mod cüceler> 0 ise, imkansızdır.
Başkaları cüceler-1'den 0'a kadar cüceler döngüsünde cüce başına eşit hisse almak ve dwarfIndex + eşit hisse basmak

Ungolfed

uses SysUtils;
var
  d,c,i:integer;
begin
  read(c,d);
  for I:=1to d-1do
    c:=c-i;
  if c mod d>0then
    writeln(-1)
  else
  begin
    c:=c div d;
    for I:=d-1downto 0do
      write(IntToStr(i+c)+' ');
  end;
end.

1

Mathematica 65

İşlev, gm'nin 0'dan n'ye kadar olan tüm artan dizileri oluşturur ve bunların m'nin toplanıp toplanmadığını kontrol eder. Başarılı olursa, dizi döndürülür; Aksi takdirde -1 döndürülür.

Diziler, Partition{bitişik tamsayıların tüm olası alt listelerine {0,1,2,3… m} listesi eklenerek yapılır.

Elbette, aynı etkiyi elde etmenin daha etkili yolları var, ancak bulduğum daha fazla kod gerektiriyor.

n_~g~m_:=If[(s=Select[Partition[0~Range~n,m,1],Tr@#==n&])=={},-1,s]

Örnekler

g[9, 3]

{{2, 3, 4}}


g[3, 3]

{{0, 1, 2}}


g[7, 3]

-1


g[705, 3]

{{234, 235, 236)}


g[840, 16]

{{45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60}}


g[839, 16]

-1


1

C 131

#include <edk.h>
main(int a,char **v){int j=atoi(*++v),k=atoi(*++v)-j*(j-1)/2;k<0||k%j?j=1,k=-1:k/=j;while(j--)printf("%d ",k+j);}

Ungolfed

#include <edk.h> //Shortest standard header including stdio.h and stdlib.h
main(int a,char **v)
{
    int j=atoi(*++v),k=atoi(*++v)-j*(j-1)/2;

    k<0||k%j?j=1,k=-1:k/=j;  // If youngest dwarf gets < 0 or amount not equally divisible then set values such that ...

    while(j--)printf("%d ",k+j); // ... loop prints out correct values
}

Bu bir uyarı ile derlenir çünkü ana tip yoktur. Bu golf kurallarında geçerli değilse beş karakter eklemek zorunda kalacağım.


1

Kobra - 198

Cobra Web Sitesi

class P
    def main
        x,y=Console.readLine.split
        a,b=x to int,y to int
        l=[]
        t=n=0
        for i in b,t+=i
        while (t+=b)<=a,n+=1
        for i in b,l.insert(0,i+n)
        print if(t-b<>a,-1,l.join(" "))

Açıklaması:

class P
    def main

Kodun çalışması için gerekli

        x,y=Console.readLine.split
        a,b=x to int,y to int

Girdi alır ve saklar aveb

        l=[]
        t=n=0

Çıktı listesini lbaşlatır ve ther cüceye eklenmesi gereken toplam gerekli parayı ve jeton sayısını başlatır.n

        for i in b,t+=i

Tüm cücelerin kazıklarında izin verilen sayıda bozuk para bulunmasına neden olacak en düşük olası para değerini bulur

        while (t+=b)<=a,n+=1

Her yığına kaç para ekleneceğini belirler, böylece gerekli toplam para> toplam kullanılabilir paraya

        for i in b,l.insert(0,i+n)

Listeyi farklı büyüklükteki para yığınlarıyla doldurur

        print if(t-b<>a,-1,l.join(" "))

Çıktıları -1veya lgerekli toplam paranın mevcut toplam paraya eşit olup olmamasına bağlı olarak



-1

Python ( 100 96 94):

Güzel, yuvarlak skorlu bir cevap. Artık değil, ama şimdi daha kısa.

def f(n,m):a=range(m)[::-1];b=n-sum(a);c=b/m;d=[i+c for i in a];return(d,-1)[-1in d or c*m!=b]

Ungolfed:

def f(n,m):
 a = range(m)[::-1]
 b = sum(a)
 c = (n-b)/m
 if c * m != n-b: return -1
 d = [i+c for i in a]
 return (d,-1)[-1 in d or c!=n-b]
 if -d in d or c*m!=n-b:
  return -1
 return d

Çıktı:

def f(n,m):a=range(m)[::-1];b=sum(a);c=(n-b)/m;d=[i+c for i in a];return (d,-1)[-1 in d or c*m!=n-b]

f(3,3)
Out[2]: [2, 1, 0]

f(9,3)
Out[3]: [4, 3, 2]

f(7,3)
Out[4]: -1

f(6,4)
Out[5]: [3, 2, 1, 0]

2
Bu giriş şartını yerine getirmiyor.
Austin Henley

-1, soru bir fonksiyon değil, tam bir program yazmayı gerektirir. Bkz. Meta.codegolf.stackexchange.com/a/1146/8766
user80551
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.