Bir sayıyı, toplamı o sayıya eşit olan bir değerler listesine dağıtın


15

Muhtemelen basit bir kod-golf meydan okuma. Verilen 2 pozitif tamsayı mve toplamı sayıya eşit olan pozitif tamsayılar olan değerlerin nbir listesini yapın . Çıktıdaki tüm değerler aynı değerdir veya fark tam olarak 1'dir.nm

Örnekler

Örneğin

  • m=6ve n=3olur2, 2, 2
  • m=7ve n=3olur 2, 2, 3ya 2, 3, 2da veya 3, 2, 2
  • m=7ve n=2olur 3, 4ya da4, 3
  • m=7ve n=1olur7
  • m=7ve n=88 pozitif tamsayının toplamı 7 olamaz çünkü bir hata oluşturur.
  • m=10ve n=4olacak 3, 3, 2, 2ya da başka permütasyon

kurallar

  • Hem giriş hem de çıkış yalnızca pozitif tamsayılarla ilgilidir.
  • Çıktıdaki tüm değerler aynı değerdir veya fark tam olarak 1'dir.
  • Listedeki değerlerin sırası önemli değildir.
  • Listedeki değerlerin toplamı eşittir m.
  • Çözülemezse, bir hata veya yanlış değer oluşturun (örneğin m = 7 ve n = 8 olması durumunda).
  • Sonuç olarak diğer kurallar m=8ve n=3herhangi bir permütasyon üretecek 3, 3, 2(değil 2, 2, 4)

Kazanan

Bu kod golf, bu yüzden bayt cinsinden ölçülen en kısa geçerli cevap kazanır.


Sıfırın pozitif olmadığını varsayıyorum?
TheLethalCoder


1
@aras Ben matematikçi değilim ama okuduğumdan genellikle bağlama bağlıdır. Bazıları, bazı olumlu ve olumsuz, bazı olumlu vb hem imzasız olduğunu söylemek
TheLethalCoder

1
@TheLethalCoder bu arada, java (ve genel olarak kayan nokta), float a = -0f, b = 0f; System.out.println(a == b); System.out.println(a + "," + b);... üretir trueve -0.0,0.0. Bakın, pozitif 0 ve negatif 0 açıkça iki ayrı sayıdır ... uygulama öyle diyor!
Sokratik Phoenix

Yanıtlar:


2

Gaia , 4 bayt

…÷l¦

Bunun için neredeyse sadece bir yerleşik var ...

açıklama

…     Get the range [0 .. m-1].
 ÷    Split into n roughly even length chunks. Throws an error if the number of chunks if 
       more than the list's length.
  l¦  Get the length of each chunk.

05AB1E ile de 4 baytlık bir çözüm olduğunu düşündüm. Artık gittiğine karar vermemi kolaylaştırıyor. Tebrikler ve teşekkürler!
Christiaan Westerbeek


5

Mathematica, 33 bayt

#>#2&&Last@IntegerPartitions@##1&

giriş

[63, 11]

çıktı

{6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5}

çözülemediğinde yanlış çıktılar


5

MATL , 7 bayt

:gie!Xs

Çözüm olmadığında, çıktı en az bir sıfır içeren bir dizidir, ki bu MATL'de yanlıştır.

Çevrimiçi deneyin!

açıklama

Girişleri m = 10ve n = 4.

:      % Implicitly input m. Push [1 2 ... m]
       % STACK: [1 2 3 4 5 6 7 8 9 10]
g      % Logical: convert nonzeros to 1
       % STACK: [1 1 1 1 1 1 1 1 1 1]
i      % Input n
       % STACK: [1 1 1 1 1 1 1 1 1 1], 4
e      % Reshape into matrix with n rows, padding with zeros
       % STACK: [1 1 1;
                 1 1 1;
                 1 1 0;
                 1 1 0]
!      % Transpose
       % STACK: [1 1 1 1;
                 1 1 1 1;
                 1 1 0 0]
Xs     % Sum of each column. Implicitly display
       % STACK: [3 3 2 2]


4

Kömür , NDD uyguladıktan sonra 15 bayt 1

¿÷NNIEIη÷⁺IθιIη

Çevrimiçi deneyin!

Çözüm yoksa hiçbir şey çıktılamaz. Bağlantı Ayrıntılı sürümü .

1 NDD = Neil Odaklı Geliştirme.

Önceki cevabım:

Kömür , 32 27 24 20 bayt

NμNν¿÷μνIEν⁺÷μν‹ι﹪μν

Çevrimiçi deneyin!

Çözüm yoksa hiçbir şey çıktılamaz. Bağlantı Ayrıntılı sürümü .

Tabii ki, Neil'in yardımı olmadan golf oynayamazdım.


CastOperatörün çıkarılması bir nedenden dolayı çalışır, ancak bu ideal bir algoritma değildir ... 16 baytlık bir çözümüm var.
Neil

@Neil Mücadelesi kabul edildi!
Charlie

Önceden tanımlanmış değişkeni seviyorum, ancak şimdi Castlistelerde çalıştığını bilerek 11 bayta düştüm ...
Neil

@Neil Ve hala kullanamıyorum Map, Dünya'da nasıl çalışıyor?
Charlie,

Mapifadesi for, aynı döngü değişkenini kullanmaya kadar. Örneğin, örneğinizde, bir ifadeyi her seferinde bir listeye göndermek yerine Mapotomatik olarak toplar ve sonuç listesine göre değerlendirir.
Neil

3

R , 33 bayt

function(m,n)diff(trunc(0:n*m/n))

Bir liman Luis Mendo'nun Octave cevabı . Bunun önceki cevabımdan neredeyse% 50 daha kısa olması çok üzücü.

Çevrimiçi deneyin!

önceki yanıt, 63 bayt:

function(m,n,o=rep(m%/%n,n),d=m-sum(o))o+c(rep(0,n-d),rep(1,d))

İki (zorunlu) argüman mve ngolf amaçlı iki isteğe bağlı argüman alan anonim bir işlev . Bir vektörü artan sırada döndürür. Başarısızlık için, 0R'de falsey olan ilk değer olacaktır , çünkü ifsadece vektörün ilk değerini kullanır (bir uyarı ile).

Esasen aşağıdaki fonksiyona eşdeğerdir:

function(m,n){o=rep(m%/%n,n)
d=m-sum(o)
o+c(rep(0,n-d),rep(1,d))}

Çevrimiçi deneyin!


pryr::f(diff(trunc(0:n*m/n)))çalışır ve daha kısadır!
JAD

2

Jöle , 7 6 bayt

:ȧœsL€

Çevrimiçi deneyin!Falsy için hiçbir şey çıkarmaz.

Nasıl çalışır

:ȧœsL€    Main link. Arguments: m (integer), n (integer)
:         Integer division. Yields 0 if m < n; a positive integer otherwise.
 ȧ        Logical AND. Yields 0 if m < n; m otherwise.
  œs      Split into n roughly equal groups. Since the left argument is an integer,
          this implicitly converts it to [1..m] (or [] for 0) before splitting.
    L€    Length of €ach. If the inputs were 7 and 3, the previous result would be
          [[1,2,3],[4,5],[6,7]], so this would give [3,2,2].

2

TI-Basic, 23 bayt

:Prompt M,N
:N(M≥N
:int(Ans⁻¹randIntNoRep(M,M+N-1

Hata durumunda ERR: DIVIDE BY 0 döndürür


2

Oktav , 24 bayt

@(m,n)diff(fix(0:m/n:m))

Kod, anonim bir işlev tanımlar. Çıktı sayısal bir dizidir (satır vektörü). Bu dizi olmadığında, Octave'de yanlış olan en az bir sıfır içerir .

Çevrimiçi deneyin!

açıklama

0:m/n:mbir dizi üreten n+1değerlerle 0için madım m/n. fixher girişi yuvarlar 0ve diffardışık farklılıkları hesaplar.

Bir örnek olarak, burada tüm ara sonuçlardır m = 7, n = 3:

>> 0:m/n:m
ans =
         0    2.3333    4.6667    7.0000

>> fix(0:m/n:m)
ans =
     0     2     4     7

>> diff(fix(0:m/n:m))
ans =
     2     2     3

Sıfır içeren bir dizi yanlıştır. Bu bir streç gibi görünüyor, ama ben de Octave'ı bilmiyorum. Javascript'ten baskılarıyla geliyor, neden cehennem olmadığını söyleyebilirim. Benden +1.
Christiaan Westerbeek

@ChristiaanWesterbeek Teşekkürler! Bu diğer dillere geliyorsa ses garip açabilir, ama bu en ne kadar MATLAB / Octave
Luis Mendo

2

Haskell , 93 89 88 87 86 71 bayt

m!n|n<=m=e$m:(0<$[2..n])
e(a:b:x)|b<a=e$a-1:e(b+1:x)
e(a:x)=a:e x
e x=x

Çevrimiçi deneyin!

açıklama

Buradaki ana işlev e. ebir liste alır ve esas olarak soldan sağa doğru bir oklava çalıştırır. Listede sağa komşusundan daha büyük bir eleman varken, onu sağa doğru hareket ettireceğiz.

Şimdi tek yapmamız gereken, bu fonksiyonu yeterince gevşek bir liste ile beslemek ve sihri yapmasına izin vermektir. Seçeceğimiz listeyi sadece sıfırlar mizliyor n-1. Bunu yapmak kolay olduğu için.

Yapmamız gereken son şey, hata durumunun ele alındığından emin olmaktır. Bunun için sadece bir Non-exhaustive patterns in functionhata veriyoruz m>n.


Sana kurtulmak düşünüyorum error[]yerine kapsamlı olmayan desenli başarısız olarak: m!n|m>n=e$m:replicate(n-1)0.
Laikoni

Ayrıca (0<$[1..n-1])daha kısadır replicate(n-1)0.
Laikoni

2

C # (.NET Core) , 86 82 71 bayt

using System.Linq;a=>b=>new int[b].Select((x,i)=>(i<a%b?1:0/(a/b))+a/b)

geçersiz girişler için bir hata atar.

Çevrimiçi deneyin!

TheLethalCoder sayesinde -4 bayt

OlivierGrégoire sayesinde -11 bayt


1
Bu, şu anda yalnızca bir kod pasajıdır; sadece anonim bir işleve veya a=>b=>başlangıçta sarmanız gerekir .
TheLethalCoder

@TheLethalCoder Hmm emin misin? using System.Collections.GenericBir i döndürürsem eklemem gerekmez IEnumerable<int>mi?
LiefdeWen

Zaten yanlış aldım çünkü bir dizi döndürüyorsunuz (üçlünün ilk kısmını yanlış okudum). Ancak, yalnızca kodunuzda gösterilir ve IEnumerable<int>işlev tanımında olduğu gibi görüyorsanız using,.
TheLethalCoder

Hayır, .ToArray () içermeyen kod hala derlendiğinden, ipucunuz hala iyidir.
LiefdeWen

1
@ OlivierGrégoire Haklısın, özür dilerim ve teşekkür ederim.
LiefdeWen

2

Haskell, 48 bayt

m#n|m>=n=iterate(\(a:b)->b++[a+1])(0<$[1..n])!!m

nSıfırlar listesiyle başlayın . Tekrar etm zamanları: ilk elemanı alın, bir tane ekleyin ve listenin sonuna yerleştirin.

Örüntü eşleme hatası varsa başarısız olur n < m.

Çevrimiçi deneyin!


1

Braingolf , 30 bayt

.M>.M/v.mR>[.]$_v%!?[R1+>v]|R=

Çevrimiçi deneyin!

Girişleri ters sırada alır ( nilk giriş, mikinci)

Bölme mile n, sonuç çoğaltır nsonra, saat boyunca ve artışlar döngüler tek tek m % nkere


1

Toplu işlem, 71 bayt

@if %1 geq %2 for /l %%i in (1,1,%2)do @cmd/cset/an=(%1+%%i-1)/%2&echo(

cmd/cset/aHerhangi bir ayırıcı çıktı vermez, bu yüzden kullanmak zorundayım echo(( (yazdırmayı önler ECHO is on.).


1

PHP> = 7,1, 62 bayt

for([,$s,$n]=$argv;$n;)$s-=$r[]=$s/$n--^0;$r[0]?print_r($r):0;

PHP Korumalı Alanı Çevrimiçi


Korumalı Alan bağlantınızı, Yürütme kodunu tıklattığınızda Ayrıştırma hatası aldım.
Christiaan Westerbeek

@ChristiaanWesterbeek Korumalı alan varsayılan olarak PHP 7.0.3'e ayarlanmıştır.
Neil

1
Octave ve MATL gibi diğer dillerde bir dizide sıfır, yanlış olarak kabul edilir, ancak bunun php ile ilgili olduğuna inanmıyorum. Çıktının, programın yazıldığı dil kuralları dahilinde yanlış olması gerektiğini düşünüyorum.
Christiaan Westerbeek

1
@ChristiaanWesterbeek giderildi
Jörg Hülsermann


1

Javascript (ES6), 57 56 53 41 bayt

m=>n=>m>=n&&[...Array(n)].map(_=>m++/n|0)

Yanıt şimdi değerleri oluşturmanın daha akıllı bir yolunu içeriyor. Teşekkürler @Neil

kullanım

f=m=>n=>m>=n&&[...Array(n)].map(_=>m++/n|0)

f(6)(3) // [2, 2, 2]
f(7)(3) // [3, 2, 2]
f(7)(2) // [4, 3]
f(7)(1) // [7]
f(7)(8) // false
f(8)(3) // [3, 3, 2]

Tarih

İlk maden

(m,n)=>m>=n&&Array(n).fill(~~(m/n)).map((v,i)=>v+(i<m%n))

(m,n)=>m>=n&&Array(n).fill().map((v,i)=>~~(m/n)+(i<m%n))

Ardından, @Arnauld tarafından eklenen forma operatörü ve currying sözdizimini eklendi

m=>n=>m>=n&&[...Array(n)].map((v,i)=>~~(m/n)+(i<m%n))

1
_=>m++/n|0bir demet bayt kaydeder.
Neil



0

Pyth , 13 bayt

KE?>KQ0lMcK*d

Çevrimiçi deneyin! Çıktı 0hata.

Hile, 6 bayt

lMcE*d

Çevrimiçi deneyin! Dizi bir 0açık hatası içeriyor . Ne yazık ki bunda falsy değildir Pyth .

açıklama

KE?>KQ0lMcK*dQ    # Implicit input Q for m
KE                # Store n in K
           *d     # Generate a string of length Q containing only spaces
         cK       # Chop this string in K pieces of equal sizes, initial piece longer if necessary
       lM         # For each string, compute the length. Here we already have our result. However if the array contain a zero, we must output a falsy value
  ?>KQ            # If K > Q...
      0           # Then display zero, otherwise display the array

0

CJam , 13 12 bayt

{_2$>/,/z:,}

Çevrimiçi deneyin!

Bu, girdiyi n myığındaki gibi alan anonim bir bloktur . Bu iyi bir yanıt olurdu, ancak hata işleme gereksinimi onu tamamen öldürdü.

Çözülemediğinde sıfıra bölen hatalar.

açıklama

{   e# Stack:                | 3 10
 _  e# Duplicate:            | 3 10 10
 2$ e# Copy from back:       | 3 10 10 3
 >  e# Greater than:         | 3 10 1 (true)
 /  e# Divide:               | 3 10
    e# This will cause an error on invalid input.
 ,  e# Range:                | 3 [0 1 2 3 4 5 6 7 8 9]
 /  e# Split on nth element: | [[0 1 2] [3 4 5] [6 7 8] [9]]
 z  e# Transpose array:      | [[0 3 4 9] [1 4 7] [2 5 8]]
 :, e# Length of each:       | [4 3 3]
}

Hata işleme gereksinimi kaldırılırsa, bu 7 bayta kısaltılabilir, bu da% 40'ın üzerinde bir azalmadır:

{,/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.