กระจายตัวเลขไปยังรายการค่าเท่าที่เป็นไปได้โดยที่ผลรวมเท่ากับจำนวนนั้น


15

อาจเป็นความท้าทายของรหัสกอล์ฟที่ง่าย รับ 2 จำนวนเต็มบวกmและnทำให้รายการของค่าที่เป็นจำนวนเต็มบวกที่มีผลรวมเท่ากับจำนวนn mค่าทั้งหมดในเอาต์พุตเป็นค่าเดียวกันหรือความแตกต่างคือ 1

ตัวอย่าง

ตัวอย่างเช่น

  • m=6และn=3จะกลายเป็น2, 2, 2
  • m=7และn=3จะกลายเป็น2, 2, 3หรือ2, 3, 2หรือ 3, 2, 2
  • m=7และn=2จะกลายเป็น3, 4หรือ4, 3
  • m=7และn=1จะกลายเป็น7
  • m=7และn=8จะสร้างข้อผิดพลาดเนื่องจากผลรวมของเลขจำนวนเต็มบวก 8 ตัวไม่สามารถเป็น 7 ได้
  • m=10และn=4จะกลายเป็น3, 3, 2, 2หรือการเปลี่ยนแปลงอื่น ๆ

กฎระเบียบ

  • ทั้งอินพุทและเอาท์พุทเป็นเพียงจำนวนเต็มบวกเท่านั้น
  • ค่าทั้งหมดในเอาต์พุตเป็นค่าเดียวกันหรือความแตกต่างคือ 1
  • ลำดับของค่าในรายการไม่สำคัญ
  • mผลรวมของค่าในรายการจะมีค่าเท่ากับ
  • เมื่อไม่สามารถแก้ไขได้ให้สร้างข้อผิดพลาดหรือค่าเท็จ (ในกรณีของ m = 7 และ n = 8 เช่น)
  • เป็นผลมาจากกฎอื่น ๆm=8และn=3จะสร้างการเรียงสับเปลี่ยนของ3, 3, 2(ไม่2, 2, 4)

ผู้ชนะ

นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุดที่ถูกต้อง - วัดเป็นไบต์ - ชนะ


ฉันสมมติว่าศูนย์เป็นไม่บวก?
TheLethalCoder

อันที่จริงมันคือ: en.wikipedia.org/wiki/Integer#Order-theoretic_properties
Christiaan Westerbeek

1
@aras ฉันไม่ใช่นักคณิตศาสตร์ แต่จากสิ่งที่ฉันอ่านมันมักจะขึ้นอยู่กับบริบท บางคนบอกว่ามันเป็นเรื่องที่ไม่ได้ลงชื่อบางทั้งบวกและลบบาง ฯลฯ บวก
TheLethalCoder

1
ในขณะเดียวกัน @TheLethalCoder, ใน java (และจุดลอยทั่วไป), float a = -0f, b = 0f; System.out.println(a == b); System.out.println(a + "," + b);... ผลิตและtrue -0.0,0.0ดู, บวก 0 และลบ 0 เป็นตัวเลขสองตัวที่ต่างกันอย่างชัดเจน ...
โสคราตีฟฟีนิกซ์

คำตอบ:


2

Gaia ขนาด 4 ไบต์

…÷l¦

มีเพียงตัวในตัวสำหรับสิ่งนี้ ...

คำอธิบาย

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

ฉันคิดว่ามีวิธีแก้ปัญหา 4 ไบต์ด้วย 05AB1E ตอนนี้มันหายไปมันทำให้ฉันตัดสินใจได้ง่ายขึ้น ขอแสดงความยินดีและขอขอบคุณ!
Christiaan Westerbeek


5

Mathematica, 33 ไบต์

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

อินพุต

[63, 11]

เอาท์พุต

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

เอาต์พุตFalseเมื่อไม่สามารถแก้ไขได้


5

MATL , 7 ไบต์

:gie!Xs

เมื่อไม่มีวิธีแก้ปัญหาเอาต์พุตเป็นอาร์เรย์ที่มีอย่างน้อยหนึ่งศูนย์ซึ่งเป็นเท็จในMATL

ลองออนไลน์!

คำอธิบาย

พิจารณาปัจจัยการผลิตและm = 10n = 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

Charcoalขนาด 15 ไบต์หลังจากใช้ NDD 1

¿÷NNIEIη÷⁺IθιIη

ลองออนไลน์!

เอาต์พุตไม่ทำงานหากไม่มีวิธีแก้ไข เชื่อมโยงไปยังรุ่นอย่างละเอียด

1 NDD = การพัฒนาที่ขับเคลื่อนด้วย Neil

คำตอบก่อนหน้าของฉัน:

ถ่าน , 32 27 24 20 ไบต์

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

ลองออนไลน์!

เอาต์พุตไม่ทำงานหากไม่มีวิธีแก้ไข เชื่อมโยงไปยังรุ่นอย่างละเอียด

แน่นอนฉันไม่สามารถตีมันลงได้หากไม่มีความช่วยเหลือจากนีล


การลบCastโอเปอเรเตอร์ทำงานได้ด้วยเหตุผลบางอย่าง แต่นี่ไม่ใช่อัลกอริทึมที่เหมาะ ... ฉันมีวิธีแก้ปัญหา 16 ไบต์
Neil

@Neil Challenge ยอมรับแล้ว!
Charlie

ฉันเหมือนตัวแปรที่กำหนดไว้ล่วงหน้า แต่ตอนนี้รู้ว่าCastผลงานในรายการที่ผมลงไป 11 ไบต์ ...
นีล

@ Neil และฉันยังคงไม่สามารถใช้Mapมันทำงานบนโลกได้อย่างไร ??
Charlie

Mapเป็นเหมือนเวอร์ชันนิพจน์ของforลงไปถึงการใช้ตัวแปรลูปเดียวกัน ดังนั้นในตัวอย่างของคุณแทนที่จะผลักดันนิพจน์ไปยังรายการในแต่ละครั้งMapรวบรวมโดยอัตโนมัติและประเมินไปยังรายการผลลัพธ์
Neil

3

R , 33 ไบต์

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

พอร์ตของหลุยส์ Mendo เป็นคำตอบ Octave ค่อนข้างน่าเศร้าที่นี่สั้นกว่าคำตอบก่อนหน้านี้เกือบ 50%

ลองออนไลน์!

คำตอบก่อนหน้า 63 ไบต์:

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

ฟังก์ชั่นไม่ระบุชื่อที่ใช้สองข้อโต้แย้ง (จำเป็น) mและnและสองตัวเลือกซึ่งมีวัตถุประสงค์เพื่อการเล่นกอล์ฟ ส่งคืนเวกเตอร์ตามลำดับที่เพิ่มขึ้น สำหรับความล้มเหลวค่าแรกจะเป็น0ซึ่งเป็นเท็จใน R เนื่องจากifใช้เฉพาะค่าแรกของเวกเตอร์ (พร้อมคำเตือน)

โดยพื้นฐานแล้วเทียบเท่ากับฟังก์ชันต่อไปนี้:

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

ลองออนไลน์!


pryr::f(diff(trunc(0:n*m/n)))ทำงานได้และสั้นกว่า!
JAD

2

เยลลี่ , 7 6 ไบต์

:ȧœsL€

ลองออนไลน์! เอาต์พุตไม่ผิดเพี้ยน

มันทำงานอย่างไร

:ȧœ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 ไบต์

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

ส่งคืน ERR: หารด้วย 0 ด้วยข้อผิดพลาด


2

อ็อกเทฟ 24 ไบต์

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

รหัสกำหนดฟังก์ชั่นที่ไม่ระบุชื่อ เอาต์พุตเป็นอาร์เรย์ตัวเลข (เวกเตอร์แถว) เมื่อไม่มีอาเรย์นี้จะมีอย่างน้อยหนึ่งศูนย์ซึ่งเป็นเท็จใน Octave

ลองออนไลน์!

คำอธิบาย

0:m/n:mผลิตอาร์เรย์ของn+1ค่าจาก0ไปด้วยขั้นตอนm ปัดเศษแต่ละรายการเข้าสู่, และm/nfix0diffคำนวณความแตกต่างติดต่อกัน

เป็นตัวอย่างที่นี่มีทุกผลกลางสำหรับ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

อาร์เรย์ที่มีค่าศูนย์เป็นเท็จ ดูเหมือนจะยืดออก แต่ฉันก็ไม่รู้ว่าอ็อกเทฟก็เช่นกัน มาจาก Javascript ด้วยการบีบบังคับฉันจะบอกว่าทำไมนรกไม่ได้ +1 จากฉัน
Christiaan Westerbeek

@ChristiaanWesterbeek ขอบคุณ! มันฟังดูแปลกถ้าคุณมาจากภาษาอื่น แต่นั่นเป็นอย่างไรใน MATLAB / Octave
Luis Mendo

2

Haskell , 93 89 88 87 86 71 ไบต์

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

ลองออนไลน์!

คำอธิบาย

eฟังก์ชั่นหลักที่นี่คือ eจะทำรายการและเรียกใช้หมุดกลิ้งจากซ้ายไปขวา ในขณะที่มีองค์ประกอบอยู่ในรายการที่มากกว่าเพื่อนบ้านไปทางขวาเราจะย้ายจากองค์ประกอบหนึ่งไปทางขวา

ตอนนี้สิ่งที่เราต้องทำคือให้อาหารฟังก์ชั่นนี้มีรายการไม่สมดุลพอสมควรและปล่อยให้มันทำเวทย์มนตร์ รายการที่เราจะเลือกนั้นmตามด้วยn-1ศูนย์ เนื่องจากเป็นเรื่องง่ายที่จะทำ

สิ่งสุดท้ายที่เราต้องทำคือตรวจสอบให้แน่ใจว่าจัดการข้อผิดพลาด สำหรับวันนี้เราเพียงแค่โยนข้อผิดพลาดตราบใดที่Non-exhaustive patterns in functionm>n


ฉันคิดว่าคุณสามารถกำจัดerror[]โดยล้มเหลวด้วยรูปแบบที่ไม่ครบถ้วนสมบูรณ์แทน: m!n|m>n=e$m:replicate(n-1)0.
Laikoni

นอกจากนี้ยังจะสั้นกว่า(0<$[1..n-1]) replicate(n-1)0
Laikoni

2

C # (.NET Core) , 86 82 71 ไบต์

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

โยนข้อผิดพลาดสำหรับอินพุตที่ไม่ถูกต้อง

ลองออนไลน์!

-4 ไบต์ขอบคุณTheLethalCoder

-11 ไบต์ขอบคุณOlivierGrégoire


1
นี่เป็นเพียงข้อมูลโค้ดในขณะนี้ คุณเพียงแค่ต้องการห่อหุ้มด้วยฟังก์ชั่นนิรนามหรือa=>b=>ตอนเริ่มต้น
TheLethalCoder

@TheLethalCoder อืมคุณแน่ใจเหรอ? ฉันไม่จำเป็นต้องเพิ่มหมายเลขusing System.Collections.Genericถ้าส่งคืนIEnumerable<int>หรือไม่
LiefdeWen

ฉันผิดพลาดอยู่ดีเพราะคุณส่งคืนอาร์เรย์ (ฉันอ่านส่วนที่สามของส่วนที่สามผิด) แต่ถ้าที่แสดงให้เห็นในรหัสของคุณและเห็นว่าเป็นจะเป็นในความหมายฟังก์ชั่นที่คุณจะไม่จำเป็นต้องรวมถึงIEnumerable<int> using
TheLethalCoder

ไม่เคล็ดลับของคุณยังคงดีเนื่องจากรหัสที่ไม่มี. ToArray () ยังคงรวบรวมอยู่
LiefdeWen

1
@ OlivierGrégoireคุณถูกต้องขอโทษและขอบคุณ
LiefdeWen

2

Haskell, 48 ไบต์

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

เริ่มต้นด้วยรายการnศูนย์ ทำซ้ำmครั้ง: ใช้องค์ประกอบแรกเพิ่มหนึ่งและวางไว้ที่ส่วนท้ายของรายการ

n < mล้มเหลวด้วยข้อผิดพลาดรูปแบบการแข่งขันถ้า

ลองออนไลน์!


1

Braingolf 30 ไบต์

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

ลองออนไลน์!

รับอินพุตในลำดับย้อนกลับ ( nเป็นอินพุตแรกmคือวินาที)

หารmด้วยnทำซ้ำผลลัพธ์nครั้งแล้ววนซ้ำและเพิ่มทีละหนึ่งm % nครั้ง


1

แบตช์ 71 ไบต์

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

cmd/cset/aไม่เอาท์พุทตัวคั่นดังนั้นฉันต้องใช้echo(( (หลีกเลี่ยงการพิมพ์ECHO is on.)


1

PHP> = 7.1, 62 ไบต์

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

PHP Sandbox ออนไลน์


คลิกลิงก์ของคุณไปที่ Sandbox คลิก Execute code และฉันพบข้อผิดพลาดในการแยกวิเคราะห์
Christiaan Westerbeek

@ChristiaanWesterbeek กล่องทรายเริ่มต้นที่ PHP 7.0.3
Neil

1
ด้วยภาษาอื่นเช่น Octave และ MATL ค่าศูนย์ในอาร์เรย์ถือว่าไม่ถูกต้อง แต่ฉันไม่เชื่อว่ากรณีนี้จะเป็น php ฉันคิดว่าผลลัพธ์จะต้องเป็นเท็จภายในกฎของภาษาที่โปรแกรมเขียนไว้
Christiaan Westerbeek


1

Python 2 , 41 ไบต์

lambda m,n:(m%n*[m/n+1]+[m/n or _]*n)[:n]

ลองออนไลน์!

NameError เมื่อเป็นไปไม่ได้


Python 2 , 43 ไบต์

lambda m,n:[c/n for c in range(m,m+n,m>=n)]

ลองออนไลน์!

ValueError เมื่อเป็นไปไม่ได้


ไม่เคยคิดที่NameErrorจะใช้เพื่อออกจากข้อผิดพลาด
เฟลิปานาร์บาติสตา

1

Javascript (ES6), 57 56 53 41 ไบต์

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

คำตอบตอนนี้รวมถึงวิธีการสร้างค่า ขอบคุณ @ Neil

การใช้

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]

ประวัติศาสตร์

ฉันคนแรก

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

จากนั้นเพิ่มโอเปอเรเตอร์การแพร่กระจายและไวยากรณ์การปิดท้ายโดย @Annn

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

1
_=>m++/n|0บันทึกพวงของไบต์
Neil



0

Pyth , 13 ไบต์

KE?>KQ0lMcK*d

ลองออนไลน์! เอาต์พุต0เมื่อเกิดข้อผิดพลาด

การโกง 6 ไบต์

lMcE*d

ลองออนไลน์! อาร์เรย์มี0ข้อผิดพลาดเกิดขึ้น น่าเศร้าที่นี่ไม่เป็นเท็จ Pyth Pyth

คำอธิบาย

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 ไบต์

{_2$>/,/z:,}

ลองออนไลน์!

นี่คือบล็อกแบบไม่ระบุชื่อที่รับอินพุตเป็น n mในสแต็ก มันจะเป็นคำตอบที่ดี แต่ข้อกำหนดในการจัดการข้อผิดพลาดนั้นทำให้มันสมบูรณ์

ข้อผิดพลาดที่มีการหารด้วยศูนย์เมื่อไม่สามารถแก้ไขได้

คำอธิบาย

{   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]
}

หากความต้องการการจัดการข้อผิดพลาดถูกยกขึ้นสิ่งนี้สามารถสั้นลงเป็น 7 ไบต์ซึ่งลดลงมากกว่า 40%:

{,/z:,}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.