<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>L&#039;Univers D&#039;Adjanakis &#187; codingame who note musique</title>
	<atom:link href="https://blog.developpez.com/adjanakis/ptag/codingame-who-note-musique/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/adjanakis</link>
	<description></description>
	<lastBuildDate>Sun, 24 Nov 2013 00:46:48 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Codingame du 23 novembre 2013 : Rejouons la partition</title>
		<link>https://blog.developpez.com/adjanakis/p12358/developpement/java/codingame-du-23-novembre-2013-rejouons-la-partition</link>
		<comments>https://blog.developpez.com/adjanakis/p12358/developpement/java/codingame-du-23-novembre-2013-rejouons-la-partition#comments</comments>
		<pubDate>Sun, 24 Nov 2013 00:46:48 +0000</pubDate>
		<dc:creator><![CDATA[Adjanakis]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[codingame who note musique]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/adjanakis/?p=149</guid>
		<description><![CDATA[C&#8217;est avec un grand regret que je n&#8217;ai pas pu finir à temps ma composition pour aider le Docteur Who à sortir d&#8217;un bien mauvais pas. J&#8217;ai pu constater avec plaisir qu&#8217;il avait pu s&#8217;en sortir grâce aux quelques algorithmes qui ont pu être livrés à temps. Mais pour ceux qui n&#8217;en peuvent plus d&#8217;attendre de lire un algo qui se rapprocherait de la solution, voici ce que j&#8217;aurais dû soumettre pendant le codingame si [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>C&rsquo;est avec un grand regret que je n&rsquo;ai pas pu finir à temps ma composition pour aider le Docteur Who à sortir d&rsquo;un bien mauvais pas.  J&rsquo;ai pu constater avec plaisir qu&rsquo;il avait pu s&rsquo;en sortir grâce aux quelques algorithmes qui ont pu être livrés à temps. </p>
<p>Mais pour ceux qui n&rsquo;en peuvent plus d&rsquo;attendre de lire un algo qui se rapprocherait de la solution, voici ce que j&rsquo;aurais dû soumettre pendant le codingame si le manque de temps ne m&rsquo;avait pas finalement poussé vers une voie de mauvais garçon (à voir sur le site codingame :evil:). </p>
<p>Les constantes ne sont pas les bonnes pour les noires et les blanches et ce code n&rsquo;a été testé que sur un seul jeu de données(&laquo;&nbsp;Only 1 pixel wide &#8211; in10.txt&nbsp;&raquo;). Cependant, l&rsquo;idée qui y est présentée me semble bonne et ne devrait souffrir que de petits ajustements pour pouvoir passer l&rsquo;ensemble des tests.</p>
<p>En quelques mots, les étapes de la résolution sont indiquées dans la méthode main. Tout d&rsquo;abord, une lecture des données en entrée permet de récupérer dans un tableau à deux dimensions les pixels de l&rsquo;image. La difficulté est ici de devoir jouer avec les lignes du tableau indépendamment de la lecture du flux en entrée. Une lecture un peu plus complexe que dans la moyenne des codingame, une source de temps perdu, mais une difficulté surmontable.</p>
<p>Ensuite, on peut constater que dans <a href="http://files.codingame.com/pub/dw/dw2-allimages.html" title="Partitions de musique" target="_blank">toutes les partitions de musique</a>, les premiers pixels correspondent aux 5 lignes noires. Dans l&rsquo;algorithme choisi ici, la phase suivante consiste à repérer les coordonnées de ces lignes. Pour cela, la colonne sélectionnée sera la première de l&rsquo;image contenant des pixels noirs. Cette colonne aura été préalablement déterminée lors de la lecture de la partition. Une sixième ligne pouvant intervenir, on en calcule la position en admettant que toutes les lignes sont séparées par des intervalles réguliers.</p>
<p>La phase suivante est déterminante pour arriver au résultat désiré. Les lignes de la partition déterminent des zones auxquelles on affectera un flag. Pour chaque colonne, on calculera une empreinte qui correspondra à l&rsquo;ensemble des zones où apparaît un pixel noir, sans tenir compte des pixels des lignes de la portée. On comptabilise par contre le nombre de pixel noir de la colonne pour analyser plus tard la longueur des notes.</p>
<p>Une fois cette étape statistique réalisée, il ne reste plus qu&rsquo;à en tirer des conclusions. Les colonnes considérées comme ne possédant aucun pixel sont à ignorer. Celles correspondant à une queue de note sont également ignorées car les zones traversées ne correspondant pas à une empreinte de note valide. Lorsqu&rsquo;une empreinte est valide on conserve l&rsquo;information et on compare la quantité de pixel noir entre la première et la deuxième colonne où la note apparaît. En effet, les notes blanches ont davantage de pixels noirs sur les côtés, alors que les notes noirs en ont davantage ! En calculant l&rsquo;évolution de ce nombre, on connait la durée de la note.</p>
<p>Après ces quelques explications, j&rsquo;espère que vous comprendrez le code source qui suit.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">import java.io.File;<br />
import java.io.FileNotFoundException;<br />
import java.util.Arrays;<br />
import java.util.HashMap;<br />
import java.util.Map;<br />
import java.util.Scanner;<br />
<br />
class Solution {<br />
<br />
&nbsp; &nbsp; private static final int DOWN = 1;<br />
&nbsp; &nbsp; private static final int UP = 0;<br />
&nbsp; &nbsp; private static final String BLACK = &quot;B&quot;;<br />
&nbsp; &nbsp; private static final String WHITE = &quot;W&quot;;<br />
&nbsp; &nbsp; private static int width = 0;<br />
&nbsp; &nbsp; private static int height = 0;<br />
&nbsp; &nbsp; private static boolean[][] score = null;<br />
&nbsp; &nbsp; private static int blackFirstX = -1;<br />
&nbsp; &nbsp; private static int[][] lignes = new int[6][2];<br />
&nbsp; &nbsp; private static int betweenLines;<br />
&nbsp; &nbsp; private static int[] statZone;<br />
&nbsp; &nbsp; private static int[] statPond;<br />
<br />
&nbsp; &nbsp; public static void main(String args[]) throws FileNotFoundException {<br />
&nbsp; &nbsp; &nbsp; &nbsp; readScoreInput();<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; guessScoreLines();<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; retrieveStatistics();<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; System.out.println(buildResult());<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; private static void guessScoreLines() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; int line_number = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; boolean onLine = false;<br />
&nbsp; &nbsp; &nbsp; &nbsp; for (int y = 0; y &amp;lt; height; y++) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (score[y][blackFirstX]) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lignes[line_number][DOWN] = y;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!onLine) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; onLine = true;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lignes[line_number][UP] = y;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else if (onLine) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; line_number++;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; onLine = false;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; betweenLines = lignes[1][UP] - lignes[0][UP];<br />
&nbsp; &nbsp; &nbsp; &nbsp; lignes[5][UP] = lignes[4][UP] + betweenLines;<br />
&nbsp; &nbsp; &nbsp; &nbsp; lignes[5][DOWN] = lignes[4][DOWN] + betweenLines;<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; private static void retrieveStatistics() {<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; for (int w = 0; w &amp;lt; width; w++) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int currentZone = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int currentZoneFlag = 1 &amp;lt;&amp;lt; currentZone;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int nextLine = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int h = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while (h &amp;lt; height) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (nextLine &amp;lt; lignes.length &amp;amp;&amp;amp; h == lignes[nextLine][UP]) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; h = lignes[nextLine][DOWN] + 1;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currentZone++;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; nextLine++;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currentZoneFlag = 1 &amp;lt;&amp;lt; currentZone;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (score[h][w]) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; statZone[w] |= currentZoneFlag;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; statPond[w]++;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; h++;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; private static String buildResult() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; Map zoneMapping = new HashMap(13);<br />
&nbsp; &nbsp; &nbsp; &nbsp; zoneMapping.put(1, &quot;G&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; zoneMapping.put(3, &quot;F&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; zoneMapping.put(2, &quot;E&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; zoneMapping.put(6, &quot;D&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; zoneMapping.put(4, &quot;C&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; zoneMapping.put(12, &quot;B&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; zoneMapping.put(8, &quot;A&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; zoneMapping.put(24, &quot;G&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; zoneMapping.put(16, &quot;F&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; zoneMapping.put(48, &quot;E&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; zoneMapping.put(32, &quot;D&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; zoneMapping.put(96, &quot;C&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; zoneMapping.put(64, &quot;B&quot;);<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; StringBuilder result = new StringBuilder();<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; int currentZone = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; int currentPond = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; boolean typeIsKnow = false;<br />
&nbsp; &nbsp; &nbsp; &nbsp; for (int w = 0; w = currentPond) ? BLACK : WHITE)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .append(&quot; &quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; typeIsKnow = true;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; return result.toString();<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; private static void readScoreInput() throws FileNotFoundException {<br />
&nbsp; &nbsp; &nbsp; &nbsp; Scanner in = new Scanner(new File(&quot;test.txt&quot;));<br />
&nbsp; &nbsp; &nbsp; &nbsp; width = in.nextInt();<br />
&nbsp; &nbsp; &nbsp; &nbsp; height = in.nextInt();<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; score = new boolean[height][width];<br />
&nbsp; &nbsp; &nbsp; &nbsp; statZone = new int[width];<br />
&nbsp; &nbsp; &nbsp; &nbsp; statPond = new int[width];<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; Arrays.fill(statZone, 0);<br />
&nbsp; &nbsp; &nbsp; &nbsp; Arrays.fill(statPond, 0);<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; boolean scoreCompleted = false;<br />
&nbsp; &nbsp; &nbsp; &nbsp; int number, w = 0, h = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; String color;<br />
&nbsp; &nbsp; &nbsp; &nbsp; blackFirstX = width;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; while (!scoreCompleted) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; color = in.next(&quot;\\s*[WB]\\s*&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; number = in.nextInt();<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; boolean colorBool = charToBoolean(color);<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // tant que l'entrée n'est pas consommée<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while (number &amp;gt; 0) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (blackFirstX &amp;gt; w &amp;amp;&amp;amp; color.trim().equals(&quot;B&quot;)) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; blackFirstX = w;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (number &amp;gt; (width - w)) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Arrays.fill(score[h], w, width, colorBool);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; number = number - (width - w);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; w = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; h++;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Arrays.fill(score[h], w, w + number, charToBoolean(color));<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; w = w + number;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; number = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; scoreCompleted = (h == height - 1);<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; in.close();<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; private static boolean charToBoolean(String color) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; return &quot;B&quot;.equals(color.trim());<br />
&nbsp; &nbsp; }<br />
}</div></div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
