合計スロットの計算


17

順番に実行する必要があるジョブのリストが与えられ、それぞれが実行するスロットを使用して、ジョブを実行した後、次の2つのスロットで同じジョブを実行できない場合(スロットの冷却) )?ただし、このクーリングオフスロットには別のジョブを割り当てることができます。

例えば、

[9,10,9,8] => output: 5

ジョブはとして割り当てられるため[9 10 _ 9 8]です。
1.まず、9には2つの冷却スポットが必要です_ _。だから私たちは始め9 _ _ます。
2.次のジョブ10は前のジョブ9とは異なるため、_ _の1つを割り当てることができます。その後、我々は持ってい9 10 _ます。
3.第三に、最初のジョブ9は同じジョブであり、冷却時間を必要とするため、9は現在割り当てられません。9 10 _ 9
4.最後に、8は以前の2つのジョブと同じではないため、9の直後に割り当てることができ、これは最後のジョブであるため、冷却時間を必要としません。最終的なリストは9 10 _ 9 85で、予想される出力はスポット数(またはスロット数)です。

テストケース:

[1,2,3,4,5,6,7,8,9,10] => output : 10 ([1 2 3 4 5 6 7 8 9 10])
[1,1,1] => output: 7 ([1 _ _ 1 _ _ 1])
[3,4,4,3] => output: 6 ([3 4 _ _ 4 3])
[3,4,5,3] => output: 4 ([3 4 5 3])
[3,4,3,4] => output : 5 ([3 4 _ 3 4])
[3,3,4,4] => output : 8 ([3 _ _ 3 4 _ _ 4])
[3,3,4,3] => output : 7 ([3 _ _ 3 4 _ 3])
[3,2,1,3,-4] => output : 5 ([3 2 1 3 -4])
[] => output : 0 ([])
[-1,-1] => output : 4 ([-1 _ _ -1])

入力値には任意の整数(負、0、正)を指定できます。ジョブリストの長さは0 <=長さ<= 1,000,000です。
出力は、テストケースで出力として示される整数(スロットの総数)になります。括弧内のリストは、出力の生成方法です。

受賞基準


0の代わりに何も出力しなくても大丈夫[]ですか?
wastl

8
答えを受け入れるのは少し早いですか?
ニックケネディ

7
@NickKennedyが言ったように、それは解決策を受け入れるにはあまりにも早すぎます。解決策を受け入れないことを推奨する人もいます。
シャギー

回答:



5

05AB1E、22 バイト

v¯R¬yQiõˆ}2£yåiˆ}yˆ}¯g

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

v           # Loop over the integers `y` of the (implicit) input-list:
 ¯R         #  Push the global_array, and reverse it
   ¬        #  Get the first item (without popping the reversed global_array itself)
    yQi  }  #  If it's equal to the integer `y`:
       õˆ   #   Add an empty string to the global_array
   2£       #  Then only leave the first 2 items of the reversed global_array
     yåi }  #  If the integer `y` is in these first 2 items:
        ˆ   #   Add the (implicit) input-list to the global_array
 yˆ         #  And push the integer `y` itself to the global_array
g         # After the loop: push the global array, and then pop and push its length
            # (which is output implicitly as result)

グローバルエリアとは何ですか?プログラムの開始時に空ですか?
無知の具現化

@EmbodimentofIgnoranceはい、それは何かを追加したり、プッシュしたり、クリアしたりできる単一の配列です。そして、それは確かに最初は空から始まります。
ケビンクルーッセン

3

Brachylog、10バイト

Brachylogが最高のパフォーマンスを発揮する問題を見るのはいつでもいいことです

⊆Is₃ᶠ≠ᵐ∧Il

説明

⊆I           # Find the minimal ordered superset of the input (and store in I) where:
   s₃ᶠ       #     each substring of length 3
      ≠ᵐ     #     has only distinct numbers
        ∧Il  # and output the length of that superset

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


2

R、123バイト

`-`=nchar;x=scan(,'');while(x!=(y=gsub("([^,]+),(([^,]*,){0,1})\\1(,|$)","\\1,\\2,\\1\\4",x)))x=y;-gsub("[^,]","",y)+(-y>1)

オンラインで試す-単一プログラム!

オンラインで試す-複数の例!

整数のコンマ区切りリストを入力として読み取り、必要なスロットを出力する完全なプログラム。私はこれがもう少しゴルフできると確信しており、この正規表現ベースのソリューションを他のいくつかの言語で実装するとバイト単位でより効率的になるでしょう。

2番目のTIOに注意して、複数の例を表示できるように関数でラップしました。この関数は最終リストも表示しますが、単独で実行するとメインプログラムに出力されません。


2

TSQLクエリ、158バイト

テーブルとして入力データ。

クエリは再帰的ですので

OPTION(MAXRECURSION 0)

必要なのは、32,767回の再帰しか処理できないにもかかわらず、数値のリストが100を超えることができるためです。このタスクで本当に必要な制限はありますか?

DECLARE @ table(a int, r int identity(1,1))
INSERT @ VALUES(3),(3),(4),(4);

WITH k as(SELECT null b,null c,1p
UNION ALL
SELECT iif(a in(b,c),null,a),b,p+iif(a in(b,c),0,1)FROM @,k
WHERE p=r)SELECT sum(1)-1FROM k
OPTION(MAXRECURSION 0) 

オンラインで試す


2

R81 70バイト

sum(l<-rle(s<-scan())$l*3-3,1-l%/%6,((r=rle(diff(s,2)))$l+1)%/%2*!r$v)

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

何度か失敗した後、コードはかなりugくなり、それほど短くはありませんでしたが、少なくとも今は動作しています...

最初に、同じジョブの連続した実行の長さを評価します。例えば、3, 3, 4, 3これは以下を提供します:

Run Length Encoding
  lengths: int [1:3] 2 1 1
  values : num [1:3] 3 4 3

これらの各実行は(len - 1) * 3 + 1ステップを生成します(+ 1個別に処理されます)。

次に、を使用して、同じジョブが2箇所離れて発生するように処理x, y, xdiff(s, lag=2)ます。結果のベクトルもrrle機能ごとに連続した実行()に分割されます。現在、さまざまなインターリーブされた交替のためceiling(r$len/2)、ゼロのすべての実行に対してステップを追加する必要があります。例えば:

x y x(長さ1)とx y x y(長さ2)の両方に1つの追加ステップが必要です。x y _ x (y)

x y x y x(長さ3)とx y x y x y(長さ4)の両方に2つの追加ステップが必要です。x y _ x y _ x (y)

最後に、我々は同じジョブの長期の途中でこれらの交番の発生を補償する必要がありますx, x, x, x...、したがって、1-l%/%6代わりに単に1


私は、diff(s,lag=2)近接を検出するために使用することについてコメントしている最中です!今、あなたは...私の解決策よりもバイト短いです
ジュゼッペ・

ええ、まだあきらめていません:)今、いくつかの括弧を取り除こうとしています...
キリルL.

2

Python 2、67バイト

r=[]
for x in input():
 while x in r[-2:]:r+=r,
 r+=x,
print len(r)

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

チャレンジを文字通り実装します。リスト自体のコピーを「空白」として使用します。これらは任意の数に等しくできないためです。


2

木炭27 23バイト

Fθ«W№✂υ±²¦¦¦ι⊞υω⊞υι»ILυ

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

Fθ«

ジョブをループします。

W№✂υ±²¦¦¦ι⊞υω

ジョブが結果の最後の2つのうちの1つである間に、冷却スポットを追加します。

⊞υι»

現在のジョブを結果に追加します。

ILυ

スポットの数を印刷します。


2

R74 68バイト

length(Reduce(function(x,y)c(y,rep("",match(y,x[2:1],0)),x),scan()))

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

作業配列を(逆に)構築し、長さを取ります。キリルLの答えよりも少し短いので、時々、素朴なアプローチがかなり良いです。編集:再び短く!キリルのテストテンプレートも借りました。

-6置換バイト max(0,which(y==x[2:1])) match(y,x,0)


@Giuspeppe c関数は何をしますか?
無知の具体化

@EmbodimentofIgnorance-のc略ですがcombineconcatenateより良いかもしれません。引数を1つのリスト
ジュゼッペ

おかげで、ゴルフ用に設計されていない言語に1文字の機能があるのは奇妙だと思った
無知の具体化

1

Perl 6、98バイト

{($!=$,|$_ Z$_ Z .[1..*+1])>>.repeated.squish(:with({$+^=[*] $! ne$^a ne$^b,$b==($!=$a)})).sum+$_}

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

ブラー、これを行うにはもっと良い方法がなければならない。私が考えることができるすべてのエッジケースを通過しますが、私はこれが完全に正しいと100%確信していません。

基本的に、これは、入力リストのすべてのトリプレットをグループ化し、両側にパディングすることから始まります。たとえば、に[1,2,1,2]なり(Any,1,2), (1,2,1), (2,1,2), (1,2,Nil)ます。repeated各トリプレットの要素を取得し、になり(), (1), (2), ()ます。

次にsquish、同じリストではないが同じサイズの連続した要素を(esのようなものを押しつぶさないために)es [1,1,1]し、最初の要素がその前の要素と等しくない(時間をにマージできないため[1,1,2,2])最後に、前の要素も潰されていません([1,2,1,2,1,2])。したがって(1), (2)、上記の例では一緒に押しつぶされます。

最後に、sum挿入された時間を表すこのリストのすべての長さを取得し、元のリストの長さを追加します。

例えば:

(1,1,1) => (Any,1,1),(1,1,1),(1,1,Nil) => (1),(1,1),(1) => (no squishes) => 4+3 = 7
(1,2,1,2,1,2) => (Any,1,2), (1,2,1), (2,1,2), (1,2,1), (2,1,2), (1,2,Nil) => (),(1),(2),(1),(2),() => squish (1),(2) and (1),(2) => 2+6 = 8

1

JavaScript(ES6)、57バイト

f=([x,...a],p,q)=>1/x?1+f(x!=p&x!=q?a:[x,...a,x=f],x,p):0

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

コメント済み

f = (             // f is a recursive function taking:
  [x,             //   x   = next job
      ...a],      //   a[] = array of remaining jobs
  p,              //   p   = previous job, initially undefined
  q               //   q   = penultimate job, initially undefined
) =>              //
  1 / x ?         // if x is defined and numeric:
    1 +           //   add 1 to the grand total
    f(            //   and do a recursive call to f:
      x != p &    //     if x is different from the previous job
      x != q ?    //     and different from the penultimate job:
        a         //       just pass the remaining jobs
      :           //     else:
        [ x,      //       pass x, which can't be assigned yet
          ...a,   //       pass the remaining jobs
          x = f   //       set x to a non-numeric value
        ],        //
      x,          //     previous job = x
      p           //     penultimate job = previous job
    )             //   end of recursive call
  :               // else:
    0             //   stop recursion

1

C(gcc)、69バイト

f(j,l)int*j;{j=l>1?(*j-*++j?j[-1]==j[l>2]?j++,l--,3:1:3)+f(j,l-1):l;}

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

簡単な再帰。

f(j,l)int*j;{               //Jobs, (array) Length
    j=l>1                   //if l > 1, do a recursion:
        ? (*j-*++j          // check if first and second elements are equal (j++)
            ? j[-1]==       //  1st!=2nd; check if first and third are equal
                j[l>2]      //  (first and second if l==2, but we already know 1st!=2nd)
                ? j++,l--,3 //   1st==3rd (j++,l--) return 3+f(j+2,l-2)
                : 1         //   1st!=3rd (or l==2) return 1+f(j+1,l-1)
            : 3             //  1st==2nd            return 3+f(j+1,l-1)
          )+f(j,l-1)        // j and l were modified as needed
        : l;                // nothing more needed  return l
}


1

Smalltalk、125バイト

c:=0.n:=q size.1to:n-2do:[:i|(j:=q at:i)=(k:=q at:i+1)ifTrue:[c:=c+2].j=(m:=q at:i+2)ifTrue:[c:=c+1]].k=m ifTrue:[c:=c+1].c+n

説明

c : accumulator of proximity penalty
q : input array.
n := q length
i : iteration index from 1 to: n-2 (arrays are 1-based in Smalltalk).
j := memory for element i, saves some few bytes when reused
k := similar to j but for i+1.
m := similar to k but for i+2.

これはスニペットではありませんか?
attinat


0

バッチ、184バイト

@echo off
@set l=-
@set p=-
@set n=0
@for %%j in (%*)do @call:c %%j
@exit/b%n%
:c
@if %1==%l% (set l=-&set/an+=2)else if %1==%p% set l=-&set/an+=1
@set p=%l%&set l=%1&set/an+=1

入力はコマンドライン引数を介して行われ、出力は終了コードを介して行われます。説明:

@set l=-
@set p=-

最後の2つのジョブを追跡します。

@set n=0

カウントを初期化します。

@for %%j in (%*)do @call:c %%j

各ジョブを処理します。

@exit/b%n%

最終カウントを出力します。

:c

各ジョブについて:

@if %1==%l% (set l=-&set/an+=2)else if %1==%p% set l=-&set/an+=1

最近ジョブを処理した場合、適切な数の冷却スポットを追加します。さらに、最後のジョブをクリアして、次のジョブがこのジョブと同じ場合にのみ冷却をトリガーするようにします。

@set p=%l%&set l=%1&set/an+=1

最後の2つのジョブを更新し、このジョブにスポットを割り当てます。


0

Swift、114バイト

func t(a:[Int]){
var s=1
for i in 1...a.count-1{s = a[i-1]==a[i] ? s+3:i>1&&a[i-2]==a[i] ? s+2:s+1}
print("\(s)")}

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


2
以下のために失敗した3,4,3,45、6ない賭けるべきで、
キリルL.

xyxy修正に加えて@KirillL。注意してください、s = aすることがs=aできs+=、複数の代わりに行うことができ、9バイトを節約するために:のs=s+...後にスペースを削除します。?for i in 1...a.count-1{s+=a[i-1]==a[i] ?3:i>1&&a[i-2]==a[i] ?2:1}
ダニエル・ウィディス

0

Pythonの379の 75バイト

mypetlionのおかげで-3バイトサラ
Jのおかげで-1バイト

f=lambda a,b=[]:a and f(*[a[1:],a,a[:1]+b,[b]+b][a[0]in b[:2]::2])or len(b)

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


1
a[0]in b[:2]and f(a,['']+b)or f(a[1:],[a[0]]+b)f(*[a[1:],a,[a[0]]+b,['']+b][a[0]in b[:2]::2])2バイトを節約できるようになります。
mypetlion

1
[a[0]]+ba[:1]+b1バイト節約できるようになります。
mypetlion

1
で置き換える['']+b[b]+bバイトが節約されます- bリストであるため、次の値のいずれにも等しくなることはありませんa
Sara J

0

Java(JDK)、110バイト

j->{int p,q;for(p=q=j.length;p-->1;q+=j[p]==j[p-1]?2:(p>1&&j[p]==j[p-2]&(p<3||j[p-1]!=j[p-3]))?1:0);return q;}

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

コメントされていないコード:

j -> {
    int p, q = j.length; // Run all jobs
    for (p = q; p-- > 1;) { // reverse iterate
        q += j[p] == j[p - 1] ? 2 : // add 2 if prev same
        (p > 1 && j[p] == j[p - 2] & // 1 if 2prev same
        (p < 3 || j[p - 1] != j[p - 3]) // except already done
        ) ? 1 : 0; // otherwise 0
    }
    return q;
}

以下のために動作しません3,4,3,4,3,48の代わりに戻り、7
無知の実施の形態

これは邪悪な小さな問題です。
ダニエル・ウィディス

0

ゼリー、20バイト

ṫ-i⁹⁶x;
⁶;ç³Ṫ¤¥¥³¿L’

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

これは@EriktheOutgolferの短い回答にかなり似ていますが、私は彼を見ずに書きました。いずれにせよ、彼は優れています!

説明

ヘルパーダイアディックリンク。現在のリストを左のアイテム、次のアイテムを右のアイテムとします。

ṫ-            | take the last two items in the list
  i⁹          | find the index of the new item
    ⁶x        | that many space characters
      ;       | prepend to new item

メインの単項リンク、入力として整数のリストを受け取ります

⁶             | start with a single space
 ;            | append...
  ç³Ṫ¤¥       | the helper link called with the current list
              | as left item and the next input item as right
       ¥³¿    | loop the last two as a dyad until the input is empty
          L   | take the length
           ’  | subtract one for the original space




0

JavaScript(V8)、101バイト

f=a=>for(var c=0,i=0;i<a.length;i++,c++)a[i-1]==a[i]?c+=2:a[i-2]==a[i]&&(c++,a[i-1]=void 0)
return c}

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

解凍されたコードは次のようになります。

function f(a)
{
    var c = 0;
    for (var i = 0; i < a.length; i++, c++)
    {
        if (a[i - 1] == a[i])
            c+=2;
        else if (a[i - 2] == a[i])
            c++,a[i-1]=undefined;
    }

    return c;
}

私の初めてのコードゴルフの試みは、おそらく配列を縮小して再帰的に渡すことで、多くの場合最適化できます。


PPCGへようこそ!これは非常に素晴らしい最初の投稿です!
Rɪᴋᴇʀ

0

Zsh66 60バイト

暗黙から-6バイト "$@"

for j
{((i=$a[(I)$j]))&&a=
a=("$a[-1]" $j)
((x+=i+1))}
<<<$x

オンラインでお試しください!set -xあなたがフォローできるように、スタートに追加することを強くお勧めします。

for j                   # Implicit "$@"
{                       # Use '{' '}' instead of 'do' 'done'
    (( i=$a[(I)$j] )) \ # (see below)
        && a=           # if the previous returned true, empty a
    a=( "$a[-1]" $j )   # set the array to its last element and the new job
    (( x += i + 1 ))    # add number of slots we advanced
}
<<<$x                   # echo back our total
((i=$a[(I)$j]))
    $a[     ]           # Array lookup
       (I)$j            # Get highest index matched by $j, or 0 if not found
  i=                    # Set to i
((           ))         # If i was set nonzero, return true

aには最後の2つのジョブが常に含まれているため、ルックアップがで一致するジョブを見つけると、a[2]3ずつ増加します(ジョブスロットがになるため[... 3 _ _ 3 ...])。

aが設定されていない場合、検索は失敗し、算術展開はエラーを返しますが、それは最初のジョブでのみ発生し、致命的ではありません。

$[x+=i+1]代わりに使用する場合、もう1バイト節約できます。ユーザーシステムには完全に数字で構成されるコマンドはありません。


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