Reducir a la mitad los falsos


19

Tarea

Dado un conjunto no vacío de 0y 1, reducir a la mitad las longitudes de las ejecuciones de 0.

Entrada

Una serie de 0y 1. Formato aceptable:

  • Matriz real en tu idioma
  • Cadena separada por salto de línea de 0y1
  • Cadena contigua de 0y1
  • Cualquier otro formato razonable

Por ejemplo, las siguientes tres entradas son todas aceptables:

  • [1, 0, 0, 1]
  • "1\n0\n0\n1"(donde \nhay un salto de línea U + 000A)
  • "1001"

Puede suponer que las carreras de 0tendrán una longitud uniforme .

Salida

Una serie de 0y 1, en los formatos aceptables anteriores.

Casos de prueba

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]

Puntuación

Este es el . La respuesta más corta en bytes gana.

Se aplican lagunas estándar .


En el último caso de prueba, ¿las corridas de ceros no tienen una longitud uniforme?
OldBunny2800

@ OldBunny2800 Lea el caso de prueba cuidadosamente; las carreras 0 tienen longitudes 4, 2, 2, 2, 2 y 2.
HyperNeutrino

¿Podemos tomar truey en falselugar de 1y 0?
Cyoce

@ ¿Qué idioma?
Leaky Nun

@LeakyNun Ruby, que se considera 0veraz.
Cyoce

Respuestas:



11

05AB1E , 5 bytes

00¤.:

Pruébalo en línea!

Explicación

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

2
Eso fue fácil; ¿Por qué no pensé en eso?
Leaky Nun

00es un comportamiento extraño ...
Erik the Outgolfer

@EriktheOutgolfer: los dígitos secuenciales se concatenan para formar un número, entonces 11son once y no 1,1. Un efecto secundario de eso es que se 00convierte en 00lugar de 0,0:)
Emigna

@Emigna hubiera esperado que se convirtiera 0o en su 0 0lugar, pero lo que sea.
Erik the Outgolfer


7

C (gcc) , 35 bytes

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

48 es el código ascii de '0'

mejor versión 43 bytes como lo sugiere Neil

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

otro de 40 bytes esta vez (nuevamente como lo sugirieron Neil y VisualMelon) :)

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

y luego 35 bytes gracias a Khaled.K

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

Pruébalo en línea!


1
Funcionaria s+=2-*s%2?
Neil

1
Si he contado correctamente, creo que for(;*s;s+=2-*s%2)putchar(*s);guarda otro byte.
Neil

1
¿Qué estaría mal con s+=50-*s? No he hecho C durante años y no quiero avergonzarme invocando un comportamiento indefinido (proveniente de C # donde no hay ninguno)
VisualMelon

1
Mirando los putchardocumentos, ¿puedes hacer f(char*s){for(;*s;s+=50-putchar(*s));}?
VisualMelon

3
Puede guardar 5 bytes por lo que es recursivof(char*s){*s&&f(s+50-putchar(*s));}
Khaled.K



6

Java, 50 bytes

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

Probar en línea


1
¡Una muy buena opción de entrada! Por cierto, si usted está interesado en cambiar a una solución de Java 8+, se puede utilizar una lambda: s->s.replaceAll("00","0").
Jakob

Aún mejor, use en replacelugar de replaceAllguardar 3 bytes
Benjamin Urquhart

@BenjaminUrquhart replacesolo reemplazará la primera aparición
Khaled.K

@ Khaled.K en javascript, sí. En Java, reemplaza todos los sucesos
Benjamin Urquhart

5

Haskell , 28 bytes

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

Pruébalo en línea!

Recursivamente toma el primer elemento, dejando caer el segundo si el primero es cero, hasta la lista de vacíos. Si la primera entrada es h, entonces las primeras 1-hse eliminan del resto.


5

Japt , 7 6 5 bytes

d'0²0

Pruébalo en línea!

Simplemente reemplaza cada ejecución de dos ceros en la entrada por un cero. Utiliza la entrada de cadena (es decir "1001001").


1
¡Agradable! Ni siquiera necesitas el 'Creo
ETHproductions

Ooh, puedes guardar otro byte reemplazándolo "00"con '0²:-)
ETHproductions

Bueno, eso es raro. Gracias sin embargo!
Lucas

4

PHP, 26

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

simplemente reemplace todo 00por 0.


4

Alice , 13 bytes

/oe00/
@iS0e\

Pruébalo en línea!

Explicación

/.../
@...\

Esta es una plantilla simple para programas lineales que operan completamente en modo ordinal. La inicial /refleja la IP para moverse hacia el sureste y luego rebota diagonalmente hacia arriba y hacia abajo a través del código hasta los espejos al final. Esos simplemente compensan la posición en uno para que en el camino de regreso la IP atraviese las celdas restantes. Al leer el código de esta manera en zigzag se convierte en:

ie00e0So@

Esta es una simple sustitución de cadena:

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.

Hay algunas otras formas de insertar las dos cadenas, por ejemplo, '00'0o e000t, pero no he encontrado nada que supere los 5 bytes (y tendría que reducir dos bytes para poder acortar el programa).


2
Parece que te enamoraste de Alice recientemente ...
Leaky Nun

66
@LeakyNun Por favor, no le digas a mi esposa ...
Martin Ender

@ Martininder ¡Se lo diré a la señora Ender!
Erik the Outgolfer



3

JavaScript (ES6), 26 21 bytes

Toma la entrada como una cadena y devuelve una cadena.

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

Intentalo

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 bytes

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

Toma una cadena a través de la entrada y condensa los ceros dobles. Fácil.


3

Jalea , 8 bytes

ṣ1j1,1m2

Pruébalo en línea!

Posiblemente otras respuestas en idiomas sin un .replace() o similar podrían usar este truco.

Explicación

ṣ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 bytes

2 bytes guardados gracias a Martin Ender

i.h%.7%$io

Pruébalo en línea!

Explicación

Este es un código 1-D que funciona en modo cardinal, por lo que es fácil seguir su flujo:

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

De hecho, puede guardar dos bytes más coni.h%...
Martin Ender

@MartinEnder eres una persona malvada, enseñando a la gente a jugar sucio ...: D
Leo

2

Python (lista de E / S), 36 bytes

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

Pruébalo en línea!

Recursivamente toma el primer elemento, luego elimina el restante si el primero era cero.


38 bytes:

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

Pruébelo en línea Esto toma una lista de Python y genera una lista de Python al reemplazar su representación de cadena. La E / S de cadena permitiría una solución más directa y más corta, como

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

para el '1001' formato


La primera respuesta con el formato especificado, agradable.
Leaky Nun

1
La cadena de E / S está permitida. lambda s:s.replace('00','0')debería estar bien.
Jonathan Allan


2

Perl 5, 7 + 1 (bandera -p) = 8 bytes

<>if/0/

Toma la entrada como números separados por nueva línea. Omite la siguiente línea si ve un cero.



2

MATL , 5 bytes

FFOZt

Pruébalo en línea!

Explicación

Esto es similar a la respuesta Octave de Stewie Griffin :

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

8 bytes

vy~f2L)(

Esto evita el reemplazo de cadena / matriz incorporado.

Pruébalo en línea!

Explicación

Considere la entrada [1,0,0,1,0,0,1]como un ejemplo:

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 bytes

ḅ{cẹ|ḍh}ᵐc

Pruébalo en línea!

No estoy seguro de que esto sea óptimo todavía ...

Explicación

Esto explota el error que cfallará en una lista de enteros que tiene ceros a la izquierda.

ḅ               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

¿Cómo es eso un error?
Leaky Nun

@LeakyNun Deberíamos poder concatenarnos [0,0,4,2]en 42. Los ceros a la izquierda hacen que falle ahora porque está aquí para evitar los ceros a la izquierda infinitos cuando la entrada es una variable, pero aquí la entrada está totalmente conectada a tierra, por lo que no debería existir limitación.
Fatalize

¿Escribirías una respuesta de Prolog?
Leaky Nun

1

C #, 191 bytes

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

Pruébalo en línea!

No es ni limpio ni corto, pero funciona.

Toma la entrada como una cadena contigua de caracteres, las salidas en el mismo formato

Explicación:

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í, soy consciente de que esto podría hacerse simplemente usando s.Replace("00","0"), mi objetivo era evitar usar la solución obvia. Después de todo, el objetivo de PPCG es divertirse, ¿verdad? ;)


@ Mr.Xcoder Eso no es cierto. Esto es lo más complejo posible sin usar el lenguaje incorporado Replace . Estoy usando C #, así que no me engaño acerca de obtener el código más corto posible, especialmente con lenguajes como Jelly, por lo que podría divertirme un poco. en el proceso.
Skidsdev

Por supuesto, la diversión también es importante. Pido disculpas por el comentario anterior y debo admitir que me gustó su respuesta (la técnica que utilizó).
Sr. Xcoder

@ Mr.Xcoder no tiene resentimientos, en última instancia, todos estamos aquí para divertirnos y flexibilizar nuestra capacidad inútil de comprimir el código tanto como sea posible;)
Skidsdev

¡Puedes hacer mucho más corto que esto sin reemplazarlo! string a(string s){var r="";for(int i=0;i<s.Length;i+=50-s[i])r+=s[i];return r;} (Parece que esta es básicamente la respuesta C)
VisualMelon

1

Pyth, 8 bytes

:z"00"\0

Enlace de prueba.

Explicación:

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

Primero intente hacer algo con Awk para que sea posible jugar más al golf.

{gsub(00,0);print}

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


1

Lote, 24 bytes.

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

Toma entrada en STDIN. Algo competitivo por una vez.


1

Common Lisp, SBCL, 48 32 bytes

-16 bytes gracias a Julian Wolf

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

entrada:

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

salida:

1001110

Explicación

Leemos la lista de entrada. La lista se usa en la formatfunción. Lo recorremos generando 1si el elemento es 1y enviando 0y omitiendo el siguiente elemento de la lista 0.


Usar en ~[lugar de ~:[permitirle indexar con 0 y 1 directamente, lo que debería ahorrarle un montón de bytes
Julian Wolf

@JulianWolf ¡Gracias!

1

Mathematica, 24 bytes

StringReplace["00"->"0"]

Una función que espera una cadena de "0"s y "1"s y devuelve una cadena similar. Sintaxis autoexplicativa. Mathematica tiene muchas transformaciones integradas; la clave es usar uno que transforme cada subexpresión relevante (diferente /.) pero que solo pase por la expresión una vez (diferente //.).


1

Jalea , 10 bytes

Œg¹m2$S?€F

Pruébalo en línea!

Explicación

Œ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.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.