配列をインクリメントする


44

正の整数の空でない配列が与えられた場合、次のように一度「インクリメント」します。

  • すべての配列要素が等しい場合、配列1の末尾にa を追加します。例えば:

    [1] -> [1, 1]
    [2] -> [2, 1]
    [1, 1] -> [1, 1, 1]
    [3, 3, 3, 3, 3] -> [3, 3, 3, 3, 3, 1]
    
  • そうでない場合は、配列の最小値である配列の最初の要素をインクリメントします。例えば:

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

(それぞれ->が1つの増分を表します。これは、プログラムが行う必要があるすべてです。)

結果のインクリメントされた配列を出力します。

バイト単位の最短コードが優先されます。


0は正の整数としてカウントされます
-Downgoat

20
PPCGでは、@ Downgoat 0は決してポジティブではありません。0が許可された場合、用語は「非負」になります
-ETHproductions

回答:


13

ゼリー8 7 バイト

‘;ṀỤḢṬ+

オンラインでお試しください!または、すべてのテストケースを確認します

使い方

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

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

11

Pythonの3、62の 53 51 50バイト

渡されたリストを変更する関数(metaで許可)。

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

repl.itをお試しください!

-9バイトは、配列が正の整数であるため、配列の最後に「0」を追加し、それをインクリメントすることができることを発見したLynnに感謝します。

へのゴルフlen(set(a))len({*a})mbomb007を、floordivトリックにDennisに感謝します!


うーん。「結果の増分配列を出力します」。これは資格がありますか?
-Yytsi

私はどこを覚えているのかよくわかりませんが、既定で所定のリストの変更が許可されているというメタ投稿を見たことを覚えています。@TuukkaX
FlipTack

@TuukkaXよくわかりません。それは大丈夫のようですが、配列がある場合は、その場で配列を変更することについてのメタコンセンサスに従います。
カルビンの趣味

1
Python 3ではlen({*L})<2、リストのすべての要素が等しいかどうかを調べるために使用できます。
mbomb007

1
a+=1//len({*a})*[0]バイトを保存する必要があります。
デニス

9

JavaScript(ES6)、61バイト

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

引数を変更して出力します。配列に17バイト未満の一意のアイテムが1つだけあるかどうかを判断する方法が見つかりませんが、提案を歓迎します。

テストスニペット

その他の試み

配列に複数の一意の入力があるかどうかを判断するいくつかの代替方法を次に示します。

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

両方のsomes findも同様に置き換えることができます。.sortデフォルトのソートが辞書式ではない場合(なぜ、JS、なぜ?)、最小値を見つけるために短くなります:

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

私は最小値を見つけるために再帰を試みましたが、ずっと長くなりました:

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

そして、これは最初は良いアイデアのように思えた文字列ベースのソリューションです:(入力は文字列の配列形式で与えられます、例えば"[1,2,3]"

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

a.find(n => n == Math.min(... a))を使用していますか?
ダウンゴート

私はないよ@Downgoatそれがインデックスではなく、アイテムを返すよう必ず私は、それを使用したいか
ETHproductions

ええ> _>おっと、私はあなた++を逃し、あなたが参照必要実現しなかった
Downgoat

7

Mathematica、70 57 55バイト

実質的にすべての改善は、パターンマッチングアプローチで私の尻を蹴るMartin Enderによるものです!また、JHMは本質的に同じソリューションを本質的に同時に思い付きました。(バイトカウントはASCIIエンコードを使用します)

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

±1つのリスト引数を取る関数を定義します。リストの引数に同じ要素のコピーがいくつか含まれている場合(によって検出されx_..、名前が付けられているp)、リストを1追加して出力します。それ以外の場合、そのリスト引数に、最大で他の要素の最小である特別な要素y(のxyz0個以上の要素があり、後にゼロ以上の要素があるy)がある場合、そのyインクリメントされたリストを出力します。リストの最小要素のインスタンスはに一致しますyが、幸いなことにMathematicaは動作する最初のものを選択します。


ので±2バイト文字で、あなたのコードは、59バイト長です。また、間にスペースが存在しなければならないx_..ためMathematicaの解釈x_..としてx_. .(エラーをスローします)。プラス、の中置形式Min(はx~Min~z)(私のものと同一で、この解決策になりた:P ...)この2バイト短縮になるだろう、私の編集は....あなたよりも後だったので、あなたが信用を取ることができWelpを
JungHwan分を

とにかく、マーティン・エンダーは私のクレジットの大部分を受け取ります。なぜ±2バイトなのですか?
グレッグマーティン

±UTF-8の@GregMartin (MathematicaはデフォルトでUTF-8を使用します; try $CharacterEncoding)は2バイト文字(U + 00B1)です。
ジョンファンミン

@JHM UTF-8は、Windowsのデフォルトの文字エンコーディングではありません。Mathematicaはを含むシングルバイトコードページのソースファイルを読むことができます±
マーティンエンダー

1
@ASimmonsたWindows上で私の新鮮なMathematicaのインストール、$CharacterEncodingに設定されWindowsANSIているが(のためにISO 8859-1と十分に互換性がありCP1252である±·シングルバイトのために使用できるように)。
マーティンエンダー

7

C ++ 14、178 176 174 155 142 135バイト

提出

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

呼び出し

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

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

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

食べない

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

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

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

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

    //invoke like this
    i(s);

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

ゴルフをするのはこれが初めてです。助けていただければ幸いです。

編集:少なくともそれをコンパイルする必要があることを忘れていました -std=c++11 -std=c++14

EDIT2:インクルードのスペースを省くことができることに気付きました #include <list>

EDIT3:に置き換えることl.begin()により、さらに2バイトを節約しましたbegin(l)

EDIT4:@Quentinのおかげでさらに19(!)バイト節約されました(彼のコメントを参照)

EDIT5:クエンティンはさらに13バイト削りました、ありがとう!

EDIT6:TuukkaXが指摘したように、名前のないラムダ/関数で十分なのでauto i=、バイトカウントの


5
私はC ++であなたを助けることはできませんが、私は言うことができます:PPCGへようこそ!
ズガルブ

1
#include行のスペースは必要ないと思います。
クリスチャンシーバーズ

ああ、ありがとう、私はちょうどそれを自分自身を実現:)
Neop

1
関数をラムダ(auto i=[](auto&l){...};)に置き換えると、1バイト節約されます(忘れた戻り値の型を数えるとさらに多くなります;))、オペランドの^ 代わりに使用し==、オペランドを交換すると別のバイトが節約されます。std::list「イテレータは確かにあるよstd::あなたがドロップすることができますので、クラスstd::の両方からstd::countstd::min_elementADL(-10)のおかげ。l.front()また*b(-7)です。最終的に120バイトになりますauto i=[](auto&l){auto e=end(l),b=begin(l);l.size()^count(b,e,*b)?void(++*find(b,e,*min_element(b,e))):l.push_back(1);};:)
クエンティン

1
私たちがそれをしている間、ドキュメントstd::min_element最初の最小要素を返す述べているので、これfind()は余分なものであり、11バイトです。条件式では、一対の括弧とコンマ演算子を使用して右の式を強制するint方が、左の式をvoid2バイトキャストするよりも短くなります。これによりauto i=[](auto&l){auto e=end(l),b=begin(l);l.size()^count(b,e,*b)?++*min_element(b,e):(l.push_back(1),0);};、142バイトになります:)
クエンティン

6

05AB1E21 20 16バイト

Adnanのおかげで4バイト節約されました。

DÙgi0¸«}ÐWksgÝQ+

オンラインでお試しください!

説明

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

それDÙgi0¸«}ÐWksgÝQ+もうまくいくと思います。
アドナン

@Adnan:ああ、いいアイデアが使用しÝQk。ありがとう!
エミグナ

5

スクラッチ、25 34ブロック+ 7 6バイト

プログラム

入力を事前定義された整数の配列として受け取ります。Scratchでは配列のインデックスは1であることに注意してください。

Pythonでは、これは次のようになります(Scratchとは異なり、Pythonは0インデックス付きです)

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

ゴルフのコメントをお願いします?
OldBunny2800

なぜfvalを宣言するのですか?
クリストフ

...スクラッチは色で、プレーンテキストでちょうどPythonのであるように私には見える
Stewieグリフィン

そして、1インデックス配列とelifステートメントはありません!
OldBunny2800

1
良い点は@クリストフ!それはゴルフを始めた以前のバージョンの一部でした。編集。
OldBunny2800

4

J、25 22バイト

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

匿名動詞に評価します。 オンラインでお試しください!

説明

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

3

MATL、16バイト

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

オンラインでお試しください!または、すべてのテストケースを確認します

使い方

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

3

Mathematica、56バイト

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

名前付き関数を使用します±。ISO8859-1エンコードを使用

代替ソリューション(58バイト)

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

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

使用法

±{1, 1}

{1, 1, 1}

±{3, 4, 5}

{4, 4, 5}


3

Haskell、71 70 62バイト

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

@Zgarbは8バイトを節約しました、ありがとう!

私が始めたとき、私はいくつかのエレガントな結び目トリックを期待していましたが、@ Zgarbの方法は同じくらい素晴らしいです。


一部の再構築、62バイト:f(a:b)|(x,y:z)<-span=<<(<).minimum$a:b++[0|all(a==)b]=x++y+1:z
Zgarb

@Zgarbただすごい!
クリスチャンシーバーズ

うーん、私の脳は関数のモナドインスタンスの型を推測できません
Angs

@Angs Monadは(->)r、型に適用され(->)r a = r->aます。その後、型return:: a->r->a(>>=)::(r->a)->(a->r->b)->(r->b)その実装から(私はそれを言うのですか?)明白です:return=constm>>=f = \r->f(m r)r。後者は、一度だけspan(predicate_depending_on l)l言及しながら、何かを表現するために必要なものですl。今、私はそれを必要なときにだけ覚える必要があります。
クリスチャンシーバーズ

@Angsこのトリックは、Haskellのゴルフのヒントコレクションで見つけることができます。
-Zgarb

3

C#、123 121 120 79 77バイト

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

関数に渡される引数を変更します。

3バイトを節約してくれたCyoceに感謝します!-> !Anyto All+=1to ++

なんと43バイトを節約してくれたTheLethalCoderに感謝します!->メソッド署名コードを削除しました。パラメータリストの括弧を削除しました。


に置き換え!l.Any(o=>o!=l[0]))てもらえますl.All(o=>o==l[0])か?
チョイス

@Cyoce確かにそうです。私は同じことを考えたが、Any代わりに書いAllて、それがうまくいかないと思っていた:Dありがとう!
Yytsi

2
C#にはないの++ですか?
チョイス

Action<List<int>>メソッドシグネチャコードをすべて削除するためにa にコンパイルできます
-TheLethalCoder

1
@Stefanうーん。また、多くの人が必要なusingsをC#で削除するのを見てきました。そのため、削除using System.Linqすることが合法であるとは信じていません。これが必要ではないという明示的な声明がない限り、私はこれに留まります。提案をありがとう!:)
Yytsi 16

2

Perl 6、46バイト

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

(入力配列を変更し、それを返します)

拡張:

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

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

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

    ??              # if they are equal

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

    !!              # else

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

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

  $_                # return the modified array
}


2

ゼリー、9バイト

;1µ‘i¦E?Ṃ

-2バイトのDennisに感謝します。

本文は少なくとも30文字でなければなりません。あなたは入りました ... 。


ボディに余分な文字を入力する場合は、コードを説明する価値があります。これにより、誰もが理解しやすくなり、答えがより面白くなります:)
Alfie Goodacre

2

Mathematica、53バイト57バイト 59バイト

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

7
57バイトです。およびは3バイト文字です。また、{##,1}一部は入力が個別の整数(つまりf[1, 2, 3])であるx=#ことを意味しますが、一部は入力がList(つまりf[{1, 2, 3}])であることを意味するため、コードは機能しません。簡単な修正は、入力として生の整数に変更x=#x={#}て受け入れ、コードを59バイト長にすることです。
ジョンファンミン

良いキャッチ!バイトと文字数の違いを理解していませんでしたが、この提案を見 、それが有効であると考えました。文字数を示す答えはたくさんあるようですが、Notepad ++で保存すると、バイト数が増えます(たとえば、ゼリーの答え)。あなたの答えはエンコードを指定していると思いますが、これについて学ぶためにあなたがお勧めする場所はありますか?
ngenisis

1
私はあなたが意味すると思うがEqual@##==##短いですが。
マーティンエンダー

あなたが正しい。リストではなく複数の引数を受け入れるように@JHMごとに変更を行いましたが、変更をどこにでも伝播しませんでした。リストの受け入れに戻ったのは、それがプロンプトに沿っているためです。
ngenisis

2

R72 66 65バイト

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

オンラインでお試しください!

を使用しwhich.minて増分が行われ、最初の一致が返されます。"[<-"値を置換し、変更されたベクトルを1つの関数呼び出しで返します。

ジュゼッペのおかげで-7バイト!



@Giuseppe私はisTRUEとisFALSEを試してsdでゴルファーではありません:(
JayCe

へっ、65バイト!=-!に置き換えます
ジュゼッペ

もちろんジュゼッペ!
JayCe

1

ルビー、46バイト

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

すべての要素がよりも同じであるかどうかを確認するより良い方法があるように感じますが、a.uniq.size<2見つけるのが面倒です。


6
a.uniq[1]明確な値がある場合は、真実になります。
-histocrat

あなたは回してバイトを保存することができますa[a.index(a.min)]a[a.index a.min]
Cyoce

1

オクターブ、69 67 64バイト

実際、これを完全な名前付き関数にする方が、inputとの両方を使用するよりも短いものでしたdisp

Luisのおかげで3バイト節約されました。

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

関数を使用しない古い答え:

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

1

R、97バイト

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

シンタックスx=+1がRに存在しないのは残念です!

アンゴルフド:

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バイト

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、8377、71バイト

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

私はゴルフをコーディングするのが比較的新しいので、親切にしてください!私は匿名関数を使用しようとしましたが、グーグルでは、if / elseステートメントを使用できず、matlabには三項演算子がないため、これができると感じました。

編集:stewie-griffinのおかげで修正および短縮(2回!)。


PPCGへようこそ!このコードにはいくつかの欠陥があります。sum(a)/length(a)==a(1)すべての要素が等しいことを保証するものではなく、平均がに等しいことを示すだけa(1)です。これを行うより簡単な方法は次のとおりですmean(a)==a(1)numelは1バイトよりも短いですlengthが、すべての値が正であることがわかっているため、nnzどちらを使用してもかまいません(このチャレンジでは正しい結果が得られませんが、少なくとも:Pが短くなります)。min(a)ループの前で呼び出しを行う場合、ループからの両方の出力を使用でき、チェックall要素はaに等しいmin(a)です。
スチューウィーグリフィン

あなたが正しいです!平均が最初の要素の数と等しい場合、失敗します。私は新しいものが正しいと思うし、短くなっていると思う。ロジックは、残りの要素が最初の要素と等しくない場合、a(a〜= a(1))は、同じ配列では定義上0より大きい残りの要素を返します。その後、カウントし、正しいロジックを与えるべきではないと思う。まだ間違っている場合はお知らせください。私はコーディングを数年しかしておらず、まだ長い道のりが残っています。
オーウェンモーガン

~nnz(a(a~=a(1)))は単純~nnz(a-a(1))です。また、括弧は必要ありません。if ~nnz(a-a(1));a=[a,1];else[~,I]=min(a);a(I)=a(I)+1;end。これは5バイト短くする必要があります(注:テストしていません)。
スチューウィーグリフィン

あなたは、使用して3つのバイトを保存することができますrange(a)代わりにnnz(a-a(1))
MattWH

@boboquack、そのコードは、要素の数がaそのベクトルの最小値に等しいかどうかをチェックします。ベクトルa = [3 4 6]trueになり、ベクトルa = [4 4 6]はになりfalseます。ここでは役に立たないと思います...?
スチューウィーグリフィン

1

Clojureは、112の 100バイト

残念ながらmin-key、最初のインデックスではなく、最小のインデックスの最後のインデックスを返します。これは、整数入力と10 ^ 9要素より短い配列で機能します;)

編集:の(apply = a)代わりにを使用して、匿名関数を定義し(= 1(count(set a)))ます。

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

元の:

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

あまりハッキングされていない134バイトのソリューションは、ベクトルを更新する前に反転し、その後再び元に戻します。

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

1

Java 8、85 + 38 = 123バイト

無効なラムダList<Integer>(出力は変更された入力です)バイト数には、ラムダと必要なインポートが含まれます。

import static java.util.Collections.*;

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

オンラインで試す

これは、これらのメソッドインポートを使用したPythonのように見えます...


1

MATLAB、66 53バイト

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

出力:

初期化:

a = [3 2]

連続実行:

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

2
入力をハードコーディングすることはできません@(x) …。次のようなことをする必要があります。
ბიმო

1

SmileBASIC 3、101バイト

文関数定義番号の私達の整数配列です。出力は、入力を変更することで実現されます(配列は参照です)。I AA

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

あなたは置き換えることによって、2つのバイトを保存することができBREAKM=0いるので、A含めることはできません0ので、M==A[C]本当のことはありません。
12Me21

1

SmileBASIC、77バイト

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バイト

?tl{QXxQhSQQ1+Q1

リストの入力を受け取り、結果を出力するプログラム。

テストスイート

使い方

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

0

Haskell、93バイト

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

ゴルフをしていない:

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

最初の試みは、後でより洗練されたものを思い付こうとします。


1
使用する代わりに別の関数を作成してみませんwhereか?
マイケルクライン

0

ワンダー、44バイト

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

これは、この言語を作成したときに私が念頭に置いていたものではありません...読みやすさの点では、Perlよりも文字通り悪いです!

使用法:

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

説明

より読みやすい:

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

基本的に、引数の一意のサブセットから1アイテムをドロップするとリストが空になるかどうかをチェックします。そうでない場合は、配列の最小値を増やします。それ以外の場合は、単に引数に1を連結します。


0

Kotlin、75バイト

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

関数の引数を変更します。

強いタイピングをくそー!:MutableList<Int>17バイトのみを占めます。残念ながら、型を推測できる解決策はないと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.