Yanlışları yarıya indirmek


19

Görev

Boş olmayan bir dizi verilir 0ve 1, çalışmalarının uzunluklarını yarıya indirir 0.

Giriş

Dizisi 0ve 1. Kabul edilebilir biçim:

  • Kendi dilinizde gerçek dizi
  • -Hat besleme ayrılmış dize 0ve1
  • Mücavir dize 0ve1
  • Diğer makul biçimler

Örneğin, aşağıdaki üç girişin tümü kabul edilebilir:

  • [1, 0, 0, 1]
  • "1\n0\n0\n1"( \nhat besleme U + 000A nerede )
  • "1001"

Koşmalarının eşit uzunlukta0 olacağını varsayabilirsiniz .

Çıktı

Bir dizi 0ve 1yukarıda kabul edilebilir biçimlerde.

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]

puanlama

Bu . Bayt cinsinden en kısa cevap kazanır.

Standart boşluklar geçerlidir.


Son test çantasında, sıfırların çalışmalarının uzunluğu eşit değil mi?
OldBunny2800

@ OldBunny2800 Test durumunu dikkatlice okuyun; 0 koşular 4, 2, 2, 2, 2 ve 2 uzunluklarına sahiptir.
HyperNeutrino

Alabileceğimiz trueve falseyerine 1ve 0?
Cyoce

@ Hangi dili seçiyorsunuz?
Leaky Nun

@LeakyNun Ruby, bu 0doğru olduğunu düşünüyor.
Cyoce

Yanıtlar:



11

05AB1E , 5 bayt

00¤.:

Çevrimiçi deneyin!

açıklama

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

2
Kolaydı; neden bunu düşünmedim?
Sızdıran Rahibe

00garip bir davranış mı?
Outgolfer Erik

@EriktheOutgolfer: Sıralı rakamlar bir sayı oluşturmak üzere birleştirilir, bu nedenle onbirdir 11ve değil 1,1. Bunun bir yan etkisi olduğunu 00olur 00yerine 0,0:)
Emigna

@Emigna onun olmasını beklerdim 0ya da 0 0onun yerine, ama neyse.
Outgolfer Erik


7

C (gcc) , 35 bayt

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

48 '0' kodunun ascii kodudur

Neil tarafından önerilen daha iyi sürüm 43 bayt

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

Bu sefer başka bir 40 bayt (yine Neil & VisualMelon tarafından önerildiği gibi) :)

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

ve sonra Khaled.K sayesinde 35 bayt

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

Çevrimiçi deneyin!


1
Çalışır mıydı s+=2-*s%2?
Neil

1
Doğru saymış olsaydım for(;*s;s+=2-*s%2)putchar(*s);başka bir bayt kurtarır diye düşünüyorum .
Neil

1
Yanlış olan ne s+=50-*s? Çağlar boyunca C yapılmadı ve tanımlanmamış davranışları çağırarak kendimi utandırmak istemiyorum (C # 'dan gelmeyen C #' dan geliyor)
VisualMelon

1
putcharDokümanlara bakarak yapabilir misin f(char*s){for(;*s;s+=50-putchar(*s));}?
VisualMelon

3
Yinelemeli hale getirerek 5 bayt kaydedebilirsinizf(char*s){*s&&f(s+50-putchar(*s));}
Khaled.K



6

Java, 50 bayt

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

Çevrimiçi Deneyin


1
Çok iyi bir giriş seçeneği! Bu arada, bir Java 8+ çözümüne geçmek istiyorsanız lambda: kullanabilirsiniz s->s.replaceAll("00","0").
Jakob

Daha da iyisi, 3 bayt kaydetmek replaceyerine kullanınreplaceAll
Benjamin Urquhart

@BenjaminUrquhart replacesadece ilk olayın yerini alacak
Khaled.K

@ Khaled.K javascript, evet. Java'da, tüm olayların yerine geçer
Benjamin Urquhart

5

Haskell , 28 bayt

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

Çevrimiçi deneyin!

İlk öğeyi yinelemeli olarak alır, ilk öğe sıfırsa boş olana kadar ikinci öğeyi bırakır. İlk giriş ise h, ilk giriş 1-hkalan kısımdan çıkarılır.



4

PHP, 26

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

Sadece tüm değiştirin 00tarafından 0.


4

Alice , 13 bayt

/oe00/
@iS0e\

Çevrimiçi deneyin!

açıklama

/.../
@...\

Tamamen Ordinal modda çalışan doğrusal programlar için basit bir şablondur. Birincisi /, IP'yi güney doğuya hareket edecek şekilde yansıtır ve daha sonra aynadaki uçlara kadar kod boyunca çapraz olarak yukarı ve aşağı sıçrar. Bunlar pozisyonu birer birer öteler, böylece IP geri dönüşte kalan hücreleri geçer. Bu zikzak tarzında kodu okumak şöyle olur:

ie00e0So@

Bu basit bir dize ikamesidir:

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.

İki dizeyi itmenin birkaç yolu daha var, örneğin, '00'0ya da e000torada 5 baytlık bir şey bulamadım (ve programı kısaltmak için iki bayt tıraş etmem gerekir).


2
Görünüşe göre Alice'e yakın zamanda aşık oldun ...
Leaky Nun

6
@LeakyNun Lütfen eşime söyleme ...
Martin Ender

@MartinEnder Bunu Bayan Ender'e söyleyeceğim!
Outgolfer Erik



3

JavaScript (ES6), 26 21 bayt

Girdiyi dize olarak alır ve bir dize döndürür.

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

Dene

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 bayt

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

Girdi yoluyla bir dize alır ve çift sıfır yoğunlaştırır. Kolay.


3

Jöle , 8 bayt

ṣ1j1,1m2

Çevrimiçi deneyin!

Muhtemelen .replace()veya benzeri olmayan dillerdeki diğer cevaplar bu hileyi kullanabilir.

açıklama

ṣ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

Alice , 12 10 bayt

Martin Ender sayesinde 2 bayt kurtardı

i.h%.7%$io

Çevrimiçi deneyin!

açıklama

Bu, kardinal modda çalışan 1-B kodudur, bu nedenle akışını takip etmek kolaydır:

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

Aslında iki bayt daha kaydedebilirsinizi.h%...
Martin Ender

Sen kötü bir insansın, insanlara kirli oynamayı öğretiyor ...: D
Aslan

2

Python (liste G / Ç), 36 bayt

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

Çevrimiçi deneyin!

İlk öğeyi özyinelemeli olarak alır, ardından ilk öğeyi sıfırsa kalan öğeyi kaldırır.


38 bayt:

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

Çevrimiçi deneyin Bu bir Python listesi alır ve dize temsilini değiştirerek bir Python listesi çıkarır. Dize I / O, daha doğrudan ve daha kısa bir çözüme izin verir.

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

için '1001' formatında.


Biçimi belirtilen ilk cevap güzel.
Sızdıran Rahibe

1
Yaylı I / O olduğu sağladı. lambda s:s.replace('00','0')iyi olmalı.
Jonathan Allan


2

Perl 5, 7 + 1 (-p bayrağı) = 8 bayt

<>if/0/

Yeni satırla ayrılmış sayılar olarak girdi alır. Sıfır görürse sonraki satırı atlar.



2

MATL , 5 bayt

FFOZt

Çevrimiçi deneyin!

açıklama

Bu Stewie Griffin'in Octave cevabına benzer :

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

8 bayt

vy~f2L)(

Bu, dize / dizi değiştirme yerleşimini önler.

Çevrimiçi deneyin!

açıklama

Girişi [1,0,0,1,0,0,1]örnek olarak düşünün :

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 bayt

ḅ{cẹ|ḍh}ᵐc

Çevrimiçi deneyin!

Bunun optimal olduğundan emin değilim…

açıklama

Bu O böceği sömüren clider olan sıfır başarısız olur tamsayılar bir listede.

ḅ               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

Bu nasıl bir hata?
Leaky Nun

Biz bitiştirmek gerekir @LeakyNun [0,0,4,2]içine 42. Öncü sıfırlar şu anda başarısız olur, çünkü Giriş bir değişken olduğunda sonsuz önde gelen sıfırları önlemek için buradadır, ancak burada Giriş tamamen topraklanmıştır, böylece sınırlama olmamalıdır.
17'de

Bir Prolog yanıtı yazar mısınız?
Sızdıran Rahibe

1

C #, 191 bayt

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

Çevrimiçi deneyin!

Ne temiz ne de kısa, ama işe yarıyor.

Girdiyi bitişik bir karakter dizesi olarak alır, aynı biçimde çıktılar

Açıklama:

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

Not

Evet bunun basit bir şekilde yapılabileceğinin farkındayım s.Replace("00","0"), amacım bariz çözümü kullanmaktan kaçınmaktı. Sonuçta, PPCG'nin asıl amacı eğlenmek, değil mi? ;)


@ Mr.Xcoder Bu doğru değil. Bu, dili yerleşik olarak kullanmadan alabileceğiniz kadar golfçüdür Replace C # kullanıyorum, bu yüzden özellikle en az Jelly gibi dillerle mümkün olan en kısa kodu almakla ilgili hiçbir sanrı yok, bu yüzden biraz eğlenebilirsiniz süreç içerisinde.
Skidsdev

elbette eğlence de önemlidir. Yukarıdaki yorum için özür dilerim ve itiraf etmeliyim ki cevabınızı kendim beğendim (kullandığınız teknik).
Bay Xcoder

@ Mr.Xcoder zor duygular yok, sonuçta hepimiz eğlenmek ve kodu mümkün olduğunca sıkıştırmak için işe yaramaz yeteneğimizi
bükmek için buradayız

Değiştirmeden bundan çok daha kısa yapabilirsiniz ! string a(string s){var r="";for(int i=0;i<s.Length;i+=50-s[i])r+=s[i];return r;} (bu temelde C cevabı gibi görünüyor)
VisualMelon

1

Pyth, 8 bayt

:z"00"\0

Deneyin bağlantısı.

Açıklama:

: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

1

Awk - 18 bayt

Öncelikle Awk ile herhangi bir şey yapmayı deneyin, böylece daha fazla golf oynamak mümkün olabilir.

{gsub(00,0);print}

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


1

Yığın, 24 bayt

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

STDIN üzerine girdi alır. Bir kereliğine biraz rekabetçi.


1

Ortak Lisp, SBCL, 48 32 bayt

Julian Wolf sayesinde 16 bayt

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

giriş:

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

çıktı:

1001110

açıklama

Giriş listesini okuyoruz. Liste formatişlevde kullanılır . O çıkışı aracılığıyla Biz döngü 1elemanı ise 1ve çıkışı 0ve için listenin bir sonraki elemanı atlama 0.


Bunun ~[yerine ~:[doğrudan 0 ve 1 ile indekslemenize izin verir, bu da size bir demet bayt kazandırır
Julian Wolf

@JulianWolf Teşekkürler!

1

Mathematica, 24 bayt

StringReplace["00"->"0"]

Bir "0"s ve "1"s dizesi bekleyen ve benzer bir dize döndüren bir işlev . Açıklayıcı sözdizimi. Mathematica'da çok sayıda dönüşüm yerleşimi vardır; anahtar, ilgili tüm alt ifadeleri dönüştüren (aksine /.) bir ifadeyi kullanmaktır, ancak ifadeden yalnızca bir kez (farklı olarak //.) geçer.


1

Jöle , 10 bayt

Œg¹m2$S?€F

Çevrimiçi deneyin!

açıklama

Œ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.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.