Ardışık 1-Bitler Artırılır


36

Bitlerin bir deseni (dize veya dizi formatı) verildi: [0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,1]

Görevleri, herhangi bir ardışık 1-Bit sayısını 1'den başlayan artan bir sayı dizisi ile değiştirmektir.

Giriş

  • Desen (bir dize veya dizi olarak alınabilir) Örnek:
    • Dize: 1001011010110101001
    • Dizi: [1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1]

Çıktı

  • Artan sayı dizisi (bir dize veya dizi olarak döndürülebilir) Örnek:
    • Dize: 1 0 0 1 0 1 2 0 1 0 1 2 0 1 0 1 0 0 1
    • Dizi: [1, 0, 0, 1, 0, 1, 2, 0, 1, 0, 1, 2, 0, 1, 0, 1, 0, 0, 1]

kurallar

  • (yalnızca dizeler için geçerlidir) Girdi 1ve arasında boşluk içermez0
  • Girdiyi Al length > 0
  • (yalnızca dizeler için geçerlidir) Çıktı boşlukla ayrılmıştır (alfabedeki bir sayı veya harf olmadığı sürece başka bir ayırıcı kullanın)

Örnek:

Given [0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,1] 
Output [0,1,2,3,0,1,2,0,0,0,1,2,3,4,5,6]

--------------------------------------------------------------------------

Given 0110101111101011011111101011111111     
Output 0 1 2 0 1 0 1 2 3 4 5 0 1 0 1 2 0 1 2 3 4 5 6 0 1 0 1 2 3 4 5 6 7 8

---------------------------------------------------------------------------

Given 11111111111101    
Output 1 2 3 4 5 6 7 8 9 10 11 12 0 1

Kazanan kriterler: Codegolf

Yanıtlar:


19

05AB1E , 4 bayt

γ€ƶ˜

Çevrimiçi deneyin! veya Test Elbisesi olarak

açıklama

γ      # split input into groups of consecutive equal elements
 €ƶ    # multiply each number in each sublist by its 1-based index in the sublist
   ˜   # flatten

1
Oof, benimkinden daha iyi. Bunu asla düşünmezdim.
Magic Octopus Urn

3
Codegolf bayt sayma kurallarına% 100 aşina değilim (ve googling yalnızca bu sonuca varmayan bu yazıyı buldu ). Cevabınız 4 karakter olsa da, en az 8 bayt (ör. Utf-16-BOM olmadan 03 B3 20 AC 01 B6 02 DC) veya 9 bayt (utf-8:) CE B3 E2 82 AC C6 B6 CB 9Cveya 10 bayt (örn., 2 bayt BOM dahil olmak üzere UTF-16 ) olmamalıdır. herhangi bir oyuncak olmayan kodlama? (Evet, bir olabilir 1-byte gösterilen bu 4 sembolleri ile izo-8859 kodlamalar benzer kodlayan bir oyuncak 8-bit oluşturmak, ama bu hile gibi görünüyor.)
dr jimbob

6
@ drjimbob Evet, güzel soru. Kod aslında 05AB1E kod sayfasını kullanarak bir ikili dosyaya dönüştürülebilir . Örneğin, γ€ƶ˜olarak temsil edilir 04 80 8F 98. Kod sayfası öncelikle kod yazmayı kolaylaştırmak için bulunmaktadır. Bu 4 bayt dosyayı çalıştırmak için yorumlayıcıyı --osabiebayrakla çalıştırmanız gerekir .
Adnan

18

Haskell , 15 bayt

scanl1$(*).succ

Çevrimiçi deneyin!

Açıklama / Ungolfed

scanl1 en son sonucu alan bir işlevi ve sonuçlarla birlikte yeni bir liste oluşturan bir işlevi kullanarak soldan listeler.

(*).succ eşdeğeri \x y-> (x+1)*y

Bu işlevin scanl1yalnızca işlerle birlikte kullanılması , artan dizilerin ( 1,2,3, .. ) 1 ile başlamasından ve önceki öğelere sahip olmadığından (bu durumda listedeki "değiştirilemeyecek" ilk öğedir) çalışır. ya da lider 0 var .



14

Kabuğu , 5 4 3 bayt

ṁ∫g

Çevrimiçi deneyin!

açıklama

ṁ∫g  -- full function, example input: [1,1,1,0,1]
  g  -- group: [[1,1],[0],[1]]
ṁ    -- map the following and concatenate result (example with [1,1,1])
 ∫   -- | cumulative sum: [1,2,3]
     -- : [1,2,3,0,1]

Geçmişi düzenle

Kullanarak -1 bayt scanl1üzerindezipWith

Adapte edilmesiyle -1 bayt Dennis bireyin çözeltisi



11

JavaScript (ES6), 22 bayt

Diziyi girdi olarak alır.

a=>a.map(s=n=>s=n*-~s)

Çevrimiçi deneyin!

Daha kısa olan a=>a.map(n=>a=n*-~a)(20 byte) [1], singleton dizilerinin tuttukları tam sayıya zorlanması nedeniyle ne yazık ki başarısız olur .




6

Jöle , 4 bayt

‘×¥\

Çevrimiçi deneyin!

‘×¥\
   \   Accumulate the input with:
  ¥   The dyad
‘      Increment the left element
 ×    Multiply by the second element (1 or 0)
       The result always begins with the first element unchanged

6

K (oK) , 11 8 bayt

Çözüm:

{y*1+x}\

Çevrimiçi deneyin!

Açıklama:

Listeyi yinele. Akümülatörün artması, mevcut maddeyle çarpın (eğer madde 0 ise akümülatörü sıfırlar):

{y*1+x}\ / the solution
{     }\ / iterate (\) over lambda function
     x   / accumulator
   1+    / add 1
 y*      / multiply by current item

5

Jöle , 4 bayt

ŒgÄF

Çevrimiçi deneyin!

Nasıl çalışır

ŒgÄF  Main link. Argument: A (bit array)

Œg    Group adjacent, identical bits.
  Ä   Accumulate; take the cumulative sum of each chunk.
   F  Flatten.

Grup hızlı koşarken Erik bunun üç bayt olacağını öne sürmüştü! (Ne yapabileceğini doğru
anladıysam

@dylnan Sorun, bu kadar hızlı bir davranışa karar vermenin zor olmasıdır. :( Bu yüzden hızlı hala
hiatustadır

Muhtemel uygulamalar için çok sayıda yol açabilir
dylnan


5

RAD, 8 bayt

(⊢×1+⊣)⍂

Çevrimiçi deneyin!

Nasıl?

  • (⊢×1+⊣), eğer doğru argüman ise 0, geri dön 0, aksi halde sol argümanı arttır
  • , LTR Taraması ( (A f B) f Cyerine A f (B f C)), bunu dizinin tamamına uygulayın

4

Japt, 7 6 5 bayt

åÏ*°X

Dene


açıklama

åÏ        :Cumulatively reduce
   °X     :  Increment the current total (initially 0)
  *       :  Multiply by the current element

4

Java 8, 55 48 bayt

a->{int p=0,i=0;for(int v:a)a[i++]=v<1?p=0:++p;}

Girdileri kaydetmek için yenisini döndürmek yerine girdi dizisini değiştirir.

@TimSeguine sayesinde -7 bayt .

Çevrimiçi deneyin.

Açıklama:

a->{             // Method with integer-array parameter and no return-type
  int p=0,       //  Previous integer, starting at 0
      i=0;       //  Index-integer, starting at 0
  for(int v:a)   //  Loop over the values of the input-array:
    a[i++]=v<1?  //   If the current value is 0:
          p=0    //    Reset the previous integer to 0
         :       //   Else:
          ++p;}  //    Increase `p` by 1 first with `++p`
                 //    and set the current item to this new value of `p`

1
48’e kadar tıraş edebilirsiniz:a->{int p=0,i=0;for(int b:a)a[i++]=b<1?p=0:++p;}
Tim Seguine

@TimSeguine Teşekkürler! Şimdi görüyorum ki, kendim hakkında düşünmedim inanamıyorum.
Kevin Cruijssen

1
P kurtulmak başardı, ama aynı boyutta :(a->{int i=0;for(int v:a)a[i]+=v*i++<1?0:a[i-2];}
Tim Seguine

4

TIS , 68 + 33 = 101 bayt

Kod (68 bayt):

@0
MOV UP ACC
SUB 47
MOV ACC ANY
@1
ADD 1
JRO UP
SUB ACC
MOV ACC ANY

Düzen (33 bayt):

2 1 CC I0 ASCII - O0 NUMERIC - 32

Çevrimiçi deneyin!

Açıklama:

|    Input 0    |    Input is given in ASCII (`0` is 48, `1` is 49)
+--------+------+
| Node 0 |      |    This node prepares the input data
+--------+      |
| MOV UP ACC    |    Read in a character
| SUB 47        |    Subtract 47 to map [48, 49] to [1, 2]
| MOV ACC ANY   |    Send the 1 or 2 to the next node
|               |    Implicitly wrap back to top of node
+--------+------+
| Node 1 |      |    This node does the incrementing/printing
+--------+      |
| ADD 1         |    Increment counter (starts at zero)
| JRO UP        |    Get value from above, and jump forward that many lines  (skip next line or not)
| SUB ACC       |    Reset counter to zero (if input was zero)
| MOV ACC ANY   |    Send the counter value downward to be printed
|               |    Implicitly wrap back to top of node
+---------------+
|   Output 0    |    Output is space-delimited numeric values

4

Gaia , 5 bayt

ẋ+⊣¦_

Çevrimiçi deneyin!

açıklama

ẋ+⊣¦_     Full program
ẋ         Split into chunks of equal adjacent values.
   ¦_     And for each chunk, flattening the result afterwards...
 +⊣       Reduce it cumulatively on + (addition); aka cumulative sums

SE kod fontlarının tek boşluklu olduğunu sanıyordum.


Onlar monospace ... İlk satırda eksik bir boşluk var.
micsthepick

Düzenlemeye bak. Hala yanlış hizalanmış.
Bay Xcoder

Bir mobil cihazdan falan bakıyor olmalısın - Bana iyi görünüyor
micsthepick

@micsthepick I'm not ...
Mr.


4

Perl 6 , 29 24 18 bayt

-Sean sayesinde 6 bayt!

*.map:{($+=1)*=$_}

Çevrimiçi deneyin!

İç işlev bunu yapabilir ($+=1)*=*, ancak daha sonra adsız değişken işlev çağrıları boyunca devam eder. Bunu, açık bir kod bloğuna sararak hallederiz.

Açıklama:

*.map:               # Map the array to
      {($+=1)    }   # The anonymous variable incremented
             *=$_    # Multiplied by the element

Ben 16 bayt aynı temel yaklaşım aşağı var: *.map(($+=1)*=*). Bu çözüm, durum değişkeninin $işleve yapılan çağrılar arasında devam etmesi şartına sahiptir, bu nedenle son eleman bir çağrıya geçerse ve bir sonraki çağrıya geçen birinci elemanın ikisi de sıfır değilse, sayma yanlış numara ile başlayacaktır.
Sean,

@Sean, Evet aslında cevap verdiğimde onunla mücadele ettiğimi hatırlıyorum. Neyse ki o zamandan beri bununla ilgili bir yol öğrendim
Jo King

Bir kere daha bayt knock off edebilirsiniz: *.map:{...}.
Sean



3

Pyth , 6 bayt

m=Z*hZ

Burada dene!

Nasıl çalışır

m = Z * hZ - Tam program. Q = değerlendirilen girdi.
m - Q'daki her tamsayı için
 = Z - Z değişkenini (önceden başlatılmış 0 olarak) şuna atayın ...
   * hZ - (Z + 1) * d; (d sonunda kapalıdır).

3

Düzenli ifadeleri kullanırken bir cevap almak istedi. Muhtemelen okuyucu için bir egzersiz olarak bıraktığım daha kolay bir çözüm var.

PowerShell Çekirdek , 86 bayt

Filter F{($_-split"(0)(\B|\b)"|?{$_-ne''}|%{$_-replace'(1+)',(1..$_.Length)})-join' '}

Çevrimiçi deneyin!



3

QBasic, 60 bayt

INPUT s$
FOR i=1TO LEN(s$)
b=MID$(s$,i)>="1
v=-b*v-b
?v
NEXT

Girdiyi dizge olarak alır; çıktıyı yeni satırlarla ayrılmış sayılar olarak verir.

açıklama

Biz dize okumak s$ve döngü igelen 1onun uzunluğuna kadar.

MID$(s$,i)alt idizgiyi karakterden (1 indeksli) dizgenin sonuna kadar alır. Bu bir a ile başlarsa 1, sözlükbilimsel >=olarak string olacaktır "1"; a ile başlarsa 0, olmayacak. Yani balır 0endeksinde karakter eğer iolduğunu 0ya da -1karakter ise1 .

Ardından mevcut değeri güncelleriz v. Eğer sadece bir okursak 0, volmak istiyoruz 0; Aksi takdirde, bir arttırmak istiyoruz v. Başka bir deyişle v = (-b) * (v+1); matematiğin basitleştirilmesi kodda görülen kısa ifadeyi verir. Sonunda, yazdırır vve döngü kurarız.


3

Beyin Flak , 60 bayt

([]){{}<>(())<>{{}<>({}({}))(<>)}{}([])}{}<>{({}[()]<>)<>}<>

Çevrimiçi deneyin!

Açıklama:

([]){  For each element in the input
    {}
    <>(())<>  Push a one to the other stack
    { If the element is one,
       {}<>({}({}))(<>)  Add the one to a copy of the previous number in the series
    }{}  Pop the element
([])}  End loop
{}<>   Pop extra zero
{({}[()]<>)<>}<>   And reverse the output stack, subtracting one from each element


3

C (gcc), 57 52 51 bayt

f(a,l,c,i)int*a;{for(c=i=0;i<l;)a[i++]=c=a[i]*-~c;}

Arnauld Limanı'nın JavaScript cevabı , diziyi yerinde değiştirir. Burada çevrimiçi deneyin .


Bunun K&R C olduğunu söylemek daha doğru olmaz mı?
Tim Seguine

Muhtemelen, ama bu bir sürü cevap için doğru olurdu. Uzman değilim, ama K & R C'nin geçerli olması bile tamamen mümkün değil. Gerçek şu ki, bu sitedeki dil standartlarını pek önemsemiyoruz. Eğer gcc K&R C'yi daha modern şeylerle karıştırmanıza izin veriyorsa, golf oynamak için geçerli olan C, çünkü gcc derleyecektir. Ayrıca bakınız: codegolf.stackexchange.com/questions/2203/tips-for-golfing-in-c
OOBalance

Şimdi C11'in eski tanımlayıcı listesi işlevi sözdizimini hala desteklediğini araştırana kadar fark etmedim, öyleyse boşuna. Ama amacın ne olursa olsun geçerli.
Tim Seguine

1
Önerf(a,l,c)int*a;{for(c=0;l--;)c=*a++*=c+1;}

3

Shakespeare, 365 bayt

I.Ajax,.Ford,.Act I:.Scene I:.[enter Ajax and Ford]Ajax:Open mind!Scene V:.Ford:Am I nicer than the sum of a big red old cute hard cat a big red old cute joy?Ford:If so,you is the sum of thyself a son!Ford:If not,you is zero!Ford:Open heart!Ajax:you is a big red old cute hard cat.Ajax:Speak mind!Ajax:Open mind!Ford:Am I nicer than zero?Ajax:If so, let us Scene V.

burada dene

daha az golf oyunu

I.Ajax,.Ford,.
Act I:.
Scene I:.
[enter Ajax and Ford]
Ajax:Open mind!
Scene V:.
Ford:Am I nicer than the sum of a big red old cute hard cat a big red old cute joy?     <- smallest way to 48 (ascii "0") I could think of
Ford:If so,you is the sum of thyself a son!
Ford:If not,you is zero!
Ford:Open heart!
Ajax:you is a big red old cute hard cat.    <- get value of 32 or space
Ajax:Speak mind!                            <- then output it
Ajax:Open mind!
Ford:Am I nicer than zero?
Ajax:If so, let us Scene V.                 <- loop through inputs

280 bayt . Golf ipuçları için SPL ipuçları sayfasına göz atın .
Jo King,

3

C ++, 47 bayt

[](int*a,int*b){for(int c=0;a!=b;)c=*a++*=1+c;}

Başlangıç ​​ve bitiş işaretçilerine göre diziyi yerinde değiştiren bir lambda.


Çevrimiçi deneyin! (Javascript gerektirir)


55 byte'ta genel sürüm (bu, aritmetik tipte elementler içeren herhangi bir konteyner için çalışır):

[](auto a,auto b){for(auto c=*a-*a;a!=b;)c=*a++*=1+c;};
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.