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.