เพิ่มอาร์เรย์


44

ด้วยอาร์เรย์ที่ไม่ว่างของจำนวนเต็มบวก "เพิ่มค่า" หนึ่งครั้งดังนี้:

  • ถ้าองค์ประกอบอาเรย์ทั้งหมดเท่ากันให้ต่อท้ายเอเร1ย์ ตัวอย่างเช่น:

    [1] -> [1, 1]
    [2] -> [2, 1]
    [1, 1] -> [1, 1, 1]
    [3, 3, 3, 3, 3] -> [3, 3, 3, 3, 3, 1]
    
  • อื่นเพิ่มองค์ประกอบแรกในอาร์เรย์ที่เป็นค่าต่ำสุดของอาร์เรย์ ตัวอย่างเช่น:

    [1, 2] -> [2, 2]
    [2, 1] -> [2, 2]
    [3, 1, 1] -> [3, 2, 1] -> [3, 2, 2] -> [3, 3, 2] -> [3, 3, 3]
    [3, 4, 9, 3] -> [4, 4, 9, 3] -> [4, 4, 9, 4] -> [5, 4, 9, 4] -> [5, 5, 9, 4] -> ...
    

(แต่ละอัน->แสดงถึงการเพิ่มทีละหนึ่งซึ่งเป็นสิ่งที่โปรแกรมของคุณต้องทำ)

เอาต์พุตอาร์เรย์ที่เพิ่มขึ้นที่เกิดขึ้น

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


0 จะนับเป็นจำนวนเต็มบวกหรือไม่
Downgoat

20
@Downgoat 0 ไม่เคยเป็นไปในทางบวกกับ PPCG หากได้รับอนุญาต 0 คำนั้นจะเป็น "ไม่ใช่ลบ"
ETHproductions

คำตอบ:


13

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

‘;ṀỤḢṬ+

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

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

‘;ṀỤḢṬ+  Main link. Argument: A

‘        Increment all elements of A.
  Ṁ      Yield the maximum of A.
 ;       Concatenate both results. Note that the appended maximum will be the 
         minimum of the resulting array if and only if all elements of A are equal.
   Ụ     Grade up; yield the indices of the resulting array, sorted by their
         corresponding values in that array.
    Ḣ    Head; extract the first index, which is the index of the first occurrence
         of the minimum. For an array of equal elements, this will be the index
         of the appended maximum.
     Ṭ   Untruth; for index i, yield an array of i-1 zeroes, followed by a 1.
      +  Add this array to A, incrementing the minimum or appending a 1.

11

Python 3, 62 53 51 50 ไบต์

ฟังก์ชั่นที่แก้ไขรายการที่ส่งให้ ( อนุญาตโดยเมตา )

def F(a):a+=1//len({*a})*[0];a[a.index(min(a))]+=1

ลองใช้ repl.it!

-9 ไบต์ขอบคุณ Lynn สำหรับการทำเช่นนั้นเนื่องจากอาร์เรย์จะเป็นจำนวนเต็มบวกฉันสามารถผนวก '0' ต่อท้ายอาร์เรย์และเพิ่มขึ้นได้

ขอขอบคุณเป็นพิเศษสำหรับการเล่นกอล์ฟ mbomb007 len(set(a))ไปlen({*a})และเดนนิสสำหรับเคล็ดลับ floordiv!


อืมมม msgstr "เอาท์พุทอาเรย์ที่เพิ่มขึ้น" มีคุณสมบัตินี้ไหม
Yytsi

ฉันจำไม่ได้ว่าอยู่ที่ไหน แต่ฉันจำได้ว่าเห็นการโพสต์เมตาซึ่งการแก้ไขรายการที่กำหนดได้รับอนุญาตโดยค่าเริ่มต้น ฉันจะดูมัน @TuukkaX
FlipTack

@ TuukkaX ฉันไม่แน่ใจทั้งหมด ดูเหมือนว่าจะใช้ได้ แต่ฉันจะเลื่อนไปที่การลงมติแบบเมตาเกี่ยวกับการแก้ไขอาเรย์ถ้ามี
งานอดิเรกของ Calvin

1
ใน Python 3 คุณสามารถใช้len({*L})<2เพื่อค้นหาว่าองค์ประกอบทั้งหมดของรายการเท่ากัน
mbomb007

1
a+=1//len({*a})*[0]ควรบันทึกไบต์
เดนนิส

9

JavaScript (ES6), 61 ไบต์

a=>new Set(a).size>1?++a[a.indexOf(Math.min(...a))]:a.push(1)

ขาออกโดยการปรับเปลี่ยนอาร์กิวเมนต์ ฉันไม่สามารถหาวิธีที่จะตรวจสอบว่าอาร์เรย์มีรายการที่ไม่ซ้ำกันเพียงรายการเดียวที่น้อยกว่า 17 ไบต์ แต่ยินดีให้คำแนะนำ

ตัวอย่างการทดสอบ

ความพยายามอื่น ๆ

ต่อไปนี้เป็นวิธีการเลือกไม่กี่ทางในการตัดสินใจว่าอาเรย์นั้นมีอินพุตที่ไม่ซ้ำกันมากกว่าหนึ่งหรือไม่:

a=>a.some(x=>x-a[0])?++a[a.indexOf(Math.min(...a))]:a.push(1)
a=>a.some(x=>x-m,m=Math.min(...a))?++a[a.indexOf(m)]:a.push(1)

ทั้งสองsomes สามารถถูกแทนที่ด้วยfindเช่นกัน .sortจะสั้นลงสำหรับการค้นหาขั้นต่ำหากการเรียงลำดับเริ่มต้นไม่ใช่พจนานุกรม (ทำไม, JS, ทำไม?):

a=>new Set(a).size>1?++a[a.indexOf(a.sort()[0])]:a.push(1)
// Instead we have to do:
a=>new Set(a).size>1?++a[a.indexOf(a.sort((x,y)=>x-y)[0])]:a.push(1)

ฉันพยายามเรียกซ้ำเพื่อค้นหาขั้นต่ำ แต่มันกลับกลายเป็นวิธีที่ยาวกว่า:

f=(a,n=1,q=a.indexOf(n))=>~q?a.some(x=>x-n)?++a[q]:a.push(1):f(a,n+1)

และนี่คือวิธีแก้ปัญหาแบบสตริงซึ่งดูเหมือนจะเป็นความคิดที่ดีในตอนแรก: (อินพุตถูกกำหนดในรูปแบบอาร์เรย์ในสตริงเช่น"[1,2,3]")

a=>a.replace(m=/(\d+),(?!\1)/.test(a)?Math.min(...eval(a)):']',+m+1||",1]")

ใช้ a.find (n => n == Math.min (... a)) สั้นลงหรือไม่
Downgoat

@Daygoat ฉันไม่แน่ใจว่าฉันจะใช้มันอย่างไรเพราะมันคืนค่ารายการมากกว่าดัชนี
ETHproductions

ใช่> _> อ๊ะฉันคิดถึง ++ ของคุณและไม่ทราบว่าคุณต้องการการอ้างอิง
Downgoat

7

Mathematica, 70 57 55 ไบต์

การปรับปรุงทั้งหมดจริง ๆ แล้วมาร์ตินเอนเดอร์ผู้เตะตูดของฉันด้วยวิธีการจับคู่รูปแบบ! นอกจากนี้ JHM ยังได้คำตอบเดียวกันกับที่เป็นหลักในเวลาเดียวกัน (จำนวนไบต์ใช้การเข้ารหัส ASCII)

±{p:x_ ..}:={p,1};±{x___,y_,z___}/;y≤x~Min~z:={x,y+1,z}

นิยามฟังก์ชันที่±รับอาร์กิวเมนต์หนึ่งรายการ หากอาร์กิวเมนต์รายการนั้นมีสำเนาจำนวนหนึ่งขององค์ประกอบเดียวกัน (ตรวจพบโดยx_..และตั้งชื่อp) ให้แสดงรายการด้วยการ1ต่อท้าย มิฉะนั้นถ้าอาร์กิวเมนต์รายการนั้นมีองค์ประกอบพิเศษy(โดยxเป็นองค์ประกอบที่เป็นศูนย์หรือมากกว่าก่อนหน้าyนี้และzเป็นองค์ประกอบที่เป็นศูนย์หรือมากกว่าหลังจากนั้นy) ซึ่งเป็นขั้นต่ำสุดขององค์ประกอบอื่น ๆ ให้เอาท์พุทรายการที่yเพิ่มขึ้นนั้น อินสแตนซ์ขององค์ประกอบขั้นต่ำของรายการใด ๆ จะถูกจับคู่ด้วยyแต่โชคดีที่ Mathematica เลือกหนึ่งรายการแรกที่จะดำเนินการ


เนื่องจาก±เป็นอักขระ 2 ไบต์รหัสของคุณมีความยาว 59 ไบต์ นอกจากนี้จะต้องมีช่องว่างระหว่างx_และ..เนื่องจากMathematicaตีความx_..ว่าเป็นx_. .(ซึ่งพ่นข้อผิดพลาด) นอกจากนี้รูปแบบของ infix ของMin( x~Min~z) จะทำให้ 2 ไบต์นี้สั้นลง (ซึ่งทำให้โซลูชันนี้เหมือนกับหนึ่งในของฉัน: p ... ) ยินดีด้วยที่คุณสามารถเครดิตได้เพราะการแก้ไขของฉันช้ากว่าของคุณ ....
JungHwan Min

ไม่เลย Martin Ender ได้รับเครดิตส่วนใหญ่แล้ว เหตุใด±สองไบต์
Greg Martin

@GregMartin ±ใน UTF-8 ( Mathematicaใช้ UTF-8 โดยค่าเริ่มต้นลอง$CharacterEncoding) เป็นอักขระสองไบต์ (U + 00B1)
JungHwan ขั้นต่ำ

@JHM UTF-8 ไม่ใช่การเข้ารหัสอักขระเริ่มต้นบน Windows Mathematica ±สามารถอ่านไฟล์ที่มาในหน้ารหัสไบต์เดียวที่มี
Martin Ender

1
@ASimmons การติดตั้ง Mathematica ใหม่ของฉันบน Windows ซึ่งได้$CharacterEncodingตั้งค่าไว้WindowsANSIคือ CP1252 (ซึ่งเข้ากันได้กับ ISO 8859-1 ±และเพียงพอ·สำหรับไบต์เดียว)
Martin Ender

7

C ++ 14, 178 176 174 155 142 135 ไบต์

ส่ง

#include<list>
#include<algorithm>
[](auto&l){auto e=end(l),b=begin(l);l.size()^count(b,e,*b)?++*min_element(b,e):(l.push_back(1),0);};

การภาวนา

std::list<int> s = {4, 4, 9, 4};

//invoke like this
auto i = [](auto&l){auto e=end(l),b=begin(l);l.size()^count(b,e,*b)?++*min_element(b,e):(l.push_back(1),0);};
i(s);

//or like that
[](auto&l){auto e=end(l),b=begin(l);l.size()^count(b,e,*b)?++*min_element(b,e):(l.push_back(1),0);}(s);

ungolfed

#include <list>
#include <algorithm>
#include <iostream>
using namespace std;

void i(list<int>& l) {
    auto e = l.end(), b = l.begin();

    if (l.size() == count(b, e, l.front())) {
        l.push_back(1);
    } else {
        ++*min_element(b, e);
    }
}

int main() {
    list<int> s = {4, 4, 9, 4};

    //invoke like this
    i(s);

    for (auto o:s)
        std::cout << o << ' ';
    std::cout << std::endl;
}

นี่เป็นครั้งแรกที่ฉันเล่นกอล์ฟ

แก้ไข: ลืมที่จะพูดถึงคุณต้องรวบรวมมันอย่างน้อย -std=c++11 -std=c++14

แก้ไข 2: ฉันรู้ว่าฉันสามารถออกจากพื้นที่ในการรวม #include <list>

EDIT3: บันทึกอีกสองไบต์โดยแทนที่l.begin()ด้วยbegin(l)

EDIT4: บันทึกอีก 19 (!) ไบต์ขอบคุณ @Quentin (ดูความคิดเห็นของเขา)

EDIT5: เควนตินโกนทิ้งไปอีก 13 ไบต์ขอบคุณ!

EDIT6: ตามที่ TuukkaX ชี้ให้เห็นว่า lambdas / ฟังก์ชั่นที่ไม่ได้ตั้งชื่อก็เพียงพอแล้วดังนั้นฉันจึงลบ the auto i=ในจำนวน bytecount


5
ฉันไม่สามารถช่วยคุณด้วย C ++ แต่ฉันสามารถพูดได้: ยินดีต้อนรับสู่ PPCG!
Zgarb

1
ฉันคิดว่าคุณไม่ต้องการช่องว่างใน#includeเส้น
Christian Sievers

โอ้ขอบคุณฉันเพิ่งรู้ว่ามันตัวเอง :)
Neop

1
การแทนที่ฟังก์ชั่นด้วยแลมบ์ดา ( auto i=[](auto&l){...};) จะบันทึกหนึ่งไบต์ (มากกว่านั้นถ้าเรานับประเภทที่คุณลืม;)) โดยใช้^ แทน==และการสลับตัวถูกดำเนินการจะบันทึกอีกอันหนึ่ง std::listตัววนซ้ำเป็นstd::คลาสแน่นอนดังนั้นคุณสามารถเลื่อนstd::จากทั้งคู่std::countและstd::min_elementต้องขอบคุณ ADL (-10) l.front()ก็คือ*b(-7) ผมจบลงด้วย 120 ไบต์auto i=[](auto&l){auto e=end(l),b=begin(l);l.size()^count(b,e,*b)?void(++*find(b,e,*min_element(b,e))):l.push_back(1);};:)
เควนติน

1
ในขณะที่เราอยู่ที่นั่นเอกสารสำหรับstd::min_elementระบุว่าจะส่งคืนองค์ประกอบที่เล็กที่สุดชิ้นแรกดังนั้นfind()ฟุ่มเฟือยนั่นคือ 11 ไบต์ ในเงื่อนไขให้ใช้วงเล็บหนึ่งคู่และตัวดำเนินการคอมม่าเพื่อบังคับให้นิพจน์ทางขวาintสั้นกว่าการหล่อซ้ายไปทีvoidละ 2 ไบต์ นำไปสู่การนี้auto i=[](auto&l){auto e=end(l),b=begin(l);l.size()^count(b,e,*b)?++*min_element(b,e):(l.push_back(1),0);};142 ไบต์ :)
เควนติน

6

05AB1E , 21 20 16 ไบต์

ที่บันทึกไว้ 4 ไบต์ขอบคุณที่Adnan

DÙgi0¸«}ÐWksgÝQ+

ลองออนไลน์!

คำอธิบาย

                      # input = [3,2,1] used as example
D                     # duplicate input
 Ùgi                  # if all elements are equal
    0¸«}              # append 0
        Ð             # triplicate list
                      # STACK: [3,2,1], [3,2,1], [3,2,1]
         Wk           # index of minimum element
                      # STACK: [3,2,1], [3,2,1], 2
           s          # swap top 2 elements of stack
                      # STACK: [3,2,1], 2, [3,2,1]
            g         # length of list
                      # STACK: [3,2,1], 2, 3
             Ý        # range [0 ... length]
                      # STACK: [3,2,1], 2, [0,1,2,3]
              Q       # equal
                      # STACK: [3,2,1], [0,0,1,0]
               +      # add
                      # OUTPUT: [3,2,2]

ฉันคิดว่ามันDÙgi0¸«}ÐWksgÝQ+ใช้ได้ดี
Adnan

@Adnan: แอ๊ะ, ความคิดที่ดีที่ใช้กับÝQ kขอบคุณ!
Emigna

5

รอยขีดข่วน25 34 บล็อก + 7 6 ไบต์

โครงการ

รับอินพุตเป็นอาร์เรย์จำนวนเต็มที่กำหนดไว้ล่วงหน้า โปรดทราบว่าอาร์เรย์นั้นมีดัชนี 1 รายการใน Scratch

ใน Python จะมีลักษณะดังนี้: (โปรดทราบว่าแตกต่างจาก Scratch เป็น Python เป็นดัชนี 0)

lowval = 0
hival = 0
n = 1
for i in range(len(input)):
    if(input[i] < input[lowval]):
        lowval = i
    if(input[i] > input[hival]):
        hival = i
    # No increment statement needed because python.
if(lowval == hival):
    input.append(1)
else:
    input[lowval] += 1
print(input)

กรุณาแสดงความคิดเห็นกอล์ฟ?
OldBunny2800

ทำไมคุณถึงประกาศค่า fval
Christoph

มันจะปรากฏขึ้นกับผมว่ารอยขีดข่วนเป็นเพียงงูหลามในข้อความธรรมดาที่มีสี ...
สตีวีกริฟฟิ

และอาร์เรย์ที่มีการจัดทำดัชนี 1 รายการและไม่มีคำสั่ง elif!
OldBunny2800

1
จุดดี @ คริสโตฟ! มันเป็นส่วนหนึ่งของเวอร์ชั่นก่อนหน้านี้ การแก้ไข
OldBunny2800

4

J, 25 22 ไบต์

(+~:*[=<./)@,0#~1=#@~.

หาคำกริยาที่ไม่ระบุชื่อ ลองออนไลน์!

คำอธิบาย

(+~:*[=<./)@,0#~1=#@~.  Input is y.
                  #@    Is the length of
                    ~.   deduplicated y
                1=       equal to 1?
            ,0#~        Append that many 0s to y (one or none).
(         )@            Call the result z and apply this verb to it:
      =                  take the bit array of equality
     [                   between z
       <./               and its minimum element,
    *                    multiply that element-wise by
  ~:                     the bit array of first occurrences in z
 +                       and add the result to z.

3

MATL , 16 ไบต์

t&=?1h}t2#X<wQw(

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

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

t         % Take input implicitly. Duplicate
&=        % Matrix of all pairwise equality comparisons
?         % If all comparisons were true
  1h      %   Append 1 to the original copy ofthe array
}         % Else
  t       %   Duplicate array
  2#X<    %   Push minimum and index of its first occurrence
  wQw     %   Swap, increment, swap (adds 1 to the minimum)
  (       %   Assign the incremented minimum to that position
          % End if implicitly. Display implicitly

3

Mathematica, 56 ไบต์

±{b:a_ ..}:={b,1};±a_:=a/.{p___,b:Min@a,q___}:>{p,b+1,q}

±ฟังก์ชั่นการใช้ชื่อ ใช้การเข้ารหัส ISO8859-1

ทางเลือกอื่น ๆ (58 ไบต์)

±{b:a_ ..}:={b,1};±{p___,b_,q___}/;b<=p~Min~q:={p,b+1,q}
(* @GregMartin and I both independently came up with this above solution *)

±{b:a_ ..}:={b,1};±a:{p___,b_,q___}/;b==Min@a:={p,b+1,q}

การใช้

±{1, 1}

{1, 1, 1}

±{3, 4, 5}

{4, 4, 5}


3

Haskell, 71 70 62 ไบต์

f(a:b)|(x,y:z)<-span=<<(<).minimum$a:b++[0|all(a==)b]=x++y+1‌​:z

@Zgarb บันทึกแล้ว 8 ไบต์ขอบคุณ!

เมื่อฉันเริ่มฉันหวังว่าจะมีกลอุบายการผูกปมที่หรูหรา แต่วิธีของ @ Zgarb นั้นช่างน่าอัศจรรย์


การปรับโครงสร้างบางส่วน 62 ไบต์:f(a:b)|(x,y:z)<-span=<<(<).minimum$a:b++[0|all(a==)b]=x++y+1:z
Zgarb

@Zgarb แค่ว้าว!
Christian Sievers

อืมสมองของฉันล้มเหลวในการอนุมานประเภทของอินสแตนซ์ของฟังก์ชั่น monad
Angs

@Angs Monad เป็นซึ่งนำไปใช้กับประเภทคือ(->)r (->)r a = r->aแล้วจากประเภทreturn:: a->r->aและ(>>=)::(r->a)->(a->r->b)->(r->b)การดำเนินงานของพวกเขาคือ (ผมกล้าพูดได้หรือไม่) เห็นได้ชัด: และreturn=const m>>=f = \r->f(m r)rหลังเป็นสิ่งที่จำเป็นในการแสดงสิ่งที่ต้องการspan(predicate_depending_on l)lในขณะที่พูดถึงlเพียงครั้งเดียว ตอนนี้ฉันจำได้เมื่อฉันต้องการเท่านั้น
Christian Sievers

@Angs คุณสามารถค้นหาเคล็ดลับนี้และอื่น ๆ อีกมากมายในของเราHaskell คอลเลกชันเคล็ดลับกอล์ฟ
Zgarb

3

C #, 123 121 120 79 77 ไบต์

using System.Linq;l=>{if(l.All(o=>o==l[0]))l.Add(0);l[l.IndexOf(l.Min())]++;}

แก้ไขอาร์กิวเมนต์ที่ส่งผ่านไปยังฟังก์ชัน

ขอบคุณCyoceสำหรับการบันทึก 3 ไบต์! -> !AnyไปAll, ไป+=1++

ขอบคุณTheLethalCoderสำหรับการบันทึกขนาดมหึมา 43 ไบต์! -> รหัสลายเซ็นวิธีการลบออก ลบวงเล็บในรายการพารามิเตอร์


คุณสามารถแทนที่!l.Any(o=>o!=l[0]))ด้วยl.All(o=>o==l[0])?
Cyoce

@Cyoce มันทำอย่างแน่นอน ฉันคิดในสิ่งเดียวกัน แต่เขียนAnyแทนAllและอยู่ในความคิดว่ามันใช้งานไม่ได้: D ขอบคุณ!
Yytsi

2
C # ไม่มี++หรือไม่
Cyoce

คุณสามารถคอมไพล์ a Action<List<int>>เพื่อลบรหัสลายเซ็นของเมธอดทั้งหมด
TheLethalCoder

1
@ สเตฟานอืม ผมเคยเห็นหลายคนยังวางที่จำเป็นusings ด้วย C # ดังนั้นฉันไม่ไว้วางใจว่ามันเป็นกฎหมายที่จะลดลงusing System.Linqปิด หากฉันไม่เห็นคำแถลงที่ชัดเจนซึ่งบอกว่าไม่จำเป็นฉันจะอยู่กับสิ่งนี้ ขอบคุณสำหรับคำแนะนำว่า! :)
Yytsi

2

Perl 6 , 46 ไบต์

{.[[==]($_)??.elems!!.first(*==.min,:k)]++;$_}

(แก้ไข Array อินพุตและส่งคืน)

ขยาย:

{     # bare block lambda with implicit parameter 「$_」

  .[      # use the following as an index into the array

      [==]( $_ )    # reduce the array with 「&infix:<==>」

    ??              # if they are equal

      .elems        # the value past the end ( 「.end+1」 would also work )

    !!              # else

      .first(       # find the first value
        * == .min,  # where the element is equal to the minimum
        :k          # return the key rather than the value
      )

  ]++;              # increment it ( auto vivifies if it doesn't exist )

  $_                # return the modified array
}


2

เยลลี่ขนาด 9 ไบต์

;1µ‘i¦E?Ṃ

ขอบคุณเดนนิสสำหรับ -2 ไบต์

เนื้อหาต้องมีอย่างน้อย 30 ตัวอักษร คุณป้อน ...


ถ้าคุณมีอักขระพิเศษที่จะเข้าสู่ในร่างกายก็คุ้มค่าเสมออธิบายรหัสซึ่งช่วยให้ทุกคนที่จะเข้าใจมันและทำให้คำตอบที่น่าสนใจมากขึ้น :)
Alfie Goodacre

2

Mathematica, 53 ไบต์57 ไบต์ 59 ไบต์

If[Equal@@#,#~Join~{1},x=#;x[[#~FirstPosition~Min@#]]++;x]&

7
นั่นคือ 57 ไบต์ และเป็นอักขระ 3 ไบต์ นอกจากนี้โค้ดของคุณใช้งานไม่ได้เนื่องจากชิ้น{##,1}ส่วนบอกเป็นนัยว่าอินพุตเป็นจำนวนเต็มแยกต่างหาก (เช่นf[1, 2, 3]) แต่x=#ส่วนแสดงถึงว่าอินพุตเป็นList(เช่นf[{1, 2, 3}]) การแก้ไขอย่างรวดเร็วจะเปลี่ยนx=#ไปx={#}และยอมรับจำนวนเต็มดิบเป็น input ทำให้รหัสของคุณ 59 ไบต์นาน
JungHwan ขั้นต่ำ

จับดี! ฉันไม่ได้ตระหนักถึงความแตกต่างระหว่างไบต์และจำนวนตัวอักษรฉันเพิ่งเห็น ข้อเสนอแนะนี้และคิดว่ามันถูกต้อง ดูเหมือนว่ามีคำตอบมากมายที่ให้จำนวนตัวละคร แต่ถ้าฉันบันทึกไว้ใน Notepad ++ ฉันจะได้จำนวนไบต์ที่สูงขึ้น (เช่นคำตอบของ Jelly) ฉันเห็นคำตอบของคุณระบุการเข้ารหัสมีที่ไหนบ้างที่คุณอยากแนะนำให้ฉันเรียนรู้เกี่ยวกับสิ่งนี้?
ngenisis

1
ฉันคิดว่าคุณหมายถึงEqual@#แม้ว่า#==##จะสั้นกว่า
Martin Ender

คุณถูก. ฉันทำการเปลี่ยนแปลงต่อ @JHM เพื่อยอมรับอาร์กิวเมนต์หลายรายการแทนที่จะเป็นรายการ แต่ไม่ได้เผยแพร่การเปลี่ยนแปลงทุกที่ ฉันกลับไปรับรายการเนื่องจากมันสอดคล้องกับพรอมต์มากขึ้น
ngenisis

2

R , 72 66 65 ไบต์

"if"(any((x=scan())-x[1]),"[<-"(x,u<-which.min(x),1+x[u]),c(x,1))

ลองออนไลน์!

การเพิ่มจะทำโดยใช้which.minซึ่งส่งคืนการจับคู่แรก "[<-"อนุญาตให้แทนที่ค่าและส่งคืนเวกเตอร์ที่แก้ไขในการเรียกใช้ฟังก์ชันเดียว

-7 ไบต์ขอบคุณ Giuseppe!



@Giuseppe ฉันลอง isTRUE และ isFALSE กับ sd มันไม่ใช่นักกอล์ฟ :(
JayCe

heh, 65 bytesแทนที่!=ด้วย-!
Giuseppe

@Giuseppe แน่นอน!
JayCe

1

Ruby, 46 ไบต์

->a{a.uniq.size<2?a<<1:a[a.index(a.min)]+=1;a}

ฉันรู้สึกว่ามีวิธีที่ดีกว่าในการตรวจสอบว่าองค์ประกอบทั้งหมดเหมือนกันa.uniq.size<2แต่ฉันขี้เกียจเกินกว่าที่จะหาได้


6
a.uniq[1]จะเป็นจริงถ้ามีค่าแตกต่างกัน
ประวัติศาสตร์ 24

คุณสามารถบันทึกไบต์ด้วยการเปลี่ยนa[a.index(a.min)]เป็นa[a.index a.min]
Cyoce

1

อ็อกเทฟ, 69 67 64 ไบต์

มันเป็นความจริงที่สั้นกว่าจะทำให้เรื่องนี้ฟังก์ชั่นการตั้งชื่อที่สมบูรณ์กว่าการใช้ทั้งสองและinputdisp

บันทึกแล้ว 3 ไบต์ขอบคุณ Luis

function x=f(x)
[a,b]=min(x);if any(x-a),x(b)++;else x=[x,1];end

คำตอบเก่า ๆ ที่ไม่ได้ใช้ฟังก์ชั่น:

[a,b]=min(x=input(''));if any(x-a),x(b)++;else x(end+1)=1;end;disp(x)

1

R, 97 ไบต์

if(all((a=scan())==a[1])){a=c(a,1)}else{while(!all(a==a[1])){a[which(a==min(a))][1]=min(a)+1}};a

น่าเสียดายที่ synthax x=+1ไม่มีอยู่ใน R!

Ungolfed:

if(all((a=scan())==a[1]))
{
    a=c(a,1)
}
else
{
    while(!all(a==a[1]))
    {
        a[which(a==min(a))][1]=min(a)+1
    }
a


1

Matlab, 83 , 77 , 71 Bytes

function a=x(a)
if~nnz(a-a(1));a=[a,1];else[~,I]=min(a);a(I)=a(I)+1;end

ฉันค่อนข้างใหม่ในการเขียนโค้ดกอล์ฟดังนั้นโปรดมีเมตตา! ฉันพยายามใช้ฟังก์ชั่นที่ไม่ระบุชื่อ แต่ googling บอกว่าคุณไม่สามารถใช้ถ้า / else statement และ matlab ไม่มีผู้ประกอบการที่ประกอบไปด้วยสามดังนั้นนี่คือสิ่งที่ดีที่สุดที่ฉันรู้สึกว่าฉันสามารถทำได้

แก้ไข: แก้ไขและย่อให้สั้นลง (สองครั้ง!) ต้องขอบคุณ stewie-griffin


ยินดีต้อนรับสู่ PPCG! มีข้อบกพร่องบางอย่างในรหัสนี้ ไม่ได้รับประกันว่าทุกองค์ประกอบมีค่าเท่ากันก็แสดงให้เห็นเพียงว่าค่าเฉลี่ยเท่ากับsum(a)/length(a)==a(1) a(1)วิธีที่ง่ายกว่าในการทำเช่นนี้mean(a)==a(1)คือ numelคือหนึ่งไบต์ที่สั้นกว่าlengthแต่เนื่องจากคุณรู้ว่าค่าทั้งหมดเป็นค่าบวกคุณสามารถใช้nnzสิ่งที่สั้นกว่าได้ (มันจะยังไม่ให้ผลลัพธ์ที่ถูกต้องในการท้าทายนี้ แต่จะสั้นกว่าอย่างน้อย: P) หากคุณใช้min(a)โทรในด้านหน้าของวงที่คุณอาจจะใช้ทั้งสองเอาท์พุทจากมันและสามารถเช็คอินคือallองค์ประกอบของจะเท่ากับa min(a)
Stewie Griffin

คุณพูดถูก! มันล้มเหลวเมื่อค่าเฉลี่ยเท่ากับจำนวนในองค์ประกอบแรก ฉันคิดว่าอันใหม่ของฉันถูกต้องและสั้นกว่าด้วย ตรรกะคือถ้าองค์ประกอบที่เหลือไม่เท่ากับองค์ประกอบแรก a (a ~ = a (1)) จะคืนค่าองค์ประกอบที่เหลือซึ่งตามนิยามมากกว่า 0 ในอาร์เรย์ที่ไม่เหมือนกัน จากนั้นการนับและไม่ควรให้ตรรกะที่ถูกต้องฉันคิดว่า หากยังคงผิดโปรดแจ้งให้ฉันทราบฉันเพิ่งเขียนโค้ดไม่กี่ปีและยังเหลืออีกนาน
โอเว่นมอร์แกน

~nnz(a(a~=a(1)))~nnz(a-a(1))เป็นเพียง นอกจากนี้คุณไม่จำเป็นต้องใช้วงเล็บ if ~nnz(a-a(1));a=[a,1];else[~,I]=min(a);a(I)=a(I)+1;end. นี่ควรจะสั้นกว่า 5 ไบต์ (หมายเหตุ: ฉันยังไม่ได้ทดสอบ)
Stewie Griffin

คุณสามารถบันทึก 3 ไบต์โดยใช้range(a)แทนnnz(a-a(1))
MattWH

@boboquack รหัสนั้นตรวจสอบว่าจำนวนองค์ประกอบในaเท่ากับค่าต่ำสุดในเวกเตอร์นั้นหรือไม่ เวกเตอร์a = [3 4 6]จะส่งผลtrueและเวกเตอร์จะส่งผลให้a = [4 4 6] falseฉันไม่คิดว่ามันจะมีประโยชน์ที่นี่ ... ?
Stewie Griffin

1

Clojure, 112 100 ไบต์

โชคไม่ดีที่min-keyคืนค่าดัชนีสุดท้ายของดัชนีที่เล็กที่สุดไม่ใช่ดัชนีแรก ใช้งานได้กับอินพุตจำนวนเต็มและอาร์เรย์ที่สั้นกว่าองค์ประกอบ 10 ^ 9;)

แก้ไข: การกำหนดฟังก์ชั่นที่ไม่ระบุชื่อที่ใช้แทน(apply = a)(= 1(count(set a)))

(fn[a](if(apply = a)(conj a 1)(update a(apply min-key #(+(nth a %)(* % 1e-9))(range(count a)))inc)))

เดิม:

(defn f[a](if(= 1(count(set a)))(conj a 1)(update a(apply min-key #(+(nth a %)(* % 1e-9))(range(count a)))inc)))

โซลูชัน 134- ไบต์ที่แฮ็กน้อยกว่าจะย้อนกลับเวกเตอร์ก่อนที่จะอัปเดตแล้วย้อนกลับอีกครั้ง:

(defn f[a](if(= 1(count(set a)))(conj a 1)(let[r #(vec(reverse %))a(r a)](r(update a(apply min-key #(nth a %)(range(count a)))inc)))))

1

Java 8, 85 + 38 = 123 ไบต์

ถือเป็นโมฆะแลมบ์ดาเอาList<Integer>ท์พุท จำนวนไบต์รวมแลมบ์ดาและการนำเข้าที่จำเป็น

import static java.util.Collections.*;

l->{if(min(l)==max(l))l.add(0);int i=0,n;while((n=l.get(i))>min(l))i++;l.set(i,n+1);}

ลองใช้ออนไลน์

ดูเหมือนว่า Python เกือบจะด้วยวิธีการนำเข้าเหล่านี้ ...


1

MATLAB, 66 53 ไบต์

if(range(a))[~,b]=min(a);a(b)=a(b)+1;else;a=[a 1];end

เอาท์พุท:

เริ่มต้น:

a = [3 2]

วิ่งต่อเนื่อง:

[3 2] -> [3 3] -> [3 3 1] -> [3 3 2] -> [3 3 3] -> [3 3 3 1] ...

2
คุณไม่สามารถ hardcode @(x) …ปัจจัยการผลิตที่คุณจะต้องทำสิ่งที่ชอบ
ბიმო

1

SmileBASIC 3, 101 ไบต์

กำหนดฟังก์ชั่นคำสั่งI Aที่Aเป็นจำนวนเต็มของเราจำนวนเต็ม เอาท์พุททำได้โดยการปรับเปลี่ยนอินพุต (ตามที่มีการอ้างอิงอาร์เรย์)

DEF I A
M=MIN(A)IF M==MAX(A)THEN PUSH A,1RETURN
FOR C=0TO LEN(A)IF M==A[C]THEN INC A[C]BREAK
NEXT
END

คุณสามารถบันทึก 2 ไบต์โดยแทนที่BREAKด้วยM=0เนื่องจากAไม่สามารถมีได้0ดังนั้นM==A[C]จะไม่เป็นจริง
12Me21


0

Pyth, 16 ไบต์

?tl{QXxQhSQQ1+Q1

โปรแกรมที่รับอินพุตจากรายการและพิมพ์ผลลัพธ์

ชุดทดสอบ

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

?tl{QXxQhSQQ1+Q1  Program. Input: Q
?                 If:
  l                The length
   {Q              of Q deduplicated
 t                 - 1
                   is non-zero:
     X     Q1       Increment in Q at index:
      xQ             Index in Q of
        h            the first element
         SQ          of Q sorted (minimum)
                  else:
             +     Append
               1   1
              Q    to Q
                   Implicitly print                    

0

Haskell, 93 ไบต์

f z|and$(==)<$>z<*>z=z++[1]|1>0=z#minimum z where(x:z)#m|x==m=x+1:z;(x:z)#m|1>0=x:z#m;[]#_=[]

Ungolfed:

incrementArray :: [Int] -> [Int]
incrementArray xs | and [x == y | x <- xs, y <- xs] = xs ++ [1]
                  | otherwise = g xs (minimum xs)
     where g (x:xs) m | x == m = (x + 1):xs
           g (x:xs) m | otherwise = x:g xs m
           g [] _ = []

ความพยายามครั้งแรกจะพยายามหาสิ่งที่ซับซ้อนมากขึ้นในภายหลัง


1
ทำไมไม่สร้างฟังก์ชั่นแยกต่างหากแทนที่จะใช้where?
Michael Klein

0

สงสัย 44 ไบต์

@[dp1unq#0?:=#[:0(iO f\min#0)#0+1f]#0?++#0 1

นี่ไม่ใช่สิ่งที่ฉันมีในใจเมื่อฉันทำภาษานี้ ... มันแย่กว่า Perl ในแง่ของการอ่าน!

การใช้งาน:

(@[dp1unq#0?:=#[:0(iO f\min#0)#0+1f]#0?++#0 1])[3 4 9 3]

คำอธิบาย

อ่านเพิ่มเติมได้:

@[
  dp 1 unq #0
    ? set #[
            get 0 (iO f\ min #0) #0
            + 1 f
           ] #0
    ? con #0 1
 ]

โดยทั่วไปตรวจสอบว่าการดร็อป 1 ไอเท็มจากเซ็ตย่อยที่ไม่ซ้ำกันของอาร์กิวเมนต์ทำให้รายการว่างเปล่า ถ้าไม่เช่นนั้นเราจะเพิ่มค่าต่ำสุดของอาร์เรย์ มิฉะนั้นเราจะต่อ 1 อาร์กิวเมนต์เข้าด้วยกัน


0

Kotlin, 75 ไบต์

fun a(s:MutableList<Int>){if(s.toSet().size<2)s+=0;s[s.indexOf(s.min())]++}

ปรับเปลี่ยนอาร์กิวเมนต์ของฟังก์ชัน

ประณามคุณพิมพ์แข็งแกร่ง! :MutableList<Int>คิดเป็น 17 ไบต์เท่านั้น ฉันไม่คิดว่าจะมีวิธีแก้ปัญหาที่ประเภทสามารถสรุปได้โชคไม่ดี

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