Réduisez de moitié les faux

19

Tâche

Étant donné un tableau non vide de 0et 1, divisez par deux la longueur des séries de 0.

Contribution

Un tableau de 0et 1. Format acceptable:

  • Vrai tableau dans votre langue
  • Chaîne séparée par des sauts de ligne 0et1
  • Chaîne contiguë de 0et1
  • Tout autre format raisonnable

Par exemple, les trois entrées suivantes sont toutes acceptables:

  • [1, 0, 0, 1]
  • "1\n0\n0\n1"(où \nest un saut de ligne U + 000A)
  • "1001"

Vous pouvez supposer que les séries de 0seront de même longueur .

Production

Un tableau de 0et 1, dans les formats acceptables ci-dessus.

Cas de 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]

Notation

C'est du . La réponse la plus courte en octets l'emporte.

Des échappatoires standard s'appliquent.

Leaky Nun
la source
Dans le dernier test, les zéros n'ont-ils pas une longueur égale?
OldBunny2800
@ OldBunny2800 Lisez attentivement le cas de test; les courses 0 ont des longueurs 4, 2, 2, 2, 2 et 2.
HyperNeutrino
Pouvons-nous prendre trueet falseau lieu de 1et 0?
Cyoce
@Cyoce quelle langue?
Leaky Nun
@LeakyNun Ruby, qui considère 0la vérité.
Cyoce

Réponses:

27

Rétine , 4 octets

00
0

Essayez-le en ligne!

Martin Ender
la source
Celui-ci sera difficile à battre.
2017
@ Adám je dirais impossible à battre.
Erik the Outgolfer
Fonctionne également dans QuadR !
Adám
11

05AB1E , 5 octets

00¤.:

Essayez-le en ligne!

Explication

00     # push 00
  ¤    # tail, pushes 0
   .:  # replace
Emigna
la source
2
C'était facile; pourquoi n'y ai-je pas pensé?
Leaky Nun
00est un comportement bizarre ...
Erik the Outgolfer
@EriktheOutgolfer: les chiffres séquentiels sont concaténés pour former un nombre, donc 11onze et non 1,1. Un effet secondaire de cela est que 00devient 00au lieu de 0,0:)
Emigna
@Emigna Je m'attendais à ce qu'il devienne 0ou à la 0 0place, mais peu importe.
Erik the Outgolfer
7

Haskell , 33 octets

f(0:0:r)=0:f r
f(x:r)=x:f r
f e=e

Essayez-le en ligne! Utilisation: f[1,1,0,0,1,1,0,0,1]. Itère sur la liste et remplace deux zéros consécutifs par un zéro.

Laikoni
la source
Je pense que cela peut être envoyé à Prolog
Leaky Nun
7

C (gcc) , 35 octets

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

48 est le code ascii de '0'

meilleure version 43 octets comme suggéré par Neil

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

un autre 40 octets cette fois (encore une fois comme suggéré par Neil & VisualMelon) :)

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

puis 35 octets grâce à Khaled.K

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

Essayez-le en ligne!

Alkano
la source
1
Ça s+=2-*s%2marcherait?
Neil
1
Si j'ai compté correctement, je pense qu'il for(;*s;s+=2-*s%2)putchar(*s);enregistre un autre octet.
Neil
1
Quel serait le problème s+=50-*s? Pas fait C depuis des lustres et je ne veux pas m'embarrasser en invoquant un comportement indéfini (venant de C # où il n'y en a pas)
VisualMelon
1
En regardant les putchardocuments, pouvez-vous faire f(char*s){for(;*s;s+=50-putchar(*s));}?
VisualMelon
3
Vous pouvez économiser 5 octets en le rendant récursiff(char*s){*s&&f(s+50-putchar(*s));}
Khaled.K
6

sed , 8 octets

s/00/0/g

Essayez-le en ligne!

betseg
la source
2
@boboquack Ne fonctionne pas, car il remplacerait toujours une série de 0s par 0.
Erik the Outgolfer
6

Octave, 22 octets

@(s)strrep(s,'00','0')

Vérifiez tous les cas de test ici.

Il s'agit d'une fonction anonyme qui prend une chaîne sur le format '1001000011'en entrée et remplace deux zéros consécutifs par un seul zéro.

Stewie Griffin
la source
6

Java, 50 octets

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

Essayez en ligne

Khaled.K
la source
1
Un très bon choix d'entrée! Soit dit en passant, si vous êtes intéressé à passer à la solution Java, vous pouvez utiliser un lambda: s->s.replaceAll("00","0").
Jakob
Encore mieux, utilisez replaceplutôt que d' replaceAlléconomiser 3 octets
Benjamin Urquhart
@BenjaminUrquhart replacene remplacera que la première occurrence
Khaled.K
@ Khaled.K en javascript, oui. En java, il remplace toutes les occurrences
Benjamin Urquhart
5

Haskell , 28 octets

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

Essayez-le en ligne!

Prend récursivement le premier élément, laissant tomber le second si le premier est nul, jusqu'à la liste des vides. Si la première entrée est h, alors les premières 1-hsont supprimées du reste.

xnor
la source
5

Japt , 7 6 5 octets

d'0²0

Essayez-le en ligne!

Remplace simplement chaque série de deux zéros dans l'entrée par un zéro. Utilise une entrée de chaîne (c. "1001001"-à-d.).

Luc
la source
1
Agréable! Vous n'avez même pas besoin du 'je pense
ETHproductions
Ooh, vous pouvez économiser un autre octet en le remplaçant "00"par '0²:-)
ETHproductions
Eh bien, c'est bizarre. Merci quand même!
Luke
4

PHP, 26

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

remplacez tout simplement 00par 0.

Christoph
la source
4

Alice , 13 octets

/oe00/
@iS0e\

Essayez-le en ligne!

Explication

/.../
@...\

Il s'agit d'un modèle simple pour les programmes linéaires qui fonctionnent entièrement en mode Ordinal. L'initiale /reflète l'IP pour se déplacer vers le sud-est, puis elle rebondit en diagonale de haut en bas à travers le code jusqu'à ce que les miroirs à la fin. Ceux-ci compensent simplement la position d'un pour qu'au retour l'IP traverse les cellules restantes. En lisant le code de cette manière en zigzag, cela devient:

ie00e0So@

Il s'agit d'une simple substitution de chaîne:

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.

Il existe quelques autres façons de pousser les deux chaînes, par exemple '00'0oue000t , mais je n'ai rien trouvé qui bat 5 octets (et je devrais raser deux octets pour pouvoir raccourcir le programme).

Martin Ender
la source
2
On dirait que tu es tombé amoureux d'Alice récemment ...
Leaky Nun
6
@LeakyNun S'il vous plaît, ne le dites pas à ma femme ...
Martin Ender
@MartinEnder Je vais dire ça à Mme Ender!
Erik the Outgolfer
3

Prolog (SWI) , 42 octets

[0,0|T]*[0|R]:-T*R.
[H|T]*[H|R]:-T*R.
H*H.

Essayez-le en ligne!

Emigna
la source
Une réponse prologue, mais pas ce à quoi je m'attendais ...
Leaky Nun
Belle astuce pour utiliser l' *opérateur.
Leaky Nun
3

Java , 131 123 octets

int[]f(int[]a){int c=0,i=0,l=a.length;for(int x:a)c+=1-x;int[]r=new int[l-c/2];for(c=0;c<l;c+=2-a[c])r[i++]=a[c];return r;}

Essayez-le en ligne!

Leaky Nun
la source
3

JavaScript (ES6), 26 21 octets

Prend l'entrée sous forme de chaîne et renvoie une chaîne.

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

Essayez-le

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>

Hirsute
la source
3

Lua, 33 octets

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

Prend une chaîne via l'entrée et condense les doubles zéros. Facile.

Jaser
la source
3

Gelée , 8 octets

ṣ1j1,1m2

Essayez-le en ligne!

D'autres réponses dans des langues sans .replace()ou similaire pourraient éventuellement utiliser cette astuce.

Explication

ṣ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
fireflame241
la source
3

Alice , 12 10 octets

2 octets économisés grâce à Martin Ender

i.h%.7%$io

Essayez-le en ligne!

Explication

Il s'agit d'un code 1-D fonctionnant en mode cardinal, il est donc facile de suivre son flux:

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
Leo
la source
Vous pouvez réellement enregistrer deux octets supplémentaires aveci.h%...
Martin Ender
@MartinEnder vous êtes une personne malfaisante, en train d'apprendre aux gens à jouer sale ...: D
Leo
2

Python (liste des E / S), 36 octets

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

Essayez-le en ligne!

Prend récursivement le premier élément, puis supprime celui qui reste si le premier était nul.


38 octets:

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

Essayez-le en ligne Cela prend une liste Python et génère une liste Python en remplaçant sa représentation sous forme de chaîne. Les E / S de chaîne permettraient une solution plus directe et plus courte, telle que

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

pour le '1001' format.

xnor
la source
La première réponse avec le format spécifié, sympa.
Leaky Nun
1
Les E / S de chaîne sont autorisées. lambda s:s.replace('00','0')devrait être bien.
Jonathan Allan
2

Perl 5, 7 + 1 (indicateur -p) = 8 octets

<>if/0/

Prend les entrées sous forme de nombres séparés par des sauts de ligne. Saute la ligne suivante s'il voit un zéro.

Chris
la source
2

V , 4 octets

òf0x

Essayez-le en ligne!

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

MATL , 5 octets

FFOZt

Essayez-le en ligne!

Explication

Ceci est similaire à la réponse Octave de Stewie Griffin :

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

8 octets

vy~f2L)(

Cela évite le remplacement de chaîne / tableau intégré.

Essayez-le en ligne!

Explication

Considérez la saisie [1,0,0,1,0,0,1]comme exemple:

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]
Luis Mendo
la source
1

Brachylog , 10 octets

ḅ{cẹ|ḍh}ᵐc

Essayez-le en ligne!

Pas sûr que ce soit encore optimal…

Explication

Cela exploite le bogue qui, csur une liste d'entiers comportant des zéros non significatifs, échouera.

ḅ               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
Fatalize
la source
Comment est-ce un bug?
Leaky Nun
@LeakyNun Nous devrions pouvoir concaténer [0,0,4,2]en 42. Les zéros non significatifs le font échouer en ce moment car il est ici pour empêcher les zéros non significatifs lorsque l'entrée est une variable, mais ici l'entrée est entièrement mise à la terre de sorte que la limitation ne devrait pas exister.
Fatalize
Souhaitez-vous écrire une réponse Prolog?
Leaky Nun
1

C #, 191 octets

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

Essayez-le en ligne!

Ce n'est ni propre ni court, mais ça marche.

Prend les entrées sous forme de chaîne de caractères contigus, les sorties dans le même format

Explication:

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

Remarque

Oui, je sais que cela pourrait simplement être fait en utilisant s.Replace("00","0") , mon objectif était d'éviter d'utiliser la solution évidente. Après tout, l'intérêt de PPCG est de s'amuser, non? ;)

Skidsdev
la source
@ Mr.Xcoder Ce n'est pas vrai. C'est à peu près aussi golfé que possible sans utiliser le langage Replace intégré.J'utilise C #, donc je ne me fais aucune illusion pour obtenir le code le plus court possible, en particulier avec des langages comme Jelly, donc pourrait aussi bien s'amuser un peu Dans le processus.
Skidsdev
bien sûr, le plaisir est également important. Je m'excuse pour le commentaire ci-dessus et je dois admettre que j'ai moi-même aimé votre réponse (la technique que vous avez utilisée).
M. Xcoder
@ Mr.Xcoder pas de rancune, finalement nous sommes tous ici pour nous amuser et fléchir notre capacité autrement inutile de compresser le code autant que possible;)
Skidsdev
Vous pouvez faire beaucoup plus court que cela sans remplacer! string a(string s){var r="";for(int i=0;i<s.Length;i+=50-s[i])r+=s[i];return r;} (on dirait que c'est fondamentalement la réponse C)
VisualMelon
1

Pyth, 8 octets

:z"00"\0

Lien d'essai.

Explication:

: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
Erik le Outgolfer
la source
1

Awk - 18 octets

Essayez d'abord de faire quoi que ce soit avec Awk afin qu'il soit possible de le jouer davantage.

{gsub(00,0);print}

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

PsHegger
la source
1

Lot, 24 octets

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

Prend entrée sur STDIN. Un peu compétitif pour une fois.

Neil
la source
1

Lisp commun, SBCL, 48 32 octets

-16 octets grâce à Julian Wolf

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

contribution:

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

production:

1001110

Explication

Nous lisons la liste des entrées. La liste est utilisée dans la formatfonction. Nous le parcourons en sortie 1si l'élément est 1et en sortie 0et en sautant l'élément suivant de la liste pour 0.


la source
Utiliser ~[plutôt que ~:[vous permet d'indexer directement avec 0 et 1, ce qui devrait vous faire économiser un tas d'octets
Julian Wolf
@JulianWolf Merci!
1

Mathematica, 24 octets

StringReplace["00"->"0"]

Une fonction qui attend une chaîne de "0"s et de "1"s et renvoie une chaîne similaire. Syntaxe explicite. Mathematica possède de nombreux modules de transformation; la clé est d'en utiliser une qui transforme chaque sous-expression pertinente (contrairement à /.) mais ne passe par l'expression qu'une seule fois (contrairement //.).

Greg Martin
la source
1

Gelée , 10 octets

Œg¹m2$S?€F

Essayez-le en ligne!

Explication

Œ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.
fireflame241
la source