Przyrost tablicy


44

Biorąc pod uwagę niepustą tablicę dodatnich liczb całkowitych, „zwiększ” ją raz, jak następuje:

  • Jeśli wszystkie elementy tablicy są równe, dodaj a 1na końcu tablicy. Na przykład:

    [1] -> [1, 1]
    [2] -> [2, 1]
    [1, 1] -> [1, 1, 1]
    [3, 3, 3, 3, 3] -> [3, 3, 3, 3, 3, 1]
    
  • W przeciwnym razie zwiększ pierwszy element w tablicy, który jest minimalną wartością tablicy. Na przykład:

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

(Każda ->reprezentuje jeden przyrost, czyli tyle, ile powinien zrobić Twój program).

Wyprowadza wynikową tablicę przyrostową.

Najkrótszy kod w bajtach wygrywa.


Czy 0 liczy się jako dodatnia liczba całkowita
— Downgoat

20
@Downgoat 0 nigdy nie jest pozytywny na PPCG. Gdyby 0 było dozwolone, termin byłby „nieujemny”
— ETHprodukcje

Odpowiedzi:


13

Galaretka , 8 7 bajtów

‘;ṀỤḢṬ+

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

Jak to działa

‘;ṀỤḢṬ+  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 bajtów

Funkcja modyfikująca przekazywaną do niej listę ( dozwolona przez meta ).

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

Spróbuj na repl.it!

-9 bajtów dzięki Lynnowi za wykrycie tego, ponieważ ponieważ tablica będzie miała dodatnie liczby całkowite, mogę dodać „0” na końcu tablicy i zwiększyć ją.

Specjalne podziękowania dla mbomb007 na golfa len(set(a))do len({*a})i Dennis za trick floordiv!


Hmm Msgstr "Wyprowadza wynikową tablicę przyrostową". Czy to się kwalifikuje?
— Yytsi

Nie do końca pamiętam, ale pamiętam, że widziałem meta post, który domyślnie dopuszcza modyfikowanie danej listy. Zajrzę do niego @TuukkaX
— FlipTack

@TuukkaX Nie jestem do końca pewien. Wydaje się być w porządku, ale odłożę się do meta concensus na temat modyfikowania tablic w miejscu, jeśli takie istnieją.
— Calvin's Hobbies

1
W Pythonie 3 możesz len({*L})<2sprawdzić, czy wszystkie elementy listy są równe.
— mbomb007

1
a+=1//len({*a})*[0]powinien zapisać bajt.
— Dennis

9

JavaScript (ES6), 61 bajtów

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

Wyjście poprzez modyfikację argumentu . Nie mogę znaleźć sposobu, aby ustalić, czy tablica ma tylko jeden unikalny element w mniej niż 17 bajtach, ale sugestie są mile widziane.

Testowy fragment kodu

Inne próby

Oto kilka alternatywnych sposobów decydowania, czy tablica ma więcej niż jedno unikalne wejście:

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)

Oba te somemożna również zastąpić find. .sortbyłoby krótsze do znalezienia minimum, gdyby domyślny sort nie był leksykograficzny (dlaczego, JS, dlaczego?):

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)

Próbowałem rekurencji, aby znaleźć minimum, ale okazało się, że jest on dłuższy:

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

A oto rozwiązanie oparte na łańcuchach, które na początku wydawało się dobrym pomysłem: (dane wejściowe są podawane w postaci tablic w łańcuchach, np. "[1,2,3]")

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

Czy użycie a.find (n => n == Math.min (... a)) jest krótsze?
— Downgoat

@Downgoat Nie jestem pewien, jak bym tego użył, ponieważ zwraca element, a nie indeks
— ETHproductions

tak> _> ups, tęskniłem za twoim ++ i nie zdawałem sobie sprawy, że potrzebujesz referencji
— Downgoat

7

Mathematica, 70 57 55 bajtów

Praktycznie cała poprawa wynika z Martina Endera, który kopie mnie w dupę przy podejściu do dopasowywania wzorów! Również JHM wymyślił zasadniczo to samo rozwiązanie w zasadzie w tym samym czasie. (liczba bajtów używa kodowania ASCII)

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

Definiuje funkcję ±przyjmującą jeden argument listy. Jeśli ten argument listy zawiera pewną liczbę kopii tego samego elementu (wykrytych x_..i nazwanych p), wyślij listę z 1dołączonym załącznikiem. W przeciwnym razie, jeśli ten argument listy ma specjalny element y( xbędący wcześniej zerowym lub większą liczbą elementów yi zbędący zerowym lub większym elementem ypóźniejszym), co najwyżej minimum z pozostałych elementów, następnie wypisz listę z tym yprzyrostem. Każde wystąpienie minimalnego elementu listy zostanie dopasowane y, ale na szczęście Mathematica wybiera pierwszy, który będzie działał.


Ponieważ ±jest to 2-bajtowy znak, twój kod ma 59 bajtów. Ponadto musi być spacja między x_i ..ponieważ Mathematica interpretuje x_..jako x_. .(co powoduje błędy). Dodatkowo, forma infiksu Min( x~Min~z) powoduje, że te 2 bajty są krótsze (co czyni to rozwiązanie identycznym z jednym z moich: p ...) Welp, możesz wziąć kredyt, ponieważ moja edycja była późniejsza niż twoja ...
— JungHwan Min

Nie, Martin Ender i tak dostaje większość mojego uznania. Dlaczego ± dwa bajty?
— Greg Martin

@GregMartin ±w UTF-8 ( Mathematica domyślnie używa UTF-8; try $CharacterEncoding) jest dwubajtowym znakiem (U + 00B1).
— JungHwan Min

@ JHM UTF-8 nie jest domyślnym kodowaniem znaków w systemie Windows. Mathematica może odczytywać pliki źródłowe na jednobajtowej stronie kodowej, która zawiera ±.
— Martin Ender

1
@ASimmons Moja świeża instalacja Mathematica w systemie Windows, dla której $CharacterEncodingustawiono WindowsANSICP1252 (która jest wystarczająco kompatybilna z ISO 8859-1 dla ±i ·może być użyta dla jednego bajtu).
— Martin Ender

7

C ++ 14, 178 176 174 155 142 135 bajtów

zgłoszenie

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

wezwanie

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

bez golfa

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

Doceniam pomoc po raz pierwszy w golfa.

EDYCJA: zapomniałem wspomnieć, że musisz to przynajmniej skompilować -std=c++11 -std=c++14

EDYCJA 2: Zdałem sobie sprawę, że mogę pominąć miejsce w dołączeniach #include <list>

EDYCJA 3: zapisano dwa kolejne bajty, zastępując l.begin()przezbegin(l)

EDIT4: zapisał kolejne 19 (!) Bajtów dzięki @Quentin (patrz jego komentarz)

EDYCJA 5: Quentin zgolił jeszcze 13 bajtów, dzięki!

EDYCJA 6: jak wskazał TuukkaX, wystarczy nienazwane lambdas / funkcje, więc usunąłem auto i=bajtecount


5
Nie mogę ci pomóc w C ++, ale mogę powiedzieć: Witamy w PPCG!
— Zgarb

1
Myślę, że nie potrzebujesz spacji w #includeliniach.
— Christian Sievers

Och, dziękuję, właśnie to sobie uświadomiłem :)
— Neop

1
Zastąpienie funkcji lambda ( auto i=[](auto&l){...};) pozwala zaoszczędzić jeden bajt (więcej, jeśli policzymy zwracany typ, o którym zapomniałeś;)), użycie ^ zamiast ==i zamiana operandów powoduje zapisanie innego. std::listIteratory są z pewnością std::klasami, więc możesz std::z nich zrezygnować std::counti std::min_elementdzięki ADL (-10). l.front()jest również *b(-7). 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
W tym momencie dokumentacjastd::min_element stwierdza, że ​​zwraca pierwszy najmniejszy element, więc find()jest zbyteczny, czyli 11 bajtów. W warunkowym użyciu pary nawiasów i operatora przecinku do wymuszenia odpowiedniego wyrażenia intjest krótsze niż rzutowanie lewego voido 2 bajty. Prowadzi to do 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 bajtów :)
— Quentin

6

05AB1E , 21 20 16 bajtów

Zaoszczędzono 4 bajty dzięki Adnan .

DÙgi0¸«}ÐWksgÝQ+

Wypróbuj online!

Wyjaśnienie

                      # 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]

Myślę, że to DÙgi0¸«}ÐWksgÝQ+też działa.
— Adnan

@Adnan: Aah, ładny pomysł korzystania ÝQz k. Dzięki!
— Emigna

5

Scratch, 25 34 bloków + 7 6 bajtów

Program

Pobiera dane wejściowe jako predefiniowaną tablicę liczb całkowitych. Zauważ, że tablice są indeksowane 1 w Scratch.

W Pythonie wyglądałoby to tak: (Zauważ, że w przeciwieństwie do Scratch, Python ma 0 indeksów)

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)

Komentarze do gry w golfa, proszę?
— OldBunny2800,

dlaczego ogłaszasz fval?
— Christoph

Wydaje mi się, że Scratch to po prostu Python w zwykłym tekście z kolorami ...
— Stewie Griffin

I 1-indeksowane tablice i żadnych instrukcji elif!
— OldBunny2800,

1
Dobra uwaga @Christoph! To była część wcześniejszej wersji, która została rozegrana. Redagowanie.
— OldBunny2800,

4

J, 25 22 bajtów

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

Ocenia anonimowy czasownik. Wypróbuj online!

Wyjaśnienie

(+~:*[=<./)@,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 bajtów

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

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe

Jak to działa

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 bajtów

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

Używa nazwanej funkcji ±. Wykorzystuje kodowanie ISO8859-1

Alternatywne rozwiązania (58 bajtów)

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

Stosowanie

±{1, 1}

{1, 1, 1}

±{3, 4, 5}

{4, 4, 5}


3

Haskell, 71 70 62 bajtów

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

@Zgarb zapisał 8 bajtów, dzięki!

Kiedy zaczynałem, liczyłem na eleganckie sztuczki wiązania węzłów, ale sposób @ Zgarba jest równie niesamowity.


Trochę restrukturyzacji, 62 bajty:f(a:b)|(x,y:z)<-span=<<(<).minimum$a:b++[0|all(a==)b]=x++y+1:z
— Zgarb

@Zgarb Po prostu wow!
— Christian Sievers

Ugh, mój mózg nie wywnioskuje typu dla instancji funkcji monada
— Angs,

@Angs Monada jest (->)r, która została zastosowana do typu (->)r a = r->a. Zatem z rodzajów return:: a->r->ai (>>=)::(r->a)->(a->r->b)->(r->b)ich realizacji jest (śmiem to powiedzieć?) Oczywiste: return=consti m>>=f = \r->f(m r)r. To drugie jest dokładnie tym, czego potrzeba, aby wyrazić coś takiego span(predicate_depending_on l)l, wspominając ltylko raz. Teraz muszę o tym pamiętać tylko wtedy, gdy tego potrzebuję.
— Christian Sievers

@Angs Możesz znaleźć tę sztuczkę i wiele więcej w naszej kolekcji wskazówek golfowych Haskell .
— Zgarb

3

C #, 123 121 120 79 77 bajtów

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

Zmienia argument przekazany do funkcji.

Dzięki Cyoce za uratowanie 3 bajtów! -> !Anydo All, +=1do++ .

Dzięki TheLethalCoder za oszczędność aż 43 bajtów! -> Usunięto kod podpisu metody. Usunięto nawias wokół listy parametrów.


można zastąpić !l.Any(o=>o!=l[0]))z l.All(o=>o==l[0])?
— Cyoce

@Cyoce Rzeczywiście tak jest. Myślałem o tym samym, ale napisałem Anyzamiast Alli pomyślałem, że to nie działa: D Dzięki!
— Yytsi

2
Czy C # nie ma ++?
— Cyoce

Możesz skompilować do a, Action<List<int>>aby usunąć cały kod sygnatury metody
— TheLethalCoder

1
@Stefan Hmm. Widziałem również, że wiele osób upuszcza niezbędne usingpliki z C #, więc nie ufam, że legalne jest porzucenie using System.Linq. O ile nie zobaczę wyraźnego stwierdzenia, że ​​to nie jest konieczne, pozostanę przy tym. Dziękuję za sugestię! :)
— Yytsi,

2

Perl 6 , 46 bajtów

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

(modyfikuje tablicę wejściową i zwraca ją)

Rozszerzony:

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

Galaretka, 9 bajtów

;1µ‘i¦E?Ṃ

Dzięki Dennis za -2 bajty.

Treść musi mieć co najmniej 30 znaków; wszedłeś ... .


Jeśli masz dodatkowe znaki do wpisania w ciele, zawsze warto wyjaśnić kod, który pomaga wszystkim go zrozumieć i sprawia, że ​​odpowiedź jest bardziej interesująca :)
— Alfie Goodacre

2

Mathematica, 53 bajty 57 bajtów 59 bajtów

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

7
To 57 bajtów. 〚i 〛są 3-bajtowymi znakami. Ponadto twój kod nie działa, ponieważ {##,1}część sugeruje, że dane wejściowe są oddzielnymi liczbami całkowitymi (tj. f[1, 2, 3]), Ale x=#część oznacza, że ​​dane wejściowe to List(tj f[{1, 2, 3}].). Quick Fix byłoby zmienić x=#się x={#}i przyjmuję surowych liczb całkowitych jak wejścia, dzięki czemu kod 59 bajtów.
— JungHwan Min

Dobry chwyt! Nie zdawałem sobie sprawy z rozróżnienia między liczbą bajtów a liczbą znaków, po prostu zobaczyłem tę sugestię i uznałem, że jest poprawna. Wydaje się, że istnieje wiele odpowiedzi, które podają liczbę znaków, ale jeśli zapiszę je w Notepad ++, otrzymam wyższą liczbę bajtów (na przykład odpowiedź Jelly). Widzę, że twoja odpowiedź określa kodowanie. Czy jest coś, co poleciłbyś mi dowiedzieć się o tym?
— ngenisis

1
Myślę, że masz na myśli Equal@#, chociaż #==##jest krótszy.
— Martin Ender

Masz rację. Wprowadziłem zmianę na @JHM, aby zaakceptować wiele argumentów zamiast listy, ale nie rozpowszechniłem tej zmiany wszędzie. Wróciłem do akceptowania listy, ponieważ jest to bardziej zgodne z poleceniem.
— ngenisis

2

R , 72 66 65 bajtów

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

Wypróbuj online!

Przyrost jest wykonywany za pomocą, which.minktóra zwraca pierwsze dopasowanie."[<-"pozwala zamienić wartość i zwraca zmodyfikowany wektor w jednym wywołaniu funkcji.

-7 bajtów dzięki Giuseppe!



@Giuseppe Próbowałem isTRUE i isFALSE z sd to nie jest golfier :(
— JayCe

heh, 65 bajtów zastępuje !=się -!
— Giuseppe

@Giuseppe oczywiście!
— JayCe

1

Rubinowy, 46 bajtów

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

Wydaje mi się, że jest lepszy sposób, aby sprawdzić, czy wszystkie elementy są takie same a.uniq.size<2, ale jestem zbyt leniwy, aby je znaleźć.


6
a.uniq[1]będzie prawdą, jeśli istnieją odrębne wartości.
— histocrat

Możesz zapisać bajt, zmieniając się a[a.index(a.min)]wa[a.index a.min]
— Cyoce

1

Oktawa, 69 67 64 bajtów

W rzeczywistości było to krótsze, aby uczynić z tej funkcji pełną nazwę niż używanie obu inputi disp.

Zaoszczędź 3 bajty dzięki Luisowi.

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

Stara odpowiedź, nieużywanie funkcji:

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

1

R, 97 bajtów

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

Szkoda, że ​​synthax x=+1 nie istnieje w R!

Nie golfowany:

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

TI-Basic, 53 bajty

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

1

Matlab, 83 , 77 , 71 bajtów

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

Jestem stosunkowo nowy w kodowaniu golfa, więc proszę bądź miły! Próbowałem użyć anonimowych funkcji, ale Google mówi, że nie możesz użyć instrukcji if / else, a Matlab nie ma operatorów trójskładnikowych, więc to najlepsze, co mogłem zrobić.

Edycja: Poprawione i skrócone (dwukrotnie!) Dzięki stewie-gryfowi.


Witamy w PPCG! Ten kod ma pewne wady. sum(a)/length(a)==a(1)nie gwarantuje, że wszystkie elementy są równe, pokazuje tylko, że średnia jest równa a(1). Byłoby to prostsze mean(a)==a(1). numeljest o jeden bajt krótszy niż length, ale ponieważ wiesz, że wszystkie wartości są dodatnie, możesz użyć tego, nnzco jest jeszcze krótsze (nadal nie dałoby to poprawnego wyniku w tym wyzwaniu, ale jest co najmniej krótszy: P). Jeśli odbierzesz min(a)połączenie przed pętlą, możesz użyć z niego obu wyjść i sprawdzić, czy allelementy asą równe min(a).
— Stewie Griffin

Masz rację! kończy się niepowodzeniem, gdy średnia jest równa liczbie w pierwszym elemencie. Myślę, że mój nowy jest poprawny, ale także krótszy. Logika jest taka, że ​​jeśli pozostałe elementy nie są równe pierwszemu elementowi, a (a ~ = a (1)) zwraca pozostałe elementy, które z definicji są większe niż 0 w innej tablicy. Więc liczenie i nie powinno dać właściwej logiki. Jeśli to nadal nie tak, proszę dać mi znać, koduję dopiero od kilku lat i wciąż mam jeszcze wiele do zrobienia.
— Owen Morgan

~nnz(a(a~=a(1)))jest po prostu ~nnz(a-a(1)). Ponadto nie potrzebujesz nawiasów. if ~nnz(a-a(1));a=[a,1];else[~,I]=min(a);a(I)=a(I)+1;end. Powinno to być o 5 bajtów krótsze (uwaga: nie testowałem tego).
— Stewie Griffin,

Możesz zapisać 3 bajty, używając range(a)zamiastnnz(a-a(1))
— MattWH

@ Boboquack, ten kod sprawdza, czy liczba elementów ajest równa najniższej wartości w tym wektorze. W a = [3 4 6]rezultacie powstanie wektor true, a w a = [4 4 6]rezultacie wektor false. Nie sądzę, żeby się tu przydało ...?
— Stewie Griffin,

1

Clojure, 112 100 bajtów

Niestety min-keyzwraca ostatni indeks najmniejszego indeksu, a nie pierwszy. Działa to dla liczb całkowitych i krótszych tablic niż 10 ^ 9 elementów;)

Edycja: Definiowanie anonimowej funkcji za pomocą (apply = a)zamiast (= 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)))

Oryginał:

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

Mniej zhakowane rozwiązanie 134-bajtowe odwraca wektor przed aktualizacją, a następnie odwraca go z powrotem:

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

Void lambda przyjmuje List<Integer>(wyjście jest zmutowanym wejściem). Liczba bajtów obejmuje lambda i wymagany import.

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

Wypróbuj online

To prawie wygląda jak Python z tymi metodami importu ...


1

MATLAB, 66 53 bajtów

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

Wynik:

Zainicjuj:

a = [3 2]

Kolejne przebiegi:

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

2
Nie możesz na stałe zakodować danych wejściowych, musisz zrobić coś takiego @(x) ….
— ბიმო

1

SmileBASIC 3, 101 bajtów

Definiuje funkcję instrukcji, w I Aktórej Aznajduje się nasza tablica liczb całkowitych. Dane wyjściowe są osiągane przez modyfikację danych wejściowych (ponieważ tablice są referencjami).

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

Możesz zapisać 2 bajty, zastępując BREAKje M=0, ponieważ Anie można ich zawierać, 0więc M==A[C]nigdy nie będzie to prawdą.
— maja 21

1

SmileBASIC, 77 bajtów

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

0

Pyth, 16 bajtów

?tl{QXxQhSQQ1+Q1

Program, który pobiera dane z listy i drukuje wynik.

Zestaw testowy

Jak to działa

?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 bajty

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

Nie golfowany:

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

Pierwsza próba spróbuje później wymyślić coś bardziej wyrafinowanego.


1
Dlaczego nie zrobić osobnej funkcji zamiast używać where?
— Michael Klein

0

Cud , 44 bajty

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

Nie to miałem na myśli, kiedy tworzyłem ten język ... Jest dosłownie gorszy niż Perl pod względem czytelności!

Stosowanie:

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

Wyjaśnienie

Bardziej czytelny:

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

Zasadniczo sprawdza, czy usunięcie 1 elementu z unikalnego podzbioru argumentu powoduje, że lista jest pusta. Jeśli nie, zwiększamy minimum tablicy. W przeciwnym razie po prostu łączymy 1 z argumentem.


0

Kotlin, 75 bajtów

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

Zmienia argument funkcji.

Cholera, mocne pisanie! :MutableList<Int>odpowiada tylko 17 bajtów. Nie sądzę, że istnieje rozwiązanie, w którym można wywnioskować ten typ, niestety.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.