偽りを半減させる


19

仕事

所与の非空の配列01、のランの長さを半減させます0

入力

配列01。許容される形式:

  • あなたの言語の実際の配列
  • 0およびの改行区切り文字列1
  • 連続した文字列01
  • その他の合理的な形式

たとえば、次の3つの入力はすべて受け入れられます。

  • [1, 0, 0, 1]
  • "1\n0\n0\n1"\n改行はU + 000Aです)
  • "1001"

のラン0偶数の長さであると仮定できます。

出力

上記の受け入れ可能な形式の0との配列1

テストケース

input ↦ output
[1,0,0,1,0,0,1] ↦ [1,0,1,0,1]
[1,1,0,0,1,1,0,0,1] ↦ [1,1,0,1,1,0,1]
[1,1,0,0,1,1,1,0,0,1,1] ↦ [1,1,0,1,1,1,0,1,1]
[1,1,1] ↦ [1,1,1]
[0,0,1] ↦ [0,1]
[0,0] ↦ [0]
[1,1,1,0,0,0,0,1,1,1,1,0,0,1,0,0,1,1,0,0,1,1,1,1,0,0,1,0,0] ↦ [1,1,1,0,0,1,1,1,1,0,1,0,1,1,0,1,1,1,1,0,1,0]

得点

これはです。バイト単位の最短回答が優先されます。

標準の抜け穴が適用されます。


最後のテストケースでは、ゼロの連続は同じ長さではありませんか?
OldBunny2800

@ OldBunny2800テストケースを注意深く読んでください。0ランの長さは
4、2、2、2、2

trueandのfalse代わりに1and を使用できます0か?
チョイス

@Cyoceはどの言語ですか?
リーキー修道女

@LeakyNun Ruby、これは真実だと考え0ています。
チョイス

回答:



11

05AB1E、5バイト

00¤.:

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

説明

00     # push 00
  ¤    # tail, pushes 0
   .:  # replace

2
それは簡単でした。なぜそう思いませんでしたか?
リーキー修道女

00は奇妙な行動です...
エリックアウトゴルファー

@EriktheOutgolfer:連続する数字は連結されて数字を形成するため11、11ではなく11 1,1です。その副作用は、:)の代わりに00なるということです000,0
エミグナ

@Emignaになる0か、0 0その代わりになると期待していたが、何でも。
エリックアウトゴルファー


7

C(gcc)、35バイト

f(char*s){while(*s)putchar(*s),*s++-48?:s++;}

48は '0'のASCIIコードです

Neilが示唆するより良いバージョン43バイト

f(char*s){while(*s)putchar(*s),s+=2-*s%2;}

今度はもう1つ40バイト(NeilとVisualMelonが提案したとおり):)

f(char*s){for(;*s;s+=50-*s)putchar(*s);}

Khaled.Kのおかげで35バイト

f(char*s){*s&&f(s+50-putchar(*s));}

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


1
だろうs+=2-*s%2動作しますか?
ニール

1
正しくカウントできたら、for(;*s;s+=2-*s%2)putchar(*s);もう1バイト節約できます。
ニール

1
何が問題なのでしょうs+=50-*sか?
長い間

1
putcharドキュメントを見て、できますかf(char*s){for(;*s;s+=50-putchar(*s));}
VisualMelon

3
再帰的にすることで5バイト節約できますf(char*s){*s&&f(s+50-putchar(*s));}
-Khaled.K



6

Java、50バイト

String f(String s){return s.replaceAll("00","0");}

オンラインで試す


1
非常に良い入力選択!ところで、Java 8+ソリューションへの切り替えに関心がある場合は、lambda:を使用できますs->s.replaceAll("00","0")
ヤコブ

さらに良いことに、3バイトを節約するreplace代わりにreplaceAllを使用してください
Benjamin Urquhart

@BenjaminUrquhartはreplace唯一の最初の出現に置き換えられます
Khaled.K

JavaScriptの@ Khaled.K、はい。Javaでは、すべての出現を置き換えます
ベンジャミンアーカート

5

Haskell、28バイト

f(h:t)=h:f(drop(1-h)t)
f e=e

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

空のリストになるまで、最初の要素が再帰的に取得され、最初の要素がゼロの場合は2番目の要素が削除されます。最初のエントリがある場合h、その後、最初の1-h残りの部分から削除されます。


5

Japt7 6 5バイト

d'0²0

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

入力内の2つのゼロの各実行を1つのゼロに置き換えるだけです。文字列入力(つまり"1001001")を使用します。


1
いいね!あなたも'私が思う必要はありません
-ETHproductions

ああ、あなたは置き換えることによって、別のバイトを保存することができます"00"'0²:-)
ETHproductions

まあ、それは奇妙です。でもありがとう!
ルーク


4

アリス、13バイト

/oe00/
@iS0e\

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

説明

/.../
@...\

これは、完全に順序モードで動作する線形プログラム用のシンプルなテンプレートです。最初/はIPを反映して南東に移動し、最後にミラーが終わるまでコードを斜めに上下に跳ね返ります。それらは、IPが残りのセルを移動する途中で位置を1つだけオフセットします。このジグザグ形式でコードを読み取ると、次のようになります。

ie00e0So@

これは単純な文字列置換です。

i   Read all input.
e   Push an empty string.
00  Append two zeros to create the string "00".
e   Push an empty string.
0   Append a zero to create the string "0".
S   Substitute all occurrences of "00" in the input with "0".
o   Output the result.   
@   Terminate the program.

2つの文字列をプッシュする方法は他にもいくつかあります(例:'00'0またはe000t)。ただし、5バイトを超えるものは見つかりませんでした(プログラムを短縮するために2バイトを削る必要があります)。


2
あなたのように見えますが...最近、アリスと恋に落ちた
漏れ修道女

6
@LeakyNun ...私の妻を教えないでください
マーティン・エンダー

@MartinEnderエンダー夫人にそれ​​を伝えます!
エリックアウトゴルファー



3

JavaScript(ES6)、26 21バイト

入力を文字列として受け取り、文字列を返します。

s=>s.replace(/00/g,0)

それを試してみてください

f=
s=>s.replace(/00/g,0)
i.addEventListener("input",_=>o.innerText=f(i.value))
console.log(f("1001001")) // "10101"
console.log(f("110011001")) // "1101101"
console.log(f("11001110011")) // "110111011"
console.log(f("111")) // "111"
console.log(f("001")) // "01"
console.log(f("00")) // "0"
console.log(f("11100001111001001100111100100")) // "1110011110101101111010"
<input id=i><pre id=o>


3

Lua、33バイト

print((io.read():gsub("00","0")))

入力を介して文字列を取得し、二重ゼロを凝縮します。簡単です。


3

ゼリー、8バイト

ṣ1j1,1m2

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

おそらく言語のない他の答え .replace()は、このトリックを使用できます。

説明

ṣ1j1,1m2 - (duplicates the 1s, then halves all lengths)
ṣ1       - split by the element 1
  j1,1   - join the elements with the two-element list 1,1
      m2 - get every second element

3

アリス12 10バイト

Martin Enderのおかげで2バイト節約

i.h%.7%$io

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

説明

これは基本モードで動作する1次元コードであるため、フローを簡単に追跡できます。

i                   Read a byte from input (pushes -1 on EOF)
 .h                 Duplicate it and add 1 to the copy
   %                Compute n%(n+1). This will exit with an error on n==-1
                    and return n for any non-negative n.
    .7%             Duplicate the input again and compute its value modulo 7
                    This returns 6 for '0' (unicode value 48) and 0 for '1'
                    (unicode value 49)
       $i           If this last result was not 0, input another number.
                    This ignores every other '0' in the input
                    and moves to the following number (another '0')
         o          Output the last byte read

                    At the end, wrap back to the beginning of the line

実際には、さらに2バイトを節約できますi.h%...
マーティンエンダー

@MartinEnderあなたは悪人であり、人々に汚い遊びを教えて回る...:D-
レオ

2

Python(リストI / O)、36バイト

f=lambda l:l and l[:1]+f(l[2-l[0]:])

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

最初の要素を再帰的に取得し、最初の要素がゼロの場合、残りの要素を削除します。


38バイト:

lambda l:eval(`l`.replace('0, 0','0'))

オンラインで試すこれはPythonリストを取得し、文字列表現で置換を行うことでPythonリストを出力します。文字列I / Oにより、次のような、より直接的で短いソリューションが可能になります。

lambda s:s.replace('00','0')

以下のための'1001' フォーマット。


指定された形式の最初の回答、いいですね。
リーキー修道女

1
ストリングI / O 許可されます。lambda s:s.replace('00','0')大丈夫です。
ジョナサンアラン


2

Perl 5、7 + 1(-pフラグ)= 8バイト

<>if/0/

入力を改行で区切られた数字として受け取ります。ゼロが見つかった場合、次の行をスキップします。



2

MATL、5バイト

FFOZt

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

説明

これはStewie GriffinのOctaveの回答に似ています

FF     % Push [0 0]
O      % Push 0
Zt     % Implicitly take input. Replace [0 0] by 0. Implicitly display

8バイト

vy~f2L)(

これにより、組み込みの文字列/配列置換が回避されます。

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

説明

[1,0,0,1,0,0,1]例として入力を検討してください。

v      % Concatenate stack (which is empty): pushes []
       % STACK: []
y      % Implicit input. Duplicate from below
       % STACK: [1,0,0,1,0,0,1], [], [1,0,0,1,0,0,1]
~f     % Negate, find: gives indices of zeros
       % STACK: [1,0,0,1,0,0,1], [], [2,3,5,6]
2L     % Push [2,2,1i]. As an index, this is interpreted as 2:2:end
       % STACK: [1,0,0,1,0,0,1], [], [2,3,5,6], [2,2,1i]
)      % Reference indexing. This selects the even-indexed entries
       % STACK: [1,0,0,1,0,0,1], [], [3,6]
(      % Assignment indexing. This deletes the specified entries
       % (assigns them the empty array). Implicitly display
       % STACK: [1,0,1,0,1]

1

Brachylog、10バイト

ḅ{cẹ|ḍh}ᵐc

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

これがまだ最適かどうかわからない…

説明

これcは、先行ゼロを持つ整数のリストで失敗するバグを利用します。

ḅ               Blocks; group consecutive equal elements together
 {     }ᵐ       Map on each block:
  c               It is possible to concatenate the block into an int (i.e. it contains 1s)
   ẹ              Split it again into a list of 1s
    |             Else
     ḍh           Dichotomize and take the head
         c      Concatenate the blocks into a single list

それはバグですか?
リーキー修道女

私たちは、連結することができるはず@LeakyNun [0,0,4,2]42。先行ゼロは、入力が変数のときに無限先行ゼロを防ぐためにここにあるので、すぐに失敗しますが、ここでは、制限が存在しないように入力が完全に接地されています。
致命的

Prologの回答を書きますか?
リーキー修道女

1

C#、191バイト

string a(string s){var l=(s+'1').ToCharArray();s="";int b=0;for(int i=0;i<l.Length;i++){if(l[i]=='1'){if(b>0){s+=new string('0',b/2);b=0;}s+=l[i];}else b++;}return s.Substring(0,s.Length-1);}

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

きれいでも短いでもありませんが、動作します。

入力を連続した文字列として受け取り、同じ形式で出力します

説明:

string a(string s){                  //Define method a that takes input string s and returns a string
  var l=(s+'1').ToCharArray();       //Add a 1 to the end of s and split into char array l
  s="";                              //Empty s
  int b=0;                           //Initialize int b with value 0
  for(int i=0;i<l.Length;i++){       //Loop through l
    if(l[i]=='1'){                   //If current char is 1
      if(b>0){                       //If b is not 0
        s+=new string('0',b/2);      //Add half the amount of 0s we've counted to s
        b=0;                         //Reset b
      }                              //End if b is not 0
      s+=l[i];                       //Add current char to s
    }                                //End if current char is 1
    else b++;                        //If current char is not 1, increment b
  }                                  //End loop
  return s.Substring(0,s.Length-1);  //Return string minus last char
}                                    //End method

注意

はい、これは単にを使用s.Replace("00","0")して実行できることを認識しています。私の目的は、明らかなソリューションの使用を避けることでした。結局のところ、PPCGの重要なポイントは楽しいことですよね?;)


@ Mr.Xcoderそれは真実ではありません。これは、Replace C#を使用している言語のビルトインを使用せずに得ることができるのと同じくらいゴルフですので、特にJellyのような言語で最短のコードを取得することについて妄想はありませんので、少し楽しいかもしれません過程の中で。
Skidsdev

もちろん、楽しみも重要です。上記のコメントをおpoび申し上げますが、あなた自身の回答(あなたが使用したテクニック)が気に入ったと認めなければなりません。
ミスターXcoder

@ Mr.Xcoderのハードフィーリングはありません。最終的には、楽しい時間を過ごし、コードを可能な限り圧縮するための役に立たない能力をフレックスするためにここにいます;)
Skidsdev

交換せずにこれよりもはるかに短いことができます!string a(string s){var r="";for(int i=0;i<s.Length;i+=50-s[i])r+=s[i];return r;} (これは基本的にCの答えのように見えます)
-VisualMelon


1

AWK-18バイト

最初にAwkで何かを試してみてください。

{gsub(00,0);print}

使用法: echo "1001001" | awk '{gsub(00,0);print}'


1

バッチ、24バイト

@set/ps=
@echo %s:00=0%

STDINで入力を受け取ります。ある程度競争力がある。


1

Common Lisp、SBCL、48 32バイト

ジュリアン・ウルフのおかげで-16バイト

(format t"~{~[0~*~;1~]~}"(read))

入力:

(1 0 0 0 0 1 1 1 0 0)

出力:

1001110

説明

入力リストを読みます。リストはformat関数で使用されます。1要素が存在する場合は出力をループし、リストの次の要素を1出力0してスキップし0ます。


使用する~[のではなくすることは~:[あなたのバイトの束を保存する必要がありますが、0とインデックスと1直接、することができます
ジュリアン・ウルフ

@JulianWolfありがとうございます!

1

Mathematica、24バイト

StringReplace["00"->"0"]

"0"sと"1"sの文字列を期待し、同様の文字列を返す関数。自明の構文。Mathematicaには多くの変換ビルトインがあります。重要なのは、関連するすべての部分式を変換する(/.ではなく)が、式を1回しか通過しない(を使用しない)ものを使用すること//.です。


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