Membagi dua kesalahan

19

Tugas

Diberikan array non-kosong dari 0dan 1, membagi dua panjang berjalan dari 0.

Memasukkan

Array dari 0dan 1. Format yang dapat diterima:

  • Array nyata dalam bahasa Anda
  • String yang dipisahkan oleh linefeed dari 0dan1
  • String berdekatan 0dan1
  • Format wajar lainnya

Misalnya, tiga input berikut semuanya dapat diterima:

  • [1, 0, 0, 1]
  • "1\n0\n0\n1"(di mana \nLinefeed U + 000A)
  • "1001"

Anda mungkin berasumsi bahwa jangka waktu 0akan genap .

Keluaran

Array 0dan 1, dalam format yang dapat diterima di atas.

Testcases

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]

Mencetak gol

Ini adalah . Jawaban terpendek dalam byte menang.

Celah standar berlaku.

Biarawati Bocor
sumber
Di testcase terakhir, bukankah angka nol tidak memiliki panjang genap?
OldBunny2800
@ OldBunny2800 Baca test case dengan cermat; 0-run memiliki panjang 4, 2, 2, 2, 2, dan 2.
HyperNeutrino
Bisakah kita mengambil truedan falsebukannya 1dan 0?
Cyoce
@Cyoce bahasa yang mana?
Leaky Nun
@LeakyNun Ruby, yang dianggap benar 0.
Cyoce

Jawaban:

27

Retina , 4 byte

00
0

Cobalah online!

Martin Ender
sumber
Yang ini akan sulit dikalahkan.
Adám
@ Adám saya katakan mustahil untuk dikalahkan.
Erik the Outgolfer
Bekerja di QuadR juga!
Adám
11

05AB1E , 5 byte

00¤.:

Cobalah online!

Penjelasan

00     # push 00
  ¤    # tail, pushes 0
   .:  # replace
Emigna
sumber
2
Itu mudah; kenapa aku tidak memikirkan itu?
Leaky Nun
00adalah perilaku aneh ...
Erik the Outgolfer
@EriktheOutgolfer: Digit berurutan digabungkan untuk membentuk angka, jadi 11sebelas dan tidak 1,1. Efek sampingnya adalah 00menjadi 00bukan 0,0:)
Emigna
@ Emigna saya harapkan itu menjadi 0atau 0 0sebagai gantinya, tapi apa pun.
Erik the Outgolfer
7

Haskell , 33 byte

f(0:0:r)=0:f r
f(x:r)=x:f r
f e=e

Cobalah online! Penggunaan: f[1,1,0,0,1,1,0,0,1]. Iterasi daftar dan ganti dua nol berturut-turut dengan satu nol.

Laikoni
sumber
Saya merasa bahwa ini dapat dipalsukan ke Prolog
Leaky Nun
7

C (gcc) , 35 byte

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

48 adalah kode ascii dari '0'

versi 43 byte yang lebih baik seperti yang disarankan oleh Neil

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

40 byte lain kali ini (lagi seperti yang disarankan oleh Neil & VisualMelon) :)

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

dan kemudian 35 byte berkat Khaled.K

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

Cobalah online!

Alkano
sumber
1
Akan s+=2-*s%2bekerja
Neil
1
Jika saya sudah menghitung dengan benar saya pikir for(;*s;s+=2-*s%2)putchar(*s);menyimpan byte lain.
Neil
1
Apa yang salah dengan itu s+=50-*s? Tidak melakukan C selama berabad-abad dan tidak ingin mempermalukan diri sendiri dengan menerapkan perilaku yang tidak terdefinisi (berasal dari C # di mana tidak ada)
VisualMelon
1
Melihat putchardokumen, dapatkah Anda melakukannya f(char*s){for(;*s;s+=50-putchar(*s));}?
VisualMelon
3
Anda dapat menyimpan 5 byte dengan membuatnya rekursiff(char*s){*s&&f(s+50-putchar(*s));}
Khaled.K
6

sed , 8 byte

s/00/0/g

Cobalah online!

betseg
sumber
2
@oboquack Tidak berfungsi, karena itu akan selalu menggantikan proses 0dengan 0.
Erik the Outgolfer
6

Oktaf, 22 byte

@(s)strrep(s,'00','0')

Verifikasi semua kasus uji di sini.

Ini adalah fungsi anonim yang mengambil string pada format '1001000011'sebagai input, dan mengganti dua nol berturut-turut dengan nol tunggal.

Stewie Griffin
sumber
6

Java, 50 byte

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

Coba Online

Khaled.K
sumber
1
Pilihan input yang sangat bagus! By the way, jika Anda tertarik beralih ke Java 8 + solusi, Anda bisa menggunakan lambda: s->s.replaceAll("00","0").
Jakob
Bahkan lebih baik, gunakan replacesebagai ganti replaceAllmenyimpan 3 byte
Benjamin Urquhart
@BenjaminUrquhart replacehanya akan menggantikan kejadian pertama
Khaled.K
@ Khaled.K dalam javascript, ya. Di java, ini menggantikan semua kejadian
Benjamin Urquhart
5

Haskell , 28 byte

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

Cobalah online!

Secara rekursif mengambil elemen pertama, menjatuhkan yang kedua jika yang pertama adalah nol, sampai daftar kosong. Jika entri pertama adalah h, maka entri pertama 1-hdijatuhkan dari sisanya.

Tidak
sumber
5

Japt , 7 6 5 byte

d'0²0

Cobalah online!

Cukup ganti setiap jalankan dari dua nol di input dengan satu nol. Menggunakan input string (yaitu "1001001").

Luke
sumber
1
Bagus! Anda bahkan tidak perlu 'saya pikir
ETHproduk
Ooh, Anda dapat menyimpan byte lain dengan menggantinya "00"dengan '0²:-)
ETHproduksi
Nah, itu aneh. Terimakasih Meskipun!
Lukas
4

PHP, 26

<?=strtr($argn,["00"=>0]);

cukup ganti semua 00dengan 0.

Christoph
sumber
4

Alice , 13 byte

/oe00/
@iS0e\

Cobalah online!

Penjelasan

/.../
@...\

Ini adalah templat sederhana untuk program linier yang beroperasi sepenuhnya dalam mode Ordinal. Awal /mencerminkan IP untuk bergerak ke tenggara dan kemudian memantul secara diagonal ke atas dan ke bawah melalui kode sampai mirror di akhir. Mereka hanya mengimbangi posisi dengan satu sehingga dalam perjalanan kembali IP melintasi sel yang tersisa. Membaca kode dengan cara zigzag ini menjadi:

ie00e0So@

Ini adalah substitusi string sederhana:

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.

Ada beberapa cara lain untuk mendorong dua string, misalnya '00'0atau e000t, tapi saya belum menemukan apa pun yang mengalahkan 5 byte di sana (dan saya harus mencukur dua byte untuk dapat mempersingkat program).

Martin Ender
sumber
2
Sepertinya Anda jatuh cinta dengan Alice baru-baru ini ...
Leaky Nun
6
@ LeakyNun Tolong jangan beri tahu istri saya ...
Martin Ender
@ MartinEnder, aku akan mengatakan itu pada Ny. Ender!
Erik the Outgolfer
3

Prolog (SWI) , 42 byte

[0,0|T]*[0|R]:-T*R.
[H|T]*[H|R]:-T*R.
H*H.

Cobalah online!

Emigna
sumber
Sebuah jawaban prolog, tapi bukan yang saya harapkan ...
Leaky Nun
Trik yang bagus untuk menggunakan *operator.
Leaky Nun
3

Java , 131 123 byte

int[]f(int[]a){int c=0,i=0,l=a.length;for(int x:a)c+=1-x;int[]r=new int[l-c/2];for(c=0;c<l;c+=2-a[c])r[i++]=a[c];return r;}

Cobalah online!

Biarawati Bocor
sumber
3

JavaScript (ES6), 26 21 byte

Mengambil input sebagai string dan mengembalikan string.

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

Cobalah

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>

Shaggy
sumber
3

Lua, 33 byte

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

Mengambil string melalui input dan mengembunkan nol ganda. Mudah.

Pengobrol
sumber
3

Jelly , 8 byte

ṣ1j1,1m2

Cobalah online!

Kemungkinan jawaban lain dalam bahasa tanpa .replace()atau serupa dapat menggunakan trik ini.

Penjelasan

ṣ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
fireflame241
sumber
3

Alice , 12 10 byte

2 byte disimpan berkat Martin Ender

i.h%.7%$io

Cobalah online!

Penjelasan

Ini adalah kode 1-D yang beroperasi dalam mode kardinal, jadi mudah untuk mengikuti alurnya:

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
Leo
sumber
Anda benar-benar dapat menyimpan dua byte lagi dengani.h%...
Martin Ender
@MartinEnder Anda adalah orang jahat, berkeliling mengajar orang untuk bermain kotor ...: D
Leo
2

Python (daftar I / O), 36 byte

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

Cobalah online!

Secara rekursif mengambil elemen pertama, lalu menghapus yang tersisa jika yang pertama adalah nol.


38 byte:

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

Cobalah secara online Ini membutuhkan daftar Python dan mengeluarkan daftar Python dengan melakukan penggantian pada representasi string-nya. String I / O akan memungkinkan solusi yang lebih langsung dan lebih pendek, seperti

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

untuk '1001' format.

Tidak
sumber
Jawaban pertama dengan format yang ditentukan, bagus.
Leaky Nun
1
String I / O yang diperbolehkan. lambda s:s.replace('00','0')harus baik-baik saja.
Jonathan Allan
2

Perl 5, 7 + 1 (-p flag) = 8 byte

<>if/0/

Mengambil input sebagai angka yang dipisahkan oleh baris baru. Melewati baris berikutnya jika melihat nol.

Chris
sumber
2

V , 4 byte

òf0x

Cobalah online!

ò    ' Recursively (until we error)
 f0  ' Go to the next zero (errors when there are no zeros left)
   x ' Delete it
nmjcman101
sumber
2

MATL , 5 byte

FFOZt

Cobalah online!

Penjelasan

Ini mirip dengan jawaban Octave Stewie Griffin :

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

8 byte

vy~f2L)(

Ini menghindari penggantian string / array bawaan.

Cobalah online!

Penjelasan

Pertimbangkan input [1,0,0,1,0,0,1]sebagai contoh:

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]
Luis Mendo
sumber
1

Brachylog , 10 byte

ḅ{cẹ|ḍh}ᵐc

Cobalah online!

Belum yakin ini belum optimal ...

Penjelasan

Ini mengeksploitasi bug yang ada cdi daftar bilangan bulat yang memiliki angka nol di depannya akan gagal.

ḅ               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
Fatalisasi
sumber
Bagaimana itu bug?
Leaky Nun
@ LeakyNun Kita harus bisa menyatukan [0,0,4,2]ke 42. Nol terkemuka membuatnya gagal sekarang karena di sini untuk mencegah nol memimpin terkemuka ketika input adalah variabel, tapi di sini input sepenuhnya didasarkan sehingga batasan seharusnya tidak ada.
Fatalkan
Apakah Anda akan menulis jawaban Prolog?
Leaky Nun
1

C #, 191 byte

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

Cobalah online!

Ini tidak bersih atau pendek, tetapi berhasil.

Mengambil input sebagai rangkaian karakter yang berdekatan, menghasilkan dalam format yang sama

Penjelasan:

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

Catatan

Ya saya sadar ini bisa dilakukan dengan menggunakan s.Replace("00","0"), tujuan saya adalah untuk menghindari menggunakan solusi yang jelas. Bagaimanapun, inti dari PPCG adalah untuk bersenang-senang, bukan? ;)

Skidsdev
sumber
@ Mr.Xcoder Itu tidak benar. Ini tentang golf yang Anda dapat tanpa menggunakan built-in bahasa Replace saya menggunakan C # jadi saya tidak memiliki delusi tentang mendapatkan kode sesingkat mungkin, terutama dengan bahasa seperti Jelly sekitar, jadi mungkin juga bersenang-senang sedikit dalam proses.
Skidsdev
tentu saja kesenangan juga penting. Saya minta maaf atas komentar di atas dan saya harus mengakui bahwa saya menyukai jawaban Anda sendiri (teknik yang Anda gunakan).
Tn. Xcoder
@ Mr.Xcoder tidak ada perasaan sulit, pada akhirnya kita semua di sini untuk bersenang-senang dan melenturkan kemampuan kita yang tidak berguna untuk mengkompresi kode sebanyak mungkin;)
Skidsdev
Anda dapat melakukan jauh lebih pendek dari ini tanpa mengganti! string a(string s){var r="";for(int i=0;i<s.Length;i+=50-s[i])r+=s[i];return r;} (Sepertinya ini pada dasarnya adalah jawaban C)
VisualMelon
1

Pyth, 8 byte

:z"00"\0

Tautan coba-coba.

Penjelasan:

:z"00"\0 Takes unquoted contiguous 1-line input.
 z       Initialized to unevaluated first input line (Q won't be any shorter)
  "00"   Matching regex pattern /00/g
      \0 Substitution string "0"
:        Regex find-and-replace
Erik the Outgolfer
sumber
1

Awk - 18 byte

Pertama-tama coba lakukan apa saja dengan Awk sehingga dimungkinkan untuk bermain golf lebih banyak.

{gsub(00,0);print}

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

PsHegger
sumber
1

Batch, 24 byte

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

Mengambil input pada STDIN. Agak kompetitif untuk sekali.

Neil
sumber
1

Gangguan Umum, SBCL, 48 32 byte

-16 Bytes terima kasih kepada Julian Wolf

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

memasukkan:

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

keluaran:

1001110

Penjelasan

Kami membaca daftar input. Daftar digunakan dalam formatfungsi. Kami mengulanginya dengan mengeluarkan 1elemen jika 1mengeluarkan 0dan melewatkan elemen berikutnya dari daftar 0.


sumber
Menggunakan ~[daripada ~:[memungkinkan Anda mengindeks dengan 0 dan 1 secara langsung, yang seharusnya menghemat banyak byte
Julian Wolf
@JulianWolf Terima kasih!
1

Mathematica, 24 byte

StringReplace["00"->"0"]

Fungsi yang mengharapkan string "0"s dan "1"s dan mengembalikan string yang sama. Sintaks penjelasan sendiri. Mathematica memiliki banyak transformasi bawaan; kuncinya adalah menggunakan yang mengubah setiap sub-ekspresi yang relevan (tidak seperti /.) tetapi hanya melewati ekspresi sekali (tidak seperti //.).

Greg Martin
sumber
1

Jelly , 10 byte

Œg¹m2$S?€F

Cobalah online!

Penjelasan

Œg¹m2$S?€F
Œg          - Group runs of equal elements
        €   - To each run...
      S?    - If sum is truthy,
  ¹         -   return the run as it is
   m2$      - Else return every second element of the run.
fireflame241
sumber