短い真実を偽造する


28

ブール値のリストでtrueの最長実行を見つけます。他のすべての真偽を偽造して、同じリストを返します。

入出力

リスト; 通常の形式(たとえば、文字列として区切られたリスト)。

詳細

真と偽は、言語がこれらの値に通常使用するもの、または整数1と0です。単一の文字を使用する場合、リストは連結(例:)にすることができます10001

最長の実行に同点がある場合は、すべての同点の実行を真に保ち、すべての短い実行を偽造します。

input ↦ output
1,0,1,0,1 ↦ 1,0,1,0,1
1,1,0,1,1,0,1 ↦ 1,1,0,1,1,0,0
1,1,0,1,1,1,0,1,1 ↦ 0,0,0,1,1,1,0,0,0
1,1,1 ↦ 1,1,1
0,0,1 ↦ 0,0,1
0,0 ↦ 0,0
1,1,1,0,0,0,1,1,1,1,0,1,0,0,1,1,0,1,1,1,1,0,0,1,0 ↦ 0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0

https://stackoverflow.com/q/37447114から直接)

回答:


19

ゼリー、8 バイト

ṣ0¬¬M¦j0

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

使い方

ṣ0¬¬M¦j0  Main link. Argument: A (list of Booleans)

ṣ0        Split at zeroes. This leaves a 2D list of ones.
  ¬       Negate each 1, replacing it with 0.
     ¦    Conditional application:
    M       Yield all maximal indices.
            In lexicographical list comparison, a shorter list of zeroes is less
            than a longer one, so this identifies the longest runs.
   ¬        Negate the items in those lists, changing zeroes back to ones.
      j0  Join, separating by single zeroes.

23
Jeez ...この言語...
AdmBorkBork

11

ハスケル、595855、64のバイト

import Data.List
((=<<)=<<(=<<)(<$).(==).maximum.([1<2]:)).group

おもしろいことに、これはの値のリストで機能しますfalsy < truthy。ですからFalse/True0/1'f'/'t'、など

注意:

何人かの人が指摘したように(を含む@proud haskeller@nimi)、以前のバージョンでは、すべてのfalsy値のリストに失敗しました。の.([1<2]:)提案により、の追加によりこれが修正されました@proud haskeller。私はそれがまだ理にかなっていると思うので、私は今のところ説明を同じままにします。誰かがコメントして、編集の説明を求めたら、編集します。

説明:

最初にを使用せずに砂糖を削除してgroupから、追加し直します。まず、目には言葉が記号よりも簡単であることが多いため、いくつかの置換を行います。(これ=<<は「上品」であるため、リストと関数に異なる方法で適用されます。関数bindのバージョンを呼び出してい=<<ます。)

bind :: (a -> b -> c) -> (b -> a) -> b -> c
bind k f = k =<< f
bind k f = \ r -> k (f r) r

f = ((=<<)=<<(=<<)(<$).(==).maximum)
f = ((bind) concatMap (bind)(<$).equals.maximum)
f = (bind concatMap (bind (<$) . equals . maximum))
f = bind concatMap ((bind (<$)) . equals . maximum))
f = bind concatMap ((\f r -> (<$) (f r) r) . equals . maximum))
f = bind concatMap ((\f r -> (f r) <$ r) . equals . maximum)
f = bind concatMap ((\g r -> (g r) <$ r) . equals . maximum)
f = (\h r -> concatMap (h r) r) ((\g r -> (g r) <$ r) . equals . maximum)
f = \r -> concatMap (((\g r -> (g r) <$ r) . equals . maximum) r) r
f = \r -> concatMap (((\g r -> (g r) <$ r) . equals) (maximum r)) r
f = \r -> concatMap (((\g s -> (g s) <$ s)) (equals (maximum r))) r
f = \r -> concatMap (((\s -> ((equals (maximum r)) s) <$ s))) r
f = \r -> concatMap (\s -> (s == (maximum r)) <$ s) r

f . group = ((=<<)=<<(=<<)(<$).(==).maximum).group
f . group = \r -> concatMap (\s -> (s == (maximum (group r))) <$ s) (group r)

最後の細部はそれがあるx <$ listのすべての要素置き換えるlistとをxし、group list分割list等しい要素の塊にアップ。だからgroup [1, 1, 2, 3, 3, 3] == [[1, 1], [2], [3, 3, 3]]

すべてをまとめると、この関数は値のリストをtrueのみのグループとfalseのみのグループに分割します。次に、各グループについて、各要素をステートメントの結果に置き換えthis is the biggest group(の最大のグループがtrue最大になります)、グループを連結します。

によって保存された4バイト @Zgarb


1
私はあなたが交換することができると思います(\y->(maximum g==y)<$y)((<$)=<<(==maximum g))。まだテストしていません。
-Zgarb

@Zgarbインスタンス宣言からそれを解決しましたが、動作します。ありがとう。
マイケルクライン

3
さらに良い:の定義全体を無点f関数で置き換えます((=<<)=<<(=<<)(<$).(==).maximum).group。3バイトを節約し、まったく読めません!
ズガルブ

@Zgarb:クール!その時点で、b=(=<<);b b(b(<$).(==).maximum).groupまだ1バイト短くなっています。Haskellゴルフでこれまで見たことがありません:)
リン

1
私は間違っていない場合は、挿入して、それを修正することができ(:[t])、最大または類似のものの前に
誇りhaskeller

6

網膜、 47 43 36

0
!
T`p`0`\b(1+)\b(?<=(?=.*1\1).*)|!

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

4バイトのゴルフをしてくれたmsh210に感謝します!

7バイトのMartinにも感謝します!

説明:

0
!

すべて0のsを!sに置き換えます。これは、のマッチンググループにするために行われている1ように、今、sが短くなる1!と、!1ワード境界(持っています\bまた、いずれかの開始または文字列の末尾にマッチし、それらの間に)、。

T`p`0`

これは、入力にバックティックの後に正規表現を適用した後、すべての一致ですべての印刷可能なアスキー文字を文字に変換することを示す構成オプション0です。

\b(1+)\b(?<=(?=.*1\1).*)|!

この正規表現1は、ゼロで囲まれたsのグループに一致しますが1、文字列内の任意の場所に続くそれ自体に一致することはできません。これらは、改ざんされる非最大グループです。さらに、これは、sに!戻すために追加した文字とも一致し0ます。


5

MATL、14バイト

Y'yy*X>y=b*wY"

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

すべてのテストケースを含む修正版

説明

        % Implicitly grab the input as an array
Y'      % Perform run-length encoding of the input. Yields an array of values and an array
        % of run-lengths
yy      % Copy these outputs
*       % Multiply the values (booleans) by the run-lengths. This will zero-out all
        % zero-valued runs so we don't consider them when computing the longest run.
X>      % Compute the longest run of 1's
y       % Copy the run lengths vector
=       % Determine which runs are the same length as the longest run of ones
b*      % Bubble-up the values from the run-length encoding and multiply element-wise
        % With this boolean. This substitutes all 1's that are not in the longest run
        % of ones with 0's
w       % Flip the run-lengths and values on the stack
Y"      % Perform run-length decoding using these substituted values
        % Implicitly display the resulting boolean

4

Python 2、62バイト

lambda s:'0'.join(`1-(t+'1'in s)`*len(t)for t in s.split('0'))

Ideoneでテストします。

使い方

s.split('0')入力文字列sをゼロ以上の1の実行に分割します

実行tごとに、t+'1'sの部分文字列かどうかを確認します。

  • それがある場合は、実行が最大ではない、t+'1'in s返す真を1-(t+'1'in s)リターン1 -真= 0とランはランに置き換えられます0の同じ長さの。

  • そうでない場合、実行は最大であり、t+'1'in sリターンはFalse1-(t+'1'in s)リターン偽= 1 - 1とランはランで置き換えられ1自体によって、の同じ長さの、すなわち。

最後に、'0'.join削除されたすべての0を復元します。


3

J、25バイト

[:(}.=>./)@;0<@(*#);.1@,]

これは、0-1配列を受け取って返す単項動詞です。次のように使用します。

   f =: [:(}.=>./)@;0<@(*#);.1@,]
   f 1 1 0 1 1 1 0 1 1
0 0 0 1 1 1 0 0 0

説明

[:(}.=>./)@;0<@(*#);.1@,]  Input is y.
            0          ,]  Prepend 0 to y, and
                   ;.1@    cut the result along occurrences of 0,
                           so that each piece begins with a 0.
               (*#)        Multiply each piece element-wise by its length,
             <@            and put it in a box.
                           Without the boxing, the pieces would go in a 0-padded array.
           ;               Join the pieces back together.
                           Now all runs of 1 have been replaced by runs of (1+length of run).
[:(      )@                Apply verb in parentheses:
   }.                        remove the prepended 0,
     =                       form the 0-1 array of equality with
      >./                    the maximum value.

カットの素敵な使用;.
マイル

3

Pyth、26 24 23 21バイト

M,G&HGJrgMrQ8 9qReSJJ

テストスイート。

  • 1/0またはtrue/falseで使用します。
  • true/false出力で使用します。

説明

M,G&HGJrgMrQ8 9qReSJJ

           Q      input
          r 8     run-length encode
        gM        convert each run of 1 to their length
                  for example: [1,1,1,0,1,1] will be
                  converted to [3,3,3,0,2,2]
                  in the run-length encoded version
                  [1,1,1,0,1,1] will be [[3,1],[1,0],[2,1]]
                  [3,3,3,0,2,2] will be [[3,3],[1,0],[2,2]]
                  therefore basically [G,H] becomes [G,H and G]
                  which is what the code below does:
M,G&HG            def g(G,H): return [G,H and G]
       r      9   run-length decode
      J           store to J

               qReSJJ

                R   J   in each element of J
               q eSJ    check if equal to maximum of J

前の23バイト

M,G&HGJrgMrQ8 9msqdeSJJ

テストスイート。

  • 1/0またはtrue/falseで使用します。
  • 1/0出力で使用します。

前の24バイト

Jrm,hd&edhdrQ8 9msqdeSJJ

テストスイート。

  • 1/0またはtrue/falseで使用します。
  • 1/0出力で使用します。

前の26バイト

rm?nhdeS.u&YhNQ0,hd0drQ8 9

テストスイート。

  • 1/0またはtrue/falseで使用します。
  • 1/0出力で使用します。

単一の場所でのみ呼び出される関数を作成することは、ほとんどの場合間違いです。たとえば、次のように置き換えることができます:Jr.b,N&YNrQ8)9qReSJJまたはJrm,hd*FdrQ8 9qReSJJ。どちらのバージョンも1バイトを節約します。または、さらにクレイジーにJrXR1*FdrQ8 9qReSJJなり、2つ保存します。;-)
ジャクベ

2

OracleのSQL 12.1、137の 135バイト

SELECT REPLACE(REPLACE(REPLACE(:1,m,2),1,0),2,m)FROM(SELECT MAX(TRIM(COLUMN_VALUE))m FROM XMLTABLE(('"'||REPLACE(:1,0,'",0,"')||'"')));

ゴルフをしていない

-- Replace the max value with 2
-- Then replace every 1 with 0
-- Then replace 2 with the max value
SELECT REPLACE(REPLACE(REPLACE(:1,m,2),1,0),2,m)
FROM   ( -- Split on 0 and keep the max value
         SELECT MAX(TRIM(COLUMN_VALUE))m 
         FROM XMLTABLE(('"'||REPLACE(:1,'0','",0,"')||'"'))
       );

入力には単一の文字を使用します。例:「1100111」


2

Mathematica46 41

1-Join@@Sign[1~Max~#-#]&[#*Tr/@#]&@*Split

0およびのリストで動作し1ます。私は他の答えを見るまでかなりうまくやったと思いました!


46文字バージョンの説明。さらに改善できない場合は更新します。

このコードの説明が要求されました。
(バージョン10の演算子フォームを使用した)非コードゴルフの同等物は次のとおりです。

RightComposition[
  Split,
  Map[# Tr@# &],
  # - Max[1, #] &,
  UnitStep,
  Apply[Join]
]

これは、上から下に順番に適用される5つのステップ(サブ機能)で構成される機能を意味します。

  • Split:同一の要素の実行に分割します:{1,1,0,1,1,0,1}↦{{1,1}、{0}、{1,1}、{0,0}}

  • Map[# Tr@# &]:各サブリスト(Map)に対して#、その合計(ベクトルトレース、Tr)で乗算()します:{1,1}↦{2、2}

  • # - Max[1, #] &すべての要素から、リストのリストのどこかに現れる最大値、またはいずれか大きい方を引きます。(1つはすべてゼロのケースを処理します。)

  • UnitStep:x <0の場合は0、x> = 0の場合は1に等しく、すべての要素に適用されます。

  • Apply[Join]:サブリストを単一のリストに結合します。FlattenまたはCatenateで行うこともできますが、短い形式でJoin@@は簡潔です。


2

C、135 129バイト

オンラインで試す

m,c,i,d,j;f(int*l,int s){while(i<s)c=l[i++]?c+1:0,m=c>m?c:m;while(j<s)if(l[j++])d=d+1;else if(d<m)while(d)l[j-1-d--]=0;else d=0;}

非ゴルフ

m,c,i;
f(int*l,int s)
{
    // obtain max
    while(i<s)
        c = l[i++] ? c+1 : 0,
        m = c>m ? c : m;

    c=0,i=0;

    // remove smaller segments
    while(i<s)
        if(l[i++]) c=c+1;
        else if(c<m) while(c) l[(i-1)-c--]=0;
        else c=0;
}

1

JavaScript(ES6)、56バイト

s=>s.replace(/1+/g,t=>t.replace(/1/g,+!~s.indexOf(t+1)))

1のすべての実行をチェックし、文字列を検索して1のより長い実行を測定することで測定した場合、実行が(等しく)最長でない限り、文字を0に置き換えます。

以前の72バイトの再帰的ソリューション:

f=s=>/11/.test(s)?f(s.replace(/1(1*)/g,"0$1")).replace(/0(1+)/g,"1$1"):s

1の実行がない場合(つまり、1を1つしか実行しない場合)は何もしません。それ以外の場合は、1それぞれ1またはその実行から1 を減算し、短い実行で再帰的にそれ自体を呼び出し、次に1(現在は最長の)実行で1を追加します。再帰呼び出しの数は、最長実行の長さよりも1つ少なくなります。


「1のすべての実行において、現在の実行よりも1長い1の実行が存在する場合、各1を0に置き換えます。それ以外の場合は0に置き換えます。」ブリリアント!
パトリックロバーツ

1

ジュリア、51バイト

s->replace(s,r"1+",t->map(c->c-contains(s,"1"t),t))

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

使い方

replace正規表現を介して入力文字列sで1つ以上の1のすべての実行を検索し、置換文字列を決定するためにラムダを呼び出します。r"1+"t->map(c->c-contains(s,"1"t),t)

ラムダはc->c-contains(s,"1"t)、1 tの実行中のすべての文字にマップします。

  • 場合"1"t(連結)は、のサブストリングであるS、ランは、最大ではない、contains戻るc-contains(s,"1"t)戻る「1」 -真=「0」、全ての置換1「とその実行中のSを0 S」。

  • 場合"1"t(連結)は、サブストリングのないS、ランが最大であり、contains戻りc-contains(s,"1"t)戻る「1」 -偽=「1」、未修飾の実行を残します。


1

APL、22文字

(⊣=⌈/)∊(⊣×+/¨)(~⊂⊣)0,⎕

英語の場合(ブロックで右から左へ):

  • 入力に0を追加します
  • 各0で始まるボックス
  • 各ボックスにその合計を掛けます
  • 平らにする
  • 数値が最大値に等しい場合は1、そうでない場合は0

1

Java 8、205バイト

これはaのラムダ式ですFunction<String,String>

s->{int x=s.length();for(String t="1",f="0";s.indexOf(t+1)>=0;t+=1){s=s.replaceAll(0+t+0,0+f+0);if(s.indexOf(t+0)==0)s=s.replaceFirst(t,f);if(s.lastIndexOf(0+t)==--x-1)s=s.substring(0,x)+f;f+=0;}return s;}

入出力は、Stringtrueが1で表され、falseが0で表されます。値を区切る区切り文字はありません。

説明付きのコード:

inputString -> {
  int x = inputString.length();
  //starting with the truth combination "1",
  //loop until the input string does not contain the combination appended with another "1"
  //with each consecutive loop appending a "1" to the combination
  for( String truthCombo = "1", falseCombo = "0"; inputString.indexOf( truthCombo + 1 ) >= 0; truthCombo += 1 ) {
    //all instances in the input string 
    //where the combination has a "0" on either side of it
    //are replaced by "0"'s
    inputString = inputString.replaceAll( 0 + truthCombo + 0, 0 + falseCombo + 0 );
    //if the combination followed by a "0"
    //is found at the beginning of the input string
    //replace it with "0"'s
    if( inputString.indexOf( truthCombo + 0 ) == 0 )
      inputString = inputString.replaceFirst( truthCombo , falseCombo );
    //if the combination preceeded by a "0"
    //is found at the end of the input string
    //replace it with "0"'s
    if( inputString.lastIndexOf( 0 + truthCombo ) == --x - 1 )
      inputString = inputString.substring( 0, x ) + falseCombo;
    falseCombo += 0;
  }
  return inputString;
}

テストケースについてはideoneをご覧ください


1

Clojure、137バイト

#(let[v(map(juxt first count)(partition-by #{1}%))](mapcat(fn[t](repeat(t 1)(if(=[1(apply max(map(fn[[f c]](if(= 1 f)c 0))v))]t)1 0)))v))

最初に、入力を連続したゼロと1に分割し、これらをパーティションの最初の要素と要素のカウントの「タプル」にマッピングします。次に、これが1の最大長シーケンスであるかどうかに応じて、必要な数のゼロまたは1を繰り返します。

少ないゴルフ:

(def f #(let [v(map(juxt first count)(partition-by #{1}%))
              m(apply max(map(fn[[f c]](if(= 1 f)c 0))v))]
           (mapcat (fn[[f c]](repeat c(if(=[1 m][f c])1 0))) v)))

0

Perl 5、68バイト

67、プラス1の-pe代わりに-e

y/0/ /;$_<${[sort@a]}[-1]&&y/1/0/for@a=split/\b/;$_=join"",@a;y; ;0

0と1の文字列(連結)を予期して出力します。

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