Metade dos falsos


19

Tarefa

Dada uma matriz não vazia de 0e 1, reduza pela metade os comprimentos das execuções de 0.

Entrada

Uma matriz de 0e 1. Formato aceitável:

  • Matriz real no seu idioma
  • Sequência separada por avanço de linha de 0e1
  • Sequência contígua de 0e1
  • Qualquer outro formato razoável

Por exemplo, as três entradas a seguir são aceitáveis:

  • [1, 0, 0, 1]
  • "1\n0\n0\n1"(onde \né um avanço de linha U + 000A)
  • "1001"

Você pode supor que as execuções de 0terão duração uniforme .

Resultado

Uma matriz de 0e 1, nos formatos aceitáveis ​​acima.

Casos de teste

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]

Pontuação

Isso é . A resposta mais curta em bytes vence.

Aplicam-se brechas padrão .


No último caso de teste, as execuções de zeros não têm tamanho uniforme?
— OldBunny2800

@ OldBunny2800 Leia o caso de teste com atenção; Os 0-funcionamentos têm comprimentos 4, 2, 2, 2, 2, e 2.
— HyperNeutrino

Podemos pegar truee em falsevez de 1e 0?
— Cyoce 3/17/17

@Cyoce qual idioma?
— Leaky Nun

@LeakyNun Ruby, que considera 0ser verdade.
— Cyoce 3/17/17

Respostas:



11

05AB1E , 5 bytes

00¤.:

Experimente online!

Explicação

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

2
Essa foi fácil; por que não pensei nisso?
— Leaky Nun

00é um comportamento estranho ...
— Erik o Outgolfer

@EriktheOutgolfer: dígitos sequenciais são concatenados para formar um número, assim 11como onze e não 1,1. Um efeito colateral que é que 00se torna 00, em vez de 0,0:)
— Emigna

@ Emigna, eu esperava que se tornasse 0ou melhor 0 0, mas tanto faz.
— Erik the Outgolfer


7

C (gcc) , 35 bytes

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

48 é o código ascii de '0'

versão melhorada de 43 bytes, conforme sugerido por Neil

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

outro de 40 bytes desta vez (novamente como sugerido por Neil & VisualMelon) :)

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

e, em seguida, 35 bytes, graças a Khaled.K

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

Experimente online!


11
Funcionaria s+=2-*s%2?
— Neil

11
Se contei corretamente, acho que for(;*s;s+=2-*s%2)putchar(*s);salva outro byte.
— Neil

11
O que haveria de errado s+=50-*s? Não Realizado C para idades e não quero me envergonhar invocando um comportamento indefinido (vindo do C #, onde não há nenhum)
— VisualMelon

11
Olhando para os putchardocumentos, você pode fazer f(char*s){for(;*s;s+=50-putchar(*s));}?
— VisualMelon 3/17/17

3
Você pode salvar 5 bytes, tornando-recursivaf(char*s){*s&&f(s+50-putchar(*s));}
— Khaled.K



6

Java, 50 bytes

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

Experimente on-line


11
Uma ótima opção de entrada! By the way, se você estiver interessado em mudar para solução de um Java 8+, você poderia usar um lambda: s->s.replaceAll("00","0").
— Jakob

Ainda melhor, use em replacevez de replaceAllsalvar 3 bytes
— Benjamin Urquhart

@BenjaminUrquhart replacesubstituirá apenas a primeira ocorrência
— Khaled.K

@ Khaled.K em javascript, sim. No java, ele substitui todas as ocorrências
— Benjamin Urquhart

5

Haskell , 28 bytes

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

Experimente online!

Recursivamente leva o primeiro elemento, descartando o segundo se o primeiro for zero, até a lista de vazio. Se a primeira entrada for h, a primeira 1-hserá descartada do restante.


5

Japonês , 7 6 5 bytes

d'0²0

Experimente online!

Simplesmente substitui cada execução de dois zeros na entrada por um zero. Usa entrada de string (ou seja "1001001").


11
Agradável! Você nem precisa do que 'eu penso
— ETHproductions

Ooh, você pode salvar outro byte, substituindo "00"com '0²:-)
— ETHproductions

Bem, isso é estranho. Obrigado embora!
— Luke

4

PHP, 26

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

simplesmente substitua tudo 00por 0.


4

Alice , 13 bytes

/oe00/
@iS0e\

Experimente online!

Explicação

/.../
@...\

Este é um modelo simples para programas lineares que operam inteiramente no modo Ordinal. A inicial /reflete o IP para se mover para o sudeste e, em seguida, salta na diagonal para cima e para baixo através do código até os espelhos no final. Eles simplesmente deslocam a posição em um para que, no caminho de volta, o IP atravesse as células restantes. Lendo o código dessa maneira em zigue-zague, ele se torna:

ie00e0So@

Esta é uma substituição simples de string:

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.

Existem algumas outras maneiras de enviar as duas strings, por exemplo, '00'0ou e000t, mas eu não encontrei nada que ultrapasse 5 bytes lá (e eu teria que cortar dois bytes para reduzir o programa).


2
Parece que você se apaixonou por Alice recentemente ...
— Leaky Nun

6
@LeakyNun Por favor não diga a minha mulher ...
— Martin Ender

@MartinEnder Vou contar isso para a Sra. Ender!
— Erik the Outgolfer



3

JavaScript (ES6), 26 21 bytes

Pega a entrada como uma sequência e retorna uma sequência.

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

Tente

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 uma string via entrada e condensa zeros duplos. Fácil.


3

Gelatina , 8 bytes

ṣ1j1,1m2

Experimente online!

Possivelmente outras respostas em idiomas sem um .replace()ou similar podem usar esse truque.

Explicação

ṣ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 economizados graças a Martin Ender

i.h%.7%$io

Experimente online!

Explicação

Este é um código 1-D que opera no modo cardinal, por isso é fácil seguir seu fluxo:

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

Você pode realmente salvar mais dois bytes comi.h%...
— Martin Ender

@MartinEnder você é uma pessoa má, indo em torno de ensinar as pessoas a jogar sujo ...: D
— Leo

2

Python (E / S da lista), 36 bytes

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

Experimente online!

Pega recursivamente o primeiro elemento e remove o restante se o primeiro for zero.


38 bytes:

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

Experimente on-line Isso pega uma lista de Python e gera uma lista de Python, substituindo sua representação de string. A E / S da string permitiria uma solução mais direta e mais curta, como

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

para o '1001' formato.


A primeira resposta com o formato especificado, legal.
— Leaky Nun

11
E / S de sequência é permitida. lambda s:s.replace('00','0')deve ficar bem.
— Jonathan Allan


2

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

<>if/0/

Recebe a entrada como números separados por nova linha. Pula a próxima linha se encontrar um zero.



2

MATL , 5 bytes

FFOZt

Experimente online!

Explicação

Isso é semelhante à resposta 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)(

Isso evita a substituição de string / array incorporada.

Experimente online!

Explicação

Considere a entrada [1,0,0,1,0,0,1]como um exemplo:

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

Braquilog , 10 bytes

ḅ{cẹ|ḍh}ᵐc

Experimente online!

Ainda não tenho certeza de que isso é ótimo…

Explicação

Isso explora o erro que cem uma lista de números inteiros com zeros à esquerda irá falhar.

ḅ               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

Como isso é um bug?
— Leaky Nun

@LeakyNun Devemos ser capazes de concatenar [0,0,4,2]em 42. Zeros à esquerda fazem com que falhe agora, porque está aqui para evitar zeros à esquerda infinitos quando a Entrada é uma variável, mas aqui a Entrada é totalmente aterrada para que a limitação não exista.
— Fatalize

Você escreveria uma resposta do Prolog?
— Freira vazando

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

Experimente online!

Não é limpo nem curto, mas funciona.

Recebe entrada como uma sequência de caracteres contígua, produz no mesmo formato

Explicação:

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

Sim, eu sei que isso pode ser feito simplesmente usando s.Replace("00","0"), meu objetivo era evitar o uso da solução óbvia. Afinal, o objetivo do PPCG é se divertir, certo? ;)


@ Mr.Xcoder Isso não é verdade. Isso é o máximo que você pode obter sem usar o built-in do idioma. Replace Estou usando C #; portanto, não tenho ilusões em obter o código mais curto possível, especialmente em idiomas como o Jelly, por isso é muito divertido. no processo.
— Skidsdev 3/05

é claro que a diversão também é importante. Peço desculpas pelo comentário acima e devo admitir que gostei da sua resposta (a técnica que você usou).
— Sr. Xcoder

@ Mr.Xcoder sem ressentimentos, afinal estamos todos aqui para nos divertir e flexibilizar nossa capacidade inútil de comprimir o código o máximo possível;) #
— Skidsdev

Você pode fazer muito mais curto que isso sem substituir! string a(string s){var r="";for(int i=0;i<s.Length;i+=50-s[i])r+=s[i];return r;} (parece que este é, basicamente, a resposta C)
— VisualMelon

1

Pitão, 8 bytes

:z"00"\0

Link Try-it.

Explicação:

: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

Primeiro, tente fazer qualquer coisa com o Awk, para que seja possível jogar mais.

{gsub(00,0);print}

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


1

Lote, 24 bytes

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

Recebe entrada em STDIN. Um pouco competitivo pela primeira vez.


1

Lisp comum, SBCL, 48 32 bytes

-16 bytes graças a Julian Wolf

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

entrada:

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

resultado:

1001110

Explicação

Lemos a lista de entrada. Lista é usada em formatfunção. Nós passamos por ele emitindo 1se o elemento estiver 1e emitindo 0e pulando o próximo elemento da lista para 0.


Usando ~[ao invés de ~:[deixa-o índice com 0 e 1 diretamente, o que deve poupar um monte de bytes
— Julian Lobo

@JulianWolf Thank you!

1

Mathematica, 24 bytes

StringReplace["00"->"0"]

Uma função que espera uma série de "0"s e "1"s e retorna uma string similar. Sintaxe auto-explicativa. O Mathematica possui muitas funções de transformação; a chave é usar uma que transforme cada subexpressão relevante (diferente /.), mas só passe pela expressão uma vez (diferente //.).


1

Gelatina , 10 bytes

Œg¹m2$S?€F

Experimente online!

Explicação

Œ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.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.