Dimezza i falsi


19

Compito

Dato un array non vuoto di 0e 1, dimezzare le lunghezze delle corse di 0.

Ingresso

Una matrice di 0e 1. Formato accettabile:

  • Matrice reale nella tua lingua
  • Stringa di 0e separata da avanzamento riga1
  • Stringa contigua di 0e1
  • Qualsiasi altro formato ragionevole

Ad esempio, i seguenti tre ingressi sono tutti accettabili:

  • [1, 0, 0, 1]
  • "1\n0\n0\n1"(dove \nè un avanzamento di riga U + 000A)
  • "1001"

Si può presumere che le corse di 0avranno una lunghezza pari .

Produzione

Un array di 0e 1, nei formati accettabili sopra.

Casi test

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]

punteggio

Questo è . Vince la risposta più breve in byte.

Si applicano scappatoie standard .


Nell'ultimo testcase, le serie di zero non hanno lunghezza pari?
OldBunny2800,

@ OldBunny2800 Leggere attentamente il caso di test; le corse di 0 hanno lunghezze 4, 2, 2, 2, 2 e 2.
HyperNeutrino,

Possiamo prendere truee falseinvece di 1e 0?
Cyoce,

@Cyoce quale lingua?
Leaky Nun,

@LeakyNun Ruby, che considera la 0verità.
Cyoce,

Risposte:



11

05AB1E , 5 byte

00¤.:

Provalo online!

Spiegazione

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

2
È stato facile; perché non ci ho pensato?
Leaky Nun,

00è un comportamento strano ...
Erik the Outgolfer,

@EriktheOutgolfer: le cifre sequenziali sono concatenate per formare un numero, quindi 11sono undici e non 1,1. Un effetto collaterale di ciò è che 00diventa 00invece di 0,0:)
Emigna,

@Emigna Mi sarei aspettato che diventasse 0o 0 0invece, ma qualunque cosa.
Erik the Outgolfer,


7

C (gcc) , 35 byte

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

48 è il codice ascii di '0'

migliore versione 43 byte come suggerito da Neil

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

un'altra volta 40 byte questa volta (sempre come suggerito da Neil & VisualMelon) :)

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

e poi 35 byte grazie a Khaled.K

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

Provalo online!


1
Funzionerebbe s+=2-*s%2?
Neil,

1
Se ho contato correttamente penso che for(;*s;s+=2-*s%2)putchar(*s);salva un altro byte.
Neil,

1
Cosa sarebbe sbagliato s+=50-*s? Non faccio C da anni e non voglio mettermi in imbarazzo invocando un comportamento indefinito (proveniente da C # dove non ce n'è)
VisualMelon

1
Guardando i putchardocumenti, puoi farlo f(char*s){for(;*s;s+=50-putchar(*s));}?
VisualMelon,

3
Puoi salvare 5 byte rendendolo ricorsivof(char*s){*s&&f(s+50-putchar(*s));}
Khaled.K,



6

Java, 50 byte

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

Prova online


1
Un'ottima scelta di input! A proposito, se siete interessati a passare a una soluzione Java 8 +, è possibile utilizzare un lambda: s->s.replaceAll("00","0").
Jakob,

Ancora meglio, usa replaceinvece di replaceAllsalvare 3 byte
Benjamin Urquhart il

@BenjaminUrquhart replacesostituirà solo la prima occorrenza
Khaled.K

@ Khaled.K in javascript, sì. In java, sostituisce tutte le occorrenze
Benjamin Urquhart il

5

Haskell , 28 byte

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

Provalo online!

Prende ricorsivamente il primo elemento, rilasciando il secondo se il primo è zero, fino all'elenco di vuoto. Se la prima voce è h, la prima 1-hviene eliminata dal resto.


5

Japt , 7 6 5 byte

d'0²0

Provalo online!

Sostituisce semplicemente ogni serie di due zero nell'input con uno zero. Utilizza l'input di stringa (ovvero "1001001").


1
Bello! Non hai nemmeno bisogno del 'credo
ETHproductions

Ooh, puoi salvare un altro byte sostituendolo "00"con '0²:-)
ETHproductions

Bene, è strano. Grazie comunque!
Luca,

4

PHP, 26

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

sostituisci semplicemente tutto 00con 0.


4

Alice , 13 byte

/oe00/
@iS0e\

Provalo online!

Spiegazione

/.../
@...\

Questo è un semplice modello per programmi lineari che funzionano interamente in modalità Ordinale. L'iniziale /riflette l'IP per spostarsi a sud-est e poi rimbalza in diagonale su e giù attraverso il codice fino alla fine dei mirror. Questi semplicemente spostano la posizione di uno in modo tale che al ritorno l'IP attraversi le celle rimanenti. Leggendo il codice in questo modo a zigzag diventa:

ie00e0So@

Questa è una semplice sostituzione di stringa:

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.

Esistono altri modi per spingere le due stringhe, ad esempio '00'0o e000t, ma non ho trovato nulla che superi i 5 byte lì (e dovrei radere due byte per accorciare il programma).


2
Sembra che ti sia innamorata di Alice di recente ...
Leaky Nun,

6
@LeakyNun Per favore, non dirlo a mia moglie ...
Martin Ender,

@MartinEnder Lo dirò alla signora Ender!
Erik the Outgolfer,



3

JavaScript (ES6), 26 21 byte

Prende l'input come stringa e restituisce una stringa.

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

Provalo

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 byte

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

Accetta una stringa tramite input e condensa i doppi zeri. Facile.


3

Gelatina , 8 byte

ṣ1j1,1m2

Provalo online!

Forse altre risposte in lingue senza .replace()o simili potrebbero usare questo trucco.

Spiegazione

ṣ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 anni 10 byte

2 byte salvati grazie a Martin Ender

i.h%.7%$io

Provalo online!

Spiegazione

Questo è un codice 1-D che funziona in modalità cardinale, quindi è facile seguirne il flusso:

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

Puoi effettivamente salvare altri due byte coni.h%...
Martin Ender

@MartinEnder sei una persona malvagia, vai in giro a insegnare alle persone a giocare sporco ...: D
Leo,

2

Python (elenco I / O), 36 byte

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

Provalo online!

Prende ricorsivamente il primo elemento, quindi rimuove quello rimanente se il primo era zero.


38 byte:

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

Provalo online Questo prende un elenco Python e genera un elenco Python sostituendo la sua rappresentazione di stringa. L'I / O di stringa consentirebbe una soluzione più diretta e più breve, come ad esempio

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

per il '1001' formato.


La prima risposta con il formato specificato, carino.
Leaky Nun,

1
I / O stringa è consentito. lambda s:s.replace('00','0')dovrebbe andare bene.
Jonathan Allan,


2

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

<>if/0/

Accetta input come numeri separati da nuova riga. Salta la riga successiva se vede uno zero.


2

V , 4 byte

òf0x

Provalo online!

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

2

MATL , 5 byte

FFOZt

Provalo online!

Spiegazione

Questo è simile alla risposta Octave di Stewie Griffin :

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

8 byte

vy~f2L)(

Questo evita la sostituzione di stringa / array integrata.

Provalo online!

Spiegazione

Considera l'input [1,0,0,1,0,0,1]come esempio:

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 byte

ḅ{cẹ|ḍh}ᵐc

Provalo online!

Non sono sicuro che sia ottimale ancora ...

Spiegazione

Questo sfrutta il bug che csu un elenco di numeri interi con zero iniziali non riuscirà.

ḅ               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

Come è un bug?
Leaky Nun,

@LeakyNun Dovremmo essere in grado di concatenare [0,0,4,2]in 42. Gli zero iniziali lo fanno fallire proprio ora perché è qui per prevenire infiniti zero iniziali quando l'ingresso è una variabile, ma qui l'ingresso è completamente messo a terra in modo che la limitazione non dovrebbe esistere.
Fatalizza

Scriveresti una risposta 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);}

Provalo online!

Non è né pulito né corto, ma funziona.

Accetta input come una stringa contigua di caratteri, output nello stesso formato

Spiegazione:

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

Nota

Sì, sono consapevole che questo potrebbe essere fatto semplicemente usando s.Replace("00","0"), il mio obiettivo era quello di evitare di usare la soluzione ovvia. Dopotutto, il punto centrale di PPCG è divertirsi, giusto? ;)


@ Mr.Xcoder Non è vero. Si tratta di giocare a golf il più possibile senza usare il linguaggio integrato Replace . Sto usando C #, quindi non ho delusioni su come ottenere il codice più breve possibile, specialmente con lingue come Jelly in giro, quindi potrei anche divertirmi un po ' nel processo.
Skidsdev,

ovviamente anche il divertimento è importante. Mi scuso per il commento sopra e devo ammettere che mi è piaciuta la tua risposta (la tecnica che hai usato).
Mr. Xcoder,

@ Mr.Xcoder nessun sentimento duro, alla fine siamo tutti qui per divertirci e flettere la nostra capacità altrimenti inutile di comprimere il codice il più possibile;)
Skidsdev

Puoi fare molto più breve di questo senza sostituirlo! string a(string s){var r="";for(int i=0;i<s.Length;i+=50-s[i])r+=s[i];return r;} (sembra che questa sia sostanzialmente la risposta C)
VisualMelon

1

Pyth, 8 byte

:z"00"\0

Link di prova.

Spiegazione:

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

Prima prova a fare qualsiasi cosa con Awk, quindi potrebbe essere possibile giocare a golf di più.

{gsub(00,0);print}

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


1

Lotto, 24 byte

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

Takes input on STDIN. Somewhat competitive for once.


1

Common Lisp, SBCL, 48 32 bytes

-16 bytes thanks to Julian Wolf

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

input:

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

output:

1001110

Explanation

We read input list. List is used in format function. We loop through it outputting 1 if element is 1 and outputting 0 and skipping next element of list for 0.


Using ~[ rather than ~:[ lets you index with 0 and 1 directly, which should save you a bunch of bytes
Julian Wolf

@JulianWolf Thank you!

1

Mathematica, 24 bytes

StringReplace["00"->"0"]

A function that expects a string of "0"s and "1"s and returns a similar string. Self-explanatory syntax. Mathematica has lots of transformation builtins; the key is to use one that transforms every relevant subexpression (unlike /.) but only passes through the expression once (unlike //.).


1

Jelly, 10 bytes

Œg¹m2$S?€F

Try it online!

Explanation

Œ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.
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.