Increment an Array

44

Diberikan array kosong kosong dari bilangan bulat positif, "tambah" sekali sebagai berikut:

  • Jika semua elemen array sama, tambahkan a 1ke akhir array. Sebagai contoh:

    [1] -> [1, 1]
    [2] -> [2, 1]
    [1, 1] -> [1, 1, 1]
    [3, 3, 3, 3, 3] -> [3, 3, 3, 3, 3, 1]
    
  • Lain, tambahkan elemen pertama dalam array yang merupakan nilai minimum array. Sebagai contoh:

    [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] -> ...
    

(Masing-masing ->mewakili satu peningkatan, yang harus dilakukan oleh semua program Anda.)

Keluarkan output array yang dihasilkan.

Kode terpendek dalam byte menang.

Hobi Calvin
sumber
Apakah 0 dihitung sebagai bilangan bulat positif
Downgoat
20
@Downgoat 0 tidak pernah positif di PPCG. Jika 0 diizinkan, istilahnya akan "non-negatif"
ETHproduksi

Jawaban:

13

Jelly , 8 7 byte

‘;ṀỤḢṬ+

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

‘;ṀỤḢṬ+  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.
Dennis
sumber
11

Python 3, 62 53 51 50 byte

Fungsi yang mengubah daftar yang diteruskan ke itu ( diizinkan oleh meta ).

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

Coba di repl.it!

-9 byte terima kasih kepada Lynn untuk mengetahui hal itu, karena array akan bilangan bulat positif, saya dapat menambahkan '0' ke akhir array dan menambahkannya.

Terima kasih khusus kepada mbomb007 untuk bermain golf len(set(a))untuk len({*a}), dan Dennis untuk trik floordiv!

FlipTack
sumber
Hmm. + Msgstr "Keluarkan array yang dihasilkan yang dihasilkan". Apakah ini memenuhi syarat?
Yytsi
Saya tidak begitu ingat di mana, tetapi saya ingat melihat meta pos yang mengubah daftar yang diberikan di tempat diizinkan secara default. Saya akan memeriksanya @TuukkaX
FlipTack
@ TuukkaX Saya tidak sepenuhnya yakin. Tampaknya baik-baik saja tetapi saya akan mengacu pada konsensus meta tentang memodifikasi array di tempat, jika ada.
Hobi Calvin
1
Di Python 3, Anda bisa menggunakan len({*L})<2untuk menemukan apakah semua elemen daftar sama.
mbomb007
1
a+=1//len({*a})*[0]harus menyimpan byte.
Dennis
9

JavaScript (ES6), 61 byte

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

Keluaran dengan memodifikasi argumennya . Saya tidak dapat menemukan cara untuk menentukan apakah array hanya memiliki satu item unik dalam waktu kurang dari 17 byte, tetapi saran dipersilahkan.

Cuplikan tes

Upaya lain

Berikut adalah beberapa cara alternatif untuk memutuskan apakah array memiliki lebih dari satu input unik:

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)

Keduanya somebisa diganti findjuga. .sortakan lebih pendek untuk menemukan minimum, jika jenis default tidak leksikografis (mengapa, JS, mengapa?):

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)

Saya mencoba rekursi untuk menemukan minimum, tetapi ternyata lebih lama:

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

Dan inilah solusi berbasis string yang sepertinya ide yang bagus pada awalnya: (input diberikan dalam format array dalam string, misalnya "[1,2,3]")

a=>a.replace(m=/(\d+),(?!\1)/.test(a)?Math.min(...eval(a)):']',+m+1||",1]")
Produksi ETH
sumber
Apakah menggunakan a.find (n => n == Math.min (... a)) lebih pendek?
Downgoat
@Downgoat Saya tidak yakin bagaimana saya akan menggunakannya, karena mengembalikan item daripada indeks
ETHproduksi
yeah> _> ups, saya merindukan ++ Anda dan tidak menyadari bahwa Anda memerlukan referensi
Downgoat
7

Mathematica, 70 57 55 byte

Hampir semua peningkatan adalah karena Martin Ender, yang menendang pantat saya di pendekatan pencocokan pola! JHM juga memberikan solusi yang pada dasarnya sama di waktu yang sama. (jumlah byte menggunakan pengkodean ASCII)

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

Menentukan fungsi dengan ±mengambil satu argumen argumen. Jika argumen daftar itu berisi sejumlah salinan dari elemen yang sama (terdeteksi oleh x_..dan dinamai p), maka output daftar dengan yang 1ditambahkan. Kalau tidak, jika argumen daftar itu memiliki elemen khusus y(dengan xmenjadi nol atau lebih elemen sebelumnya y, dan zmenjadi nol atau lebih setelah elemen y) yang paling banyak minimum dari elemen lain, maka output daftar dengan yang ybertambah. Setiap instance dari elemen minimum daftar akan dicocokkan dengan y, tetapi untungnya Mathematica memilih yang pertama untuk ditindaklanjuti.

Greg Martin
sumber
Karena ±karakter 2 byte, kode Anda panjangnya 59 byte. Juga, harus ada ruang antara x_dan ..karena Mathematica mengartikan x_..sebagai x_. .(yang melempar kesalahan). Plus, bentuk infiks dari Min( x~Min~z) akan membuat 2 byte ini lebih pendek (yang membuat solusi ini identik dengan salah satu milik saya: p ...) Mohon Anda dapat mengambil kredit karena hasil edit saya lebih lambat dari milik Anda ....
JungHwan Min
Nah, Martin Ender tetap mendapatkan sebagian besar kredit saya. Mengapa ± dua byte?
Greg Martin
@GregMartin ±dalam UTF-8 ( Mathematica menggunakan UTF-8 secara default; coba $CharacterEncoding) adalah karakter dua byte (U + 00B1).
JungHwan Min
@JHM UTF-8 bukan pengkodean karakter default pada Windows. Mathematica dapat membaca file sumber dalam halaman kode byte tunggal yang mencakup ±.
Martin Ender
1
@ ASimmons Instalasi Mathematica baru saya di Windows, yang telah $CharacterEncodingditetapkan ke WindowsANSICP1252 (yang cukup kompatibel dengan ISO 8859-1 untuk ±dan ·dapat digunakan untuk satu byte).
Martin Ender
7

C ++ 14, 178 176 174 155 142 135 byte

pengajuan

#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);};

doa

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;
}

Ini pertama kalinya saya bermain golf, bantuan dihargai.

EDIT: lupa menyebutkan Anda harus mengkompilasinya dengan setidaknya -std=c++11 -std=c++14

EDIT2: Saya menyadari saya bisa meninggalkan ruang di dalamnya #include <list>

EDIT3: menyimpan dua byte lagi dengan mengganti l.begin()denganbegin(l)

EDIT4: menyimpan 19 byte (!) Lainnya berkat @Quentin (lihat komentarnya)

EDIT5: Quentin mengurangi 13 byte lagi, terima kasih!

EDIT6: seperti yang ditunjukkan TuukkaX, lambdas / fungsi yang tidak disebutkan namanya cukup jadi saya menghapus auto i=di bytecount

Neop
sumber
5
Saya tidak dapat membantu Anda dengan C ++, tetapi saya dapat mengatakan: Selamat datang di PPCG!
Zgarb
1
Saya pikir Anda tidak perlu spasi di #includegaris.
Christian Sievers
Oh, terima kasih, aku baru menyadarinya sendiri :)
Neop
1
Mengganti fungsi dengan lambda ( auto i=[](auto&l){...};) menghemat satu byte (lebih jika kita menghitung jenis pengembalian yang Anda lupa;)), menggunakan ^ bukan ==dan menukar operan menyimpan yang lain. std::listIterator sudah pasti std::kelas, sehingga Anda dapat turun std::dari keduanya std::countdan std::min_elementterima kasih kepada ADL (-10). l.front()juga *b(-7). Saya berakhir dengan 120-byte 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);};:)
Quentin
1
Sementara kami melakukannya, dokumentasi untukstd::min_element menyatakan bahwa ia mengembalikan elemen terkecil pertama , sehingga find()tidak perlu, yaitu 11 byte. Dalam kondisional, menggunakan sepasang tanda kurung dan operator koma untuk memaksa ekspresi yang tepat intlebih pendek daripada casting yang kiri menjadi void2 byte. Ini mengarah pada 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 byte :)
Quentin
6

05AB1E , 21 20 16 byte

Disimpan 4 byte berkat Adnan .

DÙgi0¸«}ÐWksgÝQ+

Cobalah online!

Penjelasan

                      # 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]
Emigna
sumber
Saya pikir itu DÙgi0¸«}ÐWksgÝQ+juga berfungsi.
Adnan
@ Adnan: Aah, ide bagus digunakan ÝQbersama k. Terima kasih!
Emigna
5

Gores, 25 34 blok + 7 6 byte

Program

Mengambil input sebagai array bilangan bulat yang telah ditentukan sebelumnya. Perhatikan bahwa array 1-diindeks dalam Gores.

Dalam Python, ini akan terlihat seperti: (Perhatikan bahwa tidak seperti Scratch, Python diindeks 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
sumber
Komentar untuk bermain golf?
OldBunny2800
mengapa Anda mendeklarasikan fval?
Christoph
Tampak bagi saya bahwa Scratch hanyalah Python dalam teks biasa dengan warna ...
Stewie Griffin
Dan array 1-diindeks dan tidak ada pernyataan elif!
OldBunny2800
1
Poin bagus @Christoph! Itu adalah bagian dari versi sebelumnya yang bermain golf. Editing.
OldBunny2800
4

J, 25 22 byte

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

Mengevaluasi ke kata kerja anonim. Cobalah secara Online!

Penjelasan

(+~:*[=<./)@,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.
Zgarb
sumber
3

MATL , 16 byte

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

Cobalah online! Atau verifikasi semua kasus uji

Bagaimana itu bekerja

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
Luis Mendo
sumber
3

Mathematica, 56 byte

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

Menggunakan fungsi bernama ± . Menggunakan penyandian ISO8859-1

Solusi alternatif (58 byte)

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

Pemakaian

±{1, 1}

{1, 1, 1}

±{3, 4, 5}

{4, 4, 5}

JungHwan Min
sumber
3

Haskell, 71 70 62 byte

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

@ Zgarb menyelamatkan 8 byte, terima kasih!

Ketika saya mulai, saya berharap untuk tipuan ikatan yang elegan, tapi cara @ Zgarb sama menakjubkannya.

Sievers Kristen
sumber
Beberapa restrukturisasi, 62 byte:f(a:b)|(x,y:z)<-span=<<(<).minimum$a:b++[0|all(a==)b]=x++y+1:z
Zgarb
@ Zgarb, Wow!
Christian Sievers
Ugh, otakku gagal menyimpulkan jenis untuk instance fungsi monad
Angs
@ Angs The Monad adalah (->)r, yang diterapkan pada suatu tipe (->)r a = r->a. Kemudian dari jenis return:: a->r->adan (>>=)::(r->a)->(a->r->b)->(r->b)implementasinya jelas (berani saya katakan?): return=constDan m>>=f = \r->f(m r)r. Yang terakhir adalah persis apa yang diperlukan untuk mengekspresikan sesuatu seperti span(predicate_depending_on l)lsambil menyebutkan lhanya sekali. Sekarang saya hanya perlu mengingatnya saat saya membutuhkannya.
Christian Sievers
@Angs Anda dapat menemukan trik ini, dan banyak lagi, di koleksi kiat golf Haskell kami .
Zgarb
3

C #, 123 121 120 79 77 byte

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

Memodifikasi argumen yang diteruskan ke fungsi.

Terima kasih kepada Cyoce karena telah menghemat 3 byte! -> !Anyke All, +=1untuk++ .

Terima kasih kepada TheLethalCoder untuk menghemat 43 byte kekalahan! -> Menghapus kode tanda tangan metode. Tanda kurung dihapus di sekitar daftar parameter.

Yytsi
sumber
bisa Anda mengganti !l.Any(o=>o!=l[0]))dengan l.All(o=>o==l[0])?
Cyoce
@Cyoce Memang. Saya memikirkan hal yang sama, tetapi menulis Anyalih-alih Alldan berpikir, itu tidak berhasil: D Terima kasih!
Yytsi
2
Apakah C # tidak punya ++?
Cyoce
Anda dapat mengkompilasi ke a Action<List<int>>untuk menghapus semua kode tanda tangan metode
TheLethalCoder
1
@Stan Hmm. Saya juga melihat banyak orang membuang yang diperlukan usingdengan C #, jadi saya tidak percaya bahwa itu sah untuk dikirim using System.Linq. Kecuali saya melihat pernyataan eksplisit yang mengatakan ini tidak perlu, saya akan tetap dengan ini. Terima kasih untuk sarannya! :)
Yytsi
2

Perl 6 , 46 byte

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

(memodifikasi input Array, dan mengembalikannya)

Diperluas:

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

Brad Gilbert b2gills
sumber
2

Jelly, 9 byte

;1µ‘i¦E?Ṃ

Terima kasih untuk Dennis untuk -2 byte.

Badan harus minimal 30 karakter; Anda memasukkan ...

Zacharý
sumber
Jika Anda memiliki karakter tambahan untuk dimasukkan dalam tubuh, selalu ada baiknya menjelaskan kode, yang membantu semua orang untuk memahaminya dan membuat jawabannya lebih menarik :)
Alfie Goodacre
2

Mathematica, 53 byte 57 byte 59 byte

If[Equal@@#,#~Join~{1},x=#;x[[#~FirstPosition~Min@#]]++;x]&
ngenisis
sumber
7
Itu 57 byte. dan merupakan karakter 3 byte. Juga, kode Anda tidak berfungsi karena {##,1}bagian menyiratkan bahwa input bilangan bulat terpisah (yaitu f[1, 2, 3]) tetapi x=#bagian menyiratkan bahwa input adalah List(yaitu f[{1, 2, 3}]). Sebuah perbaikan cepat akan mengubah x=#ke x={#}dan menerima bilangan bulat baku sebagai input, membuat kode Anda 59 byte panjang.
JungHwan Min
Tangkapan yang bagus! Saya tidak menyadari perbedaan antara byte dan jumlah karakter, saya hanya melihat saran ini dan menganggapnya valid. Tampaknya ada banyak jawaban yang memberikan jumlah karakter tetapi jika saya menyimpannya di Notepad ++ saya mendapatkan jumlah byte yang lebih tinggi (misalnya jawaban Jelly). Saya melihat jawaban Anda menentukan penyandian, apakah ada tempat yang Anda rekomendasikan untuk saya pelajari tentang ini?
ngenisis
1
Saya pikir maksud Anda Equal@#, meskipun #==##lebih pendek.
Martin Ender
Kamu benar. Saya membuat perubahan per @JHM untuk menerima beberapa argumen daripada daftar tetapi tidak menyebarkan perubahan di mana-mana. Saya kembali menerima daftar karena itu lebih sesuai dengan permintaan.
ngenisis
2

R , 72 66 65 byte

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

Cobalah online!

Peningkatan dilakukan menggunakan which.minyang mengembalikan pertandingan pertama. "[<-"memungkinkan untuk mengganti nilai dan mengembalikan vektor yang dimodifikasi dalam satu panggilan fungsi.

-7 byte terima kasih kepada Giuseppe!

JayCe
sumber
@ Giuseppe Saya mencoba isTRUE dan isFALSE dengan sd itu bukan golfier :(
JayCe
heh, 65 byte diganti !=dengan -!
Giuseppe
@Giuseppe tentu saja!
JayCe
1

Ruby, 46 byte

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

Saya merasa ada cara yang lebih baik untuk memeriksa apakah semua elemen sama daripada a.uniq.size<2, tetapi saya terlalu malas untuk menemukannya.

Lee W
sumber
6
a.uniq[1]akan jujur ​​jika ada nilai yang berbeda.
histokrat
Anda dapat menyimpan byte dengan berubah a[a.index(a.min)]menjadia[a.index a.min]
Cyoce
1

Oktaf, 69 67 64 byte

Itu sebenarnya lebih pendek untuk membuat ini fungsi bernama lengkap daripada menggunakan keduanya inputdan disp.

Disimpan 3 byte berkat Luis.

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

Jawaban lama, tidak menggunakan fungsi:

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

R, 97 byte

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

Sayang sekali bahwa synthax x=+1tidak ada di R!

Tidak Disatukan:

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
Frédéric
sumber
1

TI-Basic, 53 byte

If min(not(ΔList(Ans
Then
Ans->L1
cumSum(1 or Ans
min(Ans+ᴇ9(L1≠min(L1
L1(Ans)+1->L1(Ans
Else
augment(Ans,{1
End
Timtech
sumber
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

Saya relatif baru untuk kode golf jadi harap baik! Saya mencoba menggunakan fungsi anonim tetapi googling mengatakan Anda tidak dapat menggunakan jika pernyataan / lain dan matlab tidak memiliki operator ternary, jadi ini adalah yang terbaik yang saya bisa lakukan.

Sunting: Dikoreksi dan dipersingkat (dua kali!) Berkat stewie-griffin.

Owen Morgan
sumber
Selamat datang di PPCG! Ada beberapa kekurangan dalam kode ini. sum(a)/length(a)==a(1)tidak menjamin bahwa semua elemen sama, itu hanya menunjukkan bahwa rata-rata sama dengan a(1). Cara yang lebih sederhana untuk melakukan ini adalah mean(a)==a(1). numeladalah satu byte lebih pendek dari length, tetapi karena Anda tahu semua nilai positif, Anda dapat menggunakan nnzyang lebih pendek (itu masih tidak memberikan hasil yang benar dalam tantangan ini, tetapi setidaknya lebih pendek: P). Jika Anda menerima min(a)panggilan di depan loop, Anda dapat menggunakan kedua output dari itu dan memeriksa apakah allelemen-elemennya asama min(a).
Stewie Griffin
Kamu benar! gagal ketika rata-rata sama dengan angka pada elemen pertama. Saya pikir yang baru saya benar dan juga lebih pendek. Logikanya adalah bahwa jika elemen yang tersisa tidak sama dengan elemen pertama, a (a ~ = a (1)) mengembalikan elemen yang tersisa yang menurut definisi lebih besar dari 0 dalam array yang tidak sama. Maka menghitung dan tidak harus memberikan logika yang benar saya pikir. Jika masih salah, tolong beri tahu saya, saya hanya mengkode selama beberapa tahun dan saya masih memiliki jalan panjang.
Owen Morgan
~nnz(a(a~=a(1)))sederhana ~nnz(a-a(1)). Anda juga tidak perlu tanda kurung. if ~nnz(a-a(1));a=[a,1];else[~,I]=min(a);a(I)=a(I)+1;end. Ini harus lebih pendek 5 byte (catatan: Saya belum mengujinya).
Stewie Griffin
Anda dapat menyimpan 3 byte dengan menggunakan range(a)alih-alihnnz(a-a(1))
MattWH
@oboquack, kode itu memeriksa apakah jumlah elemen dalam asama dengan nilai terendah dalam vektor itu. Sebuah vektor a = [3 4 6]akan menghasilkan true, dan sebuah vektor a = [4 4 6]akan menghasilkan false. Saya tidak berpikir itu akan berguna di sini ...?
Stewie Griffin
1

Clojure, 112 100 byte

Sayangnya min-key mengembalikan indeks terakhir dari indeks terkecil, bukan yang pertama. Ini berfungsi untuk input integer dan array yang lebih pendek dari 10 ^ 9 elemen;)

Sunting: Menentukan fungsi anonim, menggunakan (apply = a)alih-alih (= 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)))

Asli:

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

Solusi 134 byte yang tidak terlalu retas membalikkan vektor sebelum memperbarui dan kemudian mengembalikannya lagi:

(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)))))
NikoNyrh
sumber
1

Java 8, 85 + 38 = 123 byte

Membatalkan lambda mengambil List<Integer>(output dimutasikan input). Hitungan byte termasuk lambda dan impor yang diperlukan.

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);}

Cobalah secara Online

Ini hampir terlihat seperti Python dengan metode impor ...

Jakob
sumber
1

MATLAB, 66 53 byte

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

Keluaran:

Inisialisasi:

a = [3 2]

Berjalan berturut-turut:

[3 2] -> [3 3] -> [3 3 1] -> [3 3 2] -> [3 3 3] -> [3 3 3 1] ...
Pon pon holla mon
sumber
2
Anda tidak dapat meng-hardcode input, Anda harus melakukan sesuatu seperti @(x) ….
ბიმო
1

SmileBASIC 3, 101 byte

Menentukan fungsi pernyataan di I Amana Aarray bilangan integer kami. Output dicapai dengan memodifikasi input (karena array adalah referensi.)

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
siput_
sumber
Anda dapat menyimpan 2 byte dengan menggantinya BREAKdengan M=0, karena Atidak dapat berisi 0sehingga M==A[C]tidak akan pernah benar.
12Me21
1

SmileBASIC, 77 byte

DEF I A
IF MIN(A)==MAX(A)THEN PUSH A,0
WHILE A[I]>MAX(A)I=I+1WEND
INC A[I]END
12Me21
sumber
0

Pyth, 16 byte

?tl{QXxQhSQQ1+Q1

Program yang mengambil input daftar dan mencetak hasilnya.

Suite uji

Bagaimana itu bekerja

?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                    
TheBikingViking
sumber
0

Haskell, 93 byte

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;[]#_=[]

Tidak Disatukan:

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 [] _ = []

Upaya awal, akan mencoba memunculkan sesuatu yang lebih canggih nantinya.

sudee
sumber
1
Mengapa tidak membuat fungsi terpisah alih-alih menggunakan where?
Michael Klein
0

Bertanya-tanya , 44 byte

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

Ini bukan yang ada dalam pikiran saya ketika saya membuat bahasa ini ... Ini benar-benar lebih buruk daripada Perl dalam hal keterbacaan!

Pemakaian:

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

Penjelasan

Lebih mudah dibaca:

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

Pada dasarnya memeriksa apakah menjatuhkan 1 item dari subset argumen yang unik membuat daftar kosong. Jika tidak, maka kami menambah minimum array. Kalau tidak, kita hanya menggabungkan 1 argumen.

Mama Fun Roll
sumber
0

Kotlin, 75 byte

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

Memodifikasi argumen fungsi.

Sialan kamu mengetik kuat! :MutableList<Int>menyumbang 17 byte saja. Saya tidak berpikir ada solusi di mana jenisnya dapat disimpulkan, sayangnya.

Tyler MacDonell
sumber