Dizi Artırma


44

Boş olmayan bir pozitif tamsayı dizisi göz önüne alındığında, bunu bir kez "artırın":

  • Tüm dizi elemanları eşitse, dizinin sonuna bir a ekleyin 1. Örneğin:

    [1] -> [1, 1]
    [2] -> [2, 1]
    [1, 1] -> [1, 1, 1]
    [3, 3, 3, 3, 3] -> [3, 3, 3, 3, 3, 1]
    
  • Aksi halde, dizideki ilk öğeyi dizinin minimum değeri olan artırın. Örneğin:

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

(Her ->biri programınızın yapması gereken tek bir artışı temsil eder.)

Elde edilen artımlı diziyi çıkar.

Bayt cinsinden en kısa kod kazanır.


0 pozitif tamsayı olarak sayılır
Downgoat

20
@Downgoat 0, PPCG'de hiç pozitif değil. Eğer 0'a izin verilirse, "negatif olmayan" terimi olacaktır
ETHproductions

Yanıtlar:


13

Jöle , 8 7 bayt

‘;ṀỤḢṬ+

Çevrimiçi deneyin! veya tüm test durumlarını doğrulayın .

Nasıl çalışır

‘;ṀỤḢṬ+  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 bayt

Listeye değiştiren işlev ( meta tarafından izin verilen ).

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

Tekrar dene!

-9 bayt, bunu tespit ettiği için Lynn'e teşekkür eder, dizi pozitif tamsayılara sahip olacağı için dizinin sonuna '0' ekleyebilirim ve bunu artırdım.

Golf len(set(a))için len({*a})mbomb007'ye, floordiv numarası için Dennis'e özel teşekkürler !


Hmm. Msgstr "Sonuçtaki artan diziyi göster". Bu uygun mu?
Yytsi

Nerede olduğunu tam olarak hatırlayamıyorum, ancak belirli bir listeyi değiştirmenin varsayılan olarak izin verildiği bir meta gönderisini gördüğümü hatırlıyorum. Bunun için bir göz atacağım @TuukkaX
FlipTack

@TuukkaX Tamamen emin değilim. Tamam gibi gözüküyor, ancak eğer varsa dizileri yerinde değiştirmekle ilgili meta fikir birliğine erteleyeceğim.
Calvin'in Hobileri

1
Python 3'te, len({*L})<2bir listenin tüm öğelerinin eşit olup olmadığını bulmak için kullanabilirsiniz .
mbomb007

1
a+=1//len({*a})*[0]bir bayt kaydetmelisiniz.
Dennis

9

JavaScript (ES6), 61 bayt

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

Argümanını değiştirerek çıktılar . Bir dizinin 17 bayttan daha az benzersiz bir öğeye sahip olup olmadığını belirlemenin bir yolunu bulamıyorum, ancak önerileriniz memnuniyetle karşılanıyor.

Test pasajı

Diğer girişimler

Dizinin birden fazla benzersiz girişi olup olmadığına karar vermenin birkaç alternatif yolu:

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)

Her ikisi de someaynı şekilde değiştirilebilir find. .sorteğer varsayılan sıralama sözlüksel değilse (minimum, JS, neden?):

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)

Minimum bulmak için özyinelemeyi denedim, ancak daha uzun sürdü:

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

Ve işte ilk başta iyi bir fikir gibi görünen bir dizgeye dayanan çözüm: (girdi bir dizgede dizi biçiminde verilir "[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)) kullanmak daha mı kısa?
Downgoat

@Downgoat İndeks yerine maddeyi döndürdüğü için bunu nasıl kullanacağımdan emin değilim
ETHproductions

evet> _> whoops, senin ++ '
ını

7

Mathematica, 70 57 55 bayt

Neredeyse tüm iyileşme, kalıp eşleştirme yaklaşımlarındaki kıçımı tekmeleyen Martin Ender'den kaynaklanıyor! Ayrıca JHM, esasen aynı anda esasen aynı çözümle geldi. (bayt sayısı ASCII kodlamasını kullanır)

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

±Bir liste argümanı alan bir işlevi tanımlar . Bu liste argümanı, aynı elemanın (tespit edilen x_..ve adlandırılan p) bazı kopyalarını içeriyorsa , listeyi 1eklenmiş olarak verin. Aksi takdirde, bu liste argüman özel bir elemanı vardır halinde y(birlikte xönce sıfır ya da daha fazla bileşeni olarak y, ve zsonra sıfır ya da daha fazla bileşeni olarak yen sonra diğer elemanların asgari çıkış bununla listesi) yarttırılır. Listenin minimum elemanının herhangi bir örneği tarafından eşleştirilecek y, ancak neyse ki Mathematica harekete geçecek olanı seçti.


Çünkü ±bir 2 bayt karakter, kodunuz 59 byte uzunluğundadır. Ayrıca, aralarında bir boşluk olmalıdır x_ve ..çünkü Mathematica yorumladığını x_..olarak x_. .(hataları atar ki). Artı, Min( x~Min~z) ' nin infix formu bu 2 baytı kısaltır (ki bu çözümü benimkilerden biri ile aynı yapar: p ...) Düzenlemem seninkinden daha geç olduğundan kredi alabilmeye
çalışalım

Hayır, Martin Ender zaten kredimin çoğunu alıyor. Neden ± iki bayt?
Greg Martin,

@FregMartin ±UTF-8'de ( Mathematica varsayılan olarak UTF-8 kullanır; deneyin $CharacterEncoding) iki baytlık bir karakterdir (U + 00B1).
JungHwan Min.

@JHM UTF-8, Windows'taki varsayılan karakter kodlaması değildir . Mathematica, kaynak dosyaları içeren tek baytlık bir kod sayfasından okuyabilir ±.
Martin Ender

1
@ASimmons CP1252 ( tek bir bayt için kullanılabilir ve ISO 8859-1 ile yeterince uyumlu olan) olarak $CharacterEncodingayarlanmış olan Windows'a taze Mathematica kurulumum . WindowsANSI±·
Martin Ender

7

C ++ 14,177 176 174 155 142 135 bayt

boyun eğme

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

yakarma

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

Bu benim ilk golf oynamanın, yardımın takdir edilmesini sağlıyor.

EDIT: en azından ile derlemek zorunda olduğunu söylemeyi unuttum -std=c++11 -std=c++14

EDIT2: İçerdiği alanı bırakabileceğimi fark ettim. #include <list>

EDIT3: değiştirerek iki bayt kaydedildi l.begin()tarafındanbegin(l)

EDIT4: @ Quentin sayesinde 19 (!) Bayt daha kaydetti (yorumuna bakın)

EDIT5: Quentin 13 bayta daha tıraş etti, teşekkürler!

EDIT6: TuukkaX'in işaret ettiği gibi, isimlendirilmemiş lambdas / fonksiyonlar yeterlidir, böylece auto i=bytecount değerini kaldırdım.


5
Size C ++ konusunda yardımcı olamam, ancak şunu söyleyebilirim: PPCG'ye Hoş Geldiniz!
Zgarb

1
Sanırım #includesatırlardaki boşluklara ihtiyacınız yok .
Christian Sievers

Oh teşekkür ederim ben sadece kendim anladım :)
Neop

1
İşlevin bir lambda ( auto i=[](auto&l){...};) ile değiştirilmesi bir bayttan tasarruf eder (unuttuğunuz geri dönüş türünü sayarsak);) , işlenenleri kullanmak ^ yerine ==ve yerine başka bir tane kaydeder. std::listyineleyicileri kesinlikle std::sınıftır, bu nedenle std::her ikisinden de düşebilir std::countve std::min_elementADL sayesinde (-10). l.front()ayrıca *b(-7). 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);};:) ile
Quentin

1
Biz onun yanındayken , belgelerin std::min_elementilk en küçük öğeyi döndürdüğünü belirtir , yani find()gereksizdir, bu 11 bayttır. Koşullu olarak, sağ ifadeyi zorlamak için bir parantez çifti ve virgül operatörü kullanmak int, solu bir ila void2 bayta dönüştürmekten daha kısadır . Bu 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'a yol açar :)
Quentin

6

05AB1E , 21 20 16 bayt

Adnan sayesinde 4 byte kurtarıldı .

DÙgi0¸«}ÐWksgÝQ+

Çevrimiçi deneyin!

açıklama

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

Bunun DÙgi0¸«}ÐWksgÝQ+da işe yaradığını düşünüyorum .
Adnan

@Adnan: Aah, ÝQile kullanmak güzel bir fikir k. Teşekkürler!
Emigna

5

Kazı kazan, 25 34 blok + 7 6 bayt

program

Girdiyi önceden tanımlanmış bir tamsayı dizisi olarak alır. Dizilerin Scratch'ta 1 indeksli olduğunu unutmayın.

Python'da şöyle görünür: (Scratch'ın aksine Python'un 0 dizinli olduğunu unutmayın)

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)

Golf yorumları lütfen?
OldBunny2800

neden fval ilan ediyorsun?
Christoph

Çizilmeye ... renklerle düz metinde sadece Python olduğunu bana görünen
Stewie Griffin

Ve 1 indeksli diziler ve elif ifadeleri yok!
OldBunny2800

1
İyi nokta @ Christoph! Dışarı atılan eski bir versiyonun parçasıydı. Düzenleme.
OldBunny2800

4

J, 25 22 bayt

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

İsimsiz bir fiili değerlendirir. Çevrimiçi Deneyin!

açıklama

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

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

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın

Nasıl çalışır

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 bayt

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

Adlandırılmış işlevi kullanır ±. ISO8859-1 kodlamasını kullanır

Alternatif çözümler (58 bayt)

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

kullanım

±{1, 1}

{1, 1, 1}

±{3, 4, 5}

{4, 4, 5}


3

Haskell, 71 70 62 bayt

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

@ Zgarb 8 bayt kurtardı, teşekkürler!

Başladığımda, bazı şık düğüm bağlama kandırmacalarını umuyordum, ama @ Zgarb'ın yolu bu kadar şaşırtıcı.


Bazı yeniden yapılandırma, 62 bayt:f(a:b)|(x,y:z)<-span=<<(<).minimum$a:b++[0|all(a==)b]=x++y+1:z
Zgarb

@Zgarb Sadece vay!
Christian Sievers

Ah, beynim, işlevlerin monad örneği için tür
çıktısı alamadı

@Angs Monad, (->)rbir türe uygulanandır (->)r a = r->a. Sonra türlerinden return:: a->r->ave (>>=)::(r->a)->(a->r->b)->(r->b)onların uygulamasından (söylemeye cüret edebilir miyim?) Açık: return=constve m>>=f = \r->f(m r)r. İkincisi, sadece bir kez span(predicate_depending_on l)lbahsederken bir şeyi ifade etmek için tam olarak ihtiyaç duyulan şeydir l. Şimdi sadece ihtiyacım olduğunda hatırlamam gerekiyor.
Christian Sievers

@Angs Bu numarayı ve daha fazlasını Haskell golf ipuçları koleksiyonumuzda bulabilirsiniz .
Zgarb

3

C #, 123 121 120 79 77 bayt

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

İşleve iletilen argümanı değiştirir.

3 byte kaydettiğin için Cyoce'ye teşekkürler ! -> !Anydan All, +=1dan ++.

Bir kuyruklu 43 byte tasarruf için TheLethalCoder teşekkürler ! -> Kaldırılan yöntem imza kodu. Parametre listesinin etrafındaki parantez kaldırıldı.


!l.Any(o=>o!=l[0]))ile değiştirir l.All(o=>o==l[0])misin?
Cyoce

@Cyoce Gerçekten de öyle. Aynı şeyi düşündüm, ama Anybunun yerine yazdığını Allve çalışmadığını düşündüğünü yazdım : D Teşekkürler!
Yytsi

2
C # yok ++mu?
Cyoce

Action<List<int>>Tüm yöntem imza kodunu kaldırmak için a derleyebilirsiniz
26'da TheLethalCoder

1
@Stefan Hmm. Ayrıca birçok kişinin gerekli usings'leri C # ile bıraktığını gördüm , bu yüzden bırakmanın yasal olduğuna güvenmiyorum using System.Linq. Bunun gerekli olmadığını söyleyen açık bir ifade görmezsem, bununla kalacağım. Öneriniz için teşekkürler! :)
Yytsi

2

Perl 6 , 46 bayt

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

(Giriş dizisini değiştirir ve döndürür)

Expanded:

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

Jöle, 9 bayt

;1µ‘i¦E?Ṃ

-2 bayt için Dennis'e teşekkür ederiz.

Gövde en az 30 karakter olmalı; sen girdin ... .


Eğer vücutta girmek için ekstra karakterler varsa, herkes onu anlamaya yardımcı olur ve cevap daha ilginç kılan bir kod, açıklayan hep değer :)
Alfie Goodacre

2

Mathematica, 53 bayt 57 bayt 59 bayt

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

7
Bu 57 bayttır. ve 3 baytlık karakterlerdir. Ayrıca, kodunuz çalışmıyor çünkü {##,1}bölüm girişin ayrı tamsayılar (yani f[1, 2, 3]) x=#olduğunu, ancak bölüm girişin bir List(yani f[{1, 2, 3}]) olduğu anlamına gelir . Hızlı bir düzeltme değiştirmektir x=#için x={#}59 bayt uzunluğunda kodunuzu yapma ve girdi olarak çiğ tamsayılar kabul ediyoruz.
Junghwan Min

İyi yakalama! Bayt ve karakter sayımı arasındaki farkı anlamadım, sadece bu öneriyi gördüm ve geçerli olduğunu düşündüm. Karakter sayımını veren birçok cevap var gibi görünüyor ama eğer onları Notepad ++ 'a kaydedersem daha yüksek bir bayt sayımı alıyorum (örneğin Jelly cevabı). Cevabınız kodlamayı belirtir, bu konuda öğrenmemi tavsiye edeceğiniz bir yer var mı?
ngenisis

1
Bence daha kısa Equal@#olsa #==##da demek istiyorsun .
Martin Ender

Haklısın. @JHM başına bir liste yerine birden fazla argüman kabul etmek için bir değişiklik yaptım ancak değişikliği her yere yaymadım. Bir liste kabul etmeye geri döndüm, çünkü bu bilgi istemine daha uygun.
ngenisis

2

R , 72 66 65 bayt

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

Çevrimiçi deneyin!

which.minİlk eşleşmeyi döndüren artış kullanılarak artış yapılır . "[<-"değerin değiştirilmesine izin verir ve değiştirilmiş vektörü bir işlev çağrısında döndürür.

Giuseppe sayesinde -7 bayt!



@Giuseppe isTRUE'yi denedim ve sd ile isFALSE golfçü değil :(
JayCe

heh, 65 bayt yerine !=sahip -!
Giuseppe

Tabii @Giuseppe!
JayCe

1

Ruby, 46 bayt

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

Tüm öğelerin aynı olup olmadığını kontrol etmenin daha iyi bir yolu olduğunu hissediyorum a.uniq.size<2, ancak onu bulmak için çok tembelim.


6
a.uniq[1]farklı değerler varsa iffet olacak.
histocrat

Sen çevirerek bir bayt kaydedebilirsiniz a[a.index(a.min)]içinea[a.index a.min]
Cyoce

1

Octave, 69 67 64 bayt

İkisini de kullanarak daha komple bir adlandırılmış işlev yapmak aslında kısaydı inputve disp.

Luis sayesinde 3 bayt kurtardı.

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

Eski cevap, işlev kullanmamak:

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

1

R, 97 bayt

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'in R'de x=+1bulunmaması çok kötü !

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

TI-Basic, 53 bayt

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 Bayt

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

Ben golf kodları konusunda nispeten yeniyim, lütfen nazik olun! Anonim işlevleri kullanmaya çalıştım, ancak googling, / else ifadelerinde ve matlab'da üçlü operatör yoksa, kullanamayacağınızı söylüyor, bu yüzden yapabileceğimin en iyisi bu.

Düzenleme: stewie-griffin sayesinde düzeltildi ve kısaltıldı (iki kez!).


PPCG'ye Hoşgeldiniz! Bu kodda bazı kusurlar var. sum(a)/length(a)==a(1)tüm öğelerin eşit olduğunu garanti etmez, yalnızca ortalamanın eşit olduğunu gösterir a(1). Bunu yapmanın daha basit bir yolu olurdu mean(a)==a(1). ondan numeldaha kısa olan bir bayttır length, ancak tüm değerlerin pozitif olduğunu bildiğiniz için nnzhangisinin daha kısa olduğunu kullanabilirsiniz (bu zorlukta hala doğru sonucu vermez, ancak en azından daha kısadır: P). Eğer min(a)aramayı döngünün önüne götürürseniz, ondan her iki çıkışı da kullanabilirsiniz ve allelemanların aeşit olup olmadığını kontrol edin min(a).
Stewie Griffin

Haklısın! Ortalama, ilk elemandaki sayıya eşit olduğunda başarısız olur. Sanırım yeni olanım doğru ve aynı zamanda daha kısa. Mantık, eğer kalan elemanlar ilk elemana eşit değilse, a (a ~ = a (1)), tanımsız olarak aynı olmayan bir dizide 0'dan büyük olan kalan elemanları döndürür. O zaman saymayı düşünüyorum ve doğru mantığı vermemeliyim. Eğer hala yanlışsa lütfen bana bildirin, sadece birkaç yıldır kod yazdım ve hala çok uzun bir yolum var.
Owen Morgan,

~nnz(a(a~=a(1)))basitçe ~nnz(a-a(1)). Ayrıca, parantez gerekmez. if ~nnz(a-a(1));a=[a,1];else[~,I]=min(a);a(I)=a(I)+1;end. Bu, 5 bayt daha kısa olmalıdır (not: Test etmedim).
Stewie Griffin,

Bunun range(a)yerine 3 bayttan tasarruf edebilirsiniznnz(a-a(1))
MattWH

@boboquack, bu kod, içindeki elemanların sayısının ao vektördeki en düşük değere eşit olup olmadığını kontrol eder . Bir vektör a = [3 4 6]sonuçlanır trueve bir vektör a = [4 4 6]sonuçlanır false. Bunun işe yarayacağını sanmıyorum ...?
Stewie Griffin

1

Clojure, 112 100 bayt

Ne yazık ki min-key, birinciyi değil, en küçük dizinin son dizinini döndürür. Bu tamsayı girişleri ve 10 ^ 9 öğesinden daha kısa diziler için çalışır;)

Düzenleme: Kullanmak (apply = a)yerine, adsız bir işlev tanımlamak (= 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)))

Orijinal:

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

Daha az kesen bir 134 baytlık çözüm, güncellemeden önce vektörü tersine çevirir ve ardından tekrar geri döndürür:

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

Boşlukta lambda alarak List<Integer>(çıktı mutasyona uğramış girdi). Bayt sayısı, lambda ve gerekli ithalat içerir.

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

Çevrimiçi Deneyin

Bu neredeyse Python'a benziyor ve bu yöntem ithal ediyor ...


1

MATLAB, 66 53 bayt

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

Çıktı:

Başlatma:

a = [3 2]

Art arda çalışanlar:

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

2
Girişleri kodlayamazsınız, bunun gibi bir şey yapmanız gerekir @(x) ….
12'de

1

SmileBASIC 3, 101 bayt

Tam sayı sayı dizimizin I Aolduğu bir ifade işlevi tanımlar A. Çıktı, girdi değiştirilerek elde edilir (diziler referanslar gibi).

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

Sen değiştirerek 2 bayt kaydedebilirsiniz BREAKile M=0çünkü Aiçeremez 0böylece M==A[C]gerçek olmayacak.
12Me21

1

SmileBASIC, 77 bayt

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 bayt

?tl{QXxQhSQQ1+Q1

Bir listenin girişini alan ve sonucu basan bir program.

Test odası

Nasıl çalışır

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

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

İlk girişim, daha sonra daha sofistike bir şey bulmaya çalışacaktır.


1
Neden kullanmak yerine ayrı bir işlev yapmıyorsunuz where?
Michael Klein,

0

Wonder , 44 bayt

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

Bu dili yaptığımda aklımdaki bu değildi ... Okunabilirlik anlamında Perl'den tam anlamıyla daha kötü!

Kullanımı:

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

açıklama

Daha okunabilir:

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

Temel olarak, bağımsız değişkenin benzersiz alt kümesinden 1 öğenin bırakılmasının listenin boş olup olmadığını denetler. Eğer değilse, o zaman dizinin minimumunu arttırırız. Aksi takdirde, tartışmayı 1 ile birleştiririz.


0

Kotlin, 75 bayt

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

İşlev argümanını değiştirir.

Kahretsin, güçlü yazıyorsun! :MutableList<Int>tek başına 17 baytlık hesaplar. Ne yazık ki, türün çıkarım yapabileceği bir çözüm olduğunu sanmıyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.