I bit 1 consecutivi sono incrementati


36

Dato uno schema (formato stringa o matrice) di bit: [0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,1]

Il compito è sostituire un numero qualsiasi di 1 bit consecutivi con una sequenza numerica crescente a partire da 1.

Ingresso

  • Pattern (può essere ricevuto come stringa o array) Esempio:
    • Stringa: 1001011010110101001
    • Array: [1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1]

Produzione

  • Sequenza numerica crescente (può essere restituita come stringa o matrice) Esempio:
    • Stringa: 1 0 0 1 0 1 2 0 1 0 1 2 0 1 0 1 0 0 1
    • Array: [1, 0, 0, 1, 0, 1, 2, 0, 1, 0, 1, 2, 0, 1, 0, 1, 0, 0, 1]

Regole

  • (si applicano solo per le stringhe) L' input non contiene spazi tra 1e0
  • Assumi input length > 0
  • (applica solo per le stringhe) L' output è separato dallo spazio (usa qualsiasi altro separatore se ne hai bisogno purché non sia un numero o una lettera dell'alfabeto)

Esempio:

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

Criteri vincenti: Codegolf

Risposte:


19

05AB1E , 4 byte

γ€ƶ˜

Provalo online! o come seme di prova

Spiegazione

γ      # 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, meglio del mio. Non ci avrei mai pensato.
Magic Octopus Urn

3
Non ho familiarità al 100% con le regole di conteggio dei byte di codegolf (e googling ha trovato solo questo post che non è giunto a una conclusione). Mentre la tua risposta è di 4 caratteri non dovrebbe essere almeno 8 byte (ad es. Utf-16-be senza BOM 03 B3 20 AC 01 B6 02 DC) o 9 byte (utf-8:) CE B3 E2 82 AC C6 B6 CB 9Co 10 byte (ad es. UTF-16 inclusa la BOM a 2 byte) in qualche codifica non giocattolo? (Sì, si potrebbe costruire una codifica giocattolo a 8 bit simile alle codifiche iso-8859 con questi 4 simboli rappresentati come 1 byte, ma questo sembra un imbroglio.)
dr jimbob

6
@drjimbob Sì, bella domanda. Il codice può effettivamente essere convertito in un file binario utilizzando la tabella codici 05AB1E . Ad esempio, γ€ƶ˜sarebbe rappresentato come 04 80 8F 98. La tabella codici esiste principalmente per facilitare la scrittura del codice. Per eseguire questo file a 4 byte, è necessario eseguire l'interprete con il --osabieflag.
Adnan,

18

Haskell , 15 byte

scanl1$(*).succ

Provalo online!

Spiegazione / Ungolfed

scanl1 scorre da un elenco a sinistra usando una funzione che prende l'ultimo risultato e l'elemento corrente genera un nuovo elenco con i risultati, lasciando gli elenchi vuoti e i singoli punti "non modificati".

(*).succ è l'equivalente di \x y-> (x+1)*y

L'uso di questa funzione insieme funziona scanl1solo perché le sequenze crescenti ( 1,2,3, .. ) iniziano con 1 e non hanno alcun elemento precedente (nel qual caso è il primo elemento nell'elenco che non sarà "modificato") o hanno uno 0 iniziale .



14

Buccia , 5 4 3 byte

ṁ∫g

Provalo online!

Spiegazione

ṁ∫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]

Modifica cronologia

-1 byte usando scanl1overzipWith

-1 byte eseguendo il porting della soluzione di Dennis



11

JavaScript (ES6), 22 byte

Accetta input come un array.

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

Provalo online!

a=>a.map(n=>a=n*-~a)Purtroppo il più breve (20 byte) fallirebbe a [1]causa della coercizione di matrici singleton sull'intero che stanno trattenendo.


10

J , 4 byte

#.~\

Una porta della soluzione APL di Bubbler

Provalo online!

J , 8 byte

i.&0@|.\

Come?

È semplicemente la distanza dalla precedente 0

       \  for each prefix
     |.   reverse it
    @     and
i.&0      find the index of the first 0

Provalo online!



6

Gelatina , 4 byte

‘×¥\

Provalo online!

‘×¥\
   \   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 byte

Soluzione:

{y*1+x}\

Provalo online!

Spiegazione:

Scorrere l'elenco. Incrementa l'accumulatore, moltiplica per l'articolo corrente (che ripristina l'accumulatore se l'articolo è 0):

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

5

Gelatina , 4 byte

ŒgÄF

Provalo online!

Come funziona

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

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

Con il gruppo che corre veloce, Erik aveva suggerito che sarebbero stati tre byte! (Se avessi capito cosa avrebbe fatto correttamente)
Dylnan,

@dylnan Il problema è che è difficile decidere un comportamento così rapido. :( Ecco perché la rapida è ancora in pausa.
Erik the Outgolfer,

Potrebbero esserci più rapidi per le principali possibili implementazioni
dylnan,


5

RAD, 8 byte

(⊢×1+⊣)⍂

Provalo online!

Come?

  • (⊢×1+⊣), se l'argomento giusto è 0, return 0, altrimenti incrementa l'argomento sinistro
  • , LTR Scan ( (A f B) f Cinvece di A f (B f C)), applica questo attraverso l'array

4

Japt, 7 6 5 byte

åÏ*°X

Provalo


Spiegazione

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

4

Java 8, 55 48 byte

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

Modifica l'input-array invece di restituirne uno nuovo per salvare i byte.

-7 byte grazie a @TimSeguine .

Provalo online.

Spiegazione:

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
Puoi a->{int p=0,i=0;for(int b:a)a[i++]=b<1?p=0:++p;}
raderlo

@TimSeguine Grazie! Ora che lo vedo non riesco a credere di non averci pensato da solo.
Kevin Cruijssen,

1
Sono stato in grado di liberarmi di p, ma ha le stesse dimensioni :(a->{int i=0;for(int v:a)a[i]+=v*i++<1?0:a[i-2];}
Tim Seguine

4

TIS , 68 + 33 = 101 byte

Codice (68 byte):

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

Layout (33 byte):

2 1 CC I0 ASCII - O0 NUMERIC - 32

Provalo online!

Spiegazione:

|    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 byte

ẋ+⊣¦_

Provalo online!

Spiegazione

ẋ+⊣¦_     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

Ugh, ho pensato che i caratteri del codice SE fossero monospace ...


Sono monospace ... C'è uno spazio mancante nella prima riga.
micsthepick,

Guarda la modifica. È ancora disallineato.
Mr. Xcoder,

Devi guardare da un dispositivo mobile o qualcosa del genere - Mi sembra perfetto
micsthepick,

@micsthepick Non sono ...
Mr. Xcoder,


4

Perl 6 , 29 24 18 byte

-6 byte grazie a Sean!

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

Provalo online!

La funzione interiore potrebbe essere ($+=1)*=* , ma poi la variabile anonima persisterebbe tra le chiamate di funzione. Ci riusciamo avvolgendolo in un blocco di codice esplicito.

Spiegazione:

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

Ho avuto lo stesso approccio di base verso il basso a 16 byte: *.map(($+=1)*=*). Questa soluzione ha la condizione che la variabile di stato $persista per tutte le chiamate alla funzione, quindi se l'elemento finale passato a una chiamata e il primo elemento passato alla chiamata successiva sono entrambi diversi da zero, il conteggio inizierà con un numero errato.
Sean,

@Sean, sì, mi ricordo di aver lottato con quello quando ho risposto inizialmente. Fortunatamente da allora ho imparato
Jo King,

Si può battere un altro byte off: *.map:{...}.
Sean,


3

Haskell , 19 byte

scanl1$((*)=<<).(+)

Provalo online!

Spiegazione: Il codice è equivalente a scanl1(\b a->(b+a)*a), dove si btrova il bit corrente ed aè l'accumulatore. scanl1prende un elenco, crea un'istanza del primo elemento dell'elenco come accumulatore, piega l'elenco e raccoglie i valori intermedi in un nuovo elenco.

Modifica: BMO mi ha battuto di pochi secondi e 4 byte .


3

Pyth , 6 byte

m=Z*hZ

Provalo qui!

Come funziona

m = Z * hZ - Programma completo. Q = input valutato.
m - Per ogni numero intero in Q.
 = Z - Assegna la variabile Z (preinizializzata a 0) a ...
   * hZ - (Z + 1) * d; (d è implicito alla fine).

3

Volevo ottenere una risposta usando espressioni regolari. C'è probabilmente una soluzione più semplice che lascio come esercizio per il lettore.

PowerShell Core , 86 byte

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

Provalo online!



3

QBasic, 60 byte

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

Prende l'input come stringa; fornisce l'output come numeri separati da newline.

Spiegazione

Leggiamo la stringa s$e ciclo ida 1fino alla sua lunghezza.

MID$(s$,i)ottiene la sottostringa dal carattere i(1-indicizzato) alla fine della stringa. Se questo inizia con a 1, sarà lessicograficamente >=la stringa "1"; se inizia con a 0, non lo sarà. Quindi bottiene 0se il personaggio all'indice iè 0, o -1se il personaggio è 1.

Successivamente, aggiorniamo il valore corrente v. Se leggiamo solo a 0, vogliamo vdiventare 0; altrimenti, vogliamo incrementare vdi uno. In altre parole v = (-b) * (v+1),; la semplificazione della matematica fornisce l'espressione più breve vista nel codice. Infine, stampiamo ve ripetiamo.


3

Brain-Flak , 60 byte

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

Provalo online!

Spiegazione:

([]){  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 byte

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

La risposta JavaScript di Port of Arnauld modifica l'array sul posto. Provalo online qui .


Non sarebbe più preciso affermare che si tratta di K&R C?
Tim Seguine,

Forse, ma ciò sarebbe vero per molte risposte. Non sono un esperto, ma è del tutto possibile che non sia nemmeno valido K&R C. Il fatto è che non ci interessa davvero gli standard linguistici su questo sito. Se gcc ti consente di mescolare K&R C con roba più moderna, allora è C valido ai fini del golf perché gcc lo compilerà. Vedi anche: codegolf.stackexchange.com/questions/2203/tips-for-golfing-in-c
OOBalance

Fino a quel momento non mi ero reso conto che C11 supporta ancora la vecchia sintassi della funzione dell'elenco di identificatori, quindi non importa. Ma il tuo punto vale indipendentemente.
Tim Seguine,

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

3

Shakespeare, 365 byte

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.

provalo qui

versione meno golfizzata

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 byte . Dai un'occhiata alla pagina dei suggerimenti SPL per i suggerimenti sul golf.
Jo King,

3

C ++, 47 byte

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

Una lambda che modifica una matrice in atto, dati i puntatori di inizio e fine.


Provalo online! (richiede Javascript)


Versione generica a 55 byte (funziona con qualsiasi contenitore con elementi di tipo aritmetico):

[](auto a,auto b){for(auto c=*a-*a;a!=b;)c=*a++*=1+c;};
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.