Сопоставьте зону для каждого значения на основе некоторых условий

#ruby #compare #match

#ruby #Сравнить #сопоставьте

Вопрос:

У меня есть эта таблица ввода, которая показывает коды стран и зоны, связанные с кодом каждой страны.

 <!DOCTYPE html>
<html>
<table class=MsoNormalTable border=0 cellspacing=0 cellpadding=0 width=170 style='width:102.0pt;margin-left:-.05pt;border-collapse:collapse'>
  <tr style='height:.2in'>
    <td width=170 nowrap colspan=2 valign=bottom style='width:102.0pt;border:
  solid windowtext 1.0pt;background:#BF8F00;padding:0in 5.4pt 0in 5.4pt;
  height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><b><span style='color:black'>ZONES
  TABLE</span></b></p>
    </td>
  </tr>
  <tr style='height:.2in'>
    <td width=122 style='width:73.0pt;border:solid windowtext 1.0pt;border-top:
  none;background:#305496;padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><b><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:white'>COUNTRY CODE</span></b></p>
    </td>
    <td width=48 style='width:29.0pt;border-top:none;border-left:none;border-bottom:
  solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;background:#305496;
  padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><b><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:white'>ZONE</span></b></p>
    </td>
  </tr>
  <tr style='height:.2in'>
    <td width=122 style='width:73.0pt;border:solid windowtext 1.0pt;border-top:
  none;background:#FAFAFA;padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>237</span></p>
    </td>
    <td width=48 style='width:29.0pt;border-top:none;border-left:none;border-bottom:
  solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;background:#FAFAFA;
  padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>CMR</span></p>
    </td>
  </tr>
  <tr style='height:.2in'>
    <td width=122 style='width:73.0pt;border:solid windowtext 1.0pt;border-top:
  none;background:#FAFAFA;padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>1721</span></p>
    </td>
    <td width=48 style='width:29.0pt;border-top:none;border-left:none;border-bottom:
  solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;background:#FAFAFA;
  padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>SXM2</span></p>
    </td>
  </tr>
  <tr style='height:.2in'>
    <td width=122 style='width:73.0pt;border:solid windowtext 1.0pt;border-top:
  none;background:#FAFAFA;padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>124622</span></p>
    </td>
    <td width=48 style='width:29.0pt;border-top:none;border-left:none;border-bottom:
  solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;background:#FAFAFA;
  padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>BRB1</span></p>
    </td>
  </tr>
  <tr style='height:.2in'>
    <td width=122 style='width:73.0pt;border:solid windowtext 1.0pt;border-top:
  none;background:#FAFAFA;padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>334</span></p>
    </td>
    <td width=48 style='width:29.0pt;border-top:none;border-left:none;border-bottom:
  solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;background:#FAFAFA;
  padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>FRA3</span></p>
    </td>
  </tr>
  <tr style='height:.2in'>
    <td width=122 style='width:73.0pt;border:solid windowtext 1.0pt;border-top:
  none;background:#FAFAFA;padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>124624</span></p>
    </td>
    <td width=48 style='width:29.0pt;border-top:none;border-left:none;border-bottom:
  solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;background:#FAFAFA;
  padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>BRB3</span></p>
    </td>
  </tr>
  <tr style='height:.2in'>
    <td width=122 style='width:73.0pt;border:solid windowtext 1.0pt;border-top:
  none;background:#FAFAFA;padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>124</span></p>
    </td>
    <td width=48 style='width:29.0pt;border-top:none;border-left:none;border-bottom:
  solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;background:#FAFAFA;
  padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>BRB45</span></p>
    </td>
  </tr>
  <tr style='height:.2in'>
    <td width=122 style='width:73.0pt;border:solid windowtext 1.0pt;border-top:
  none;background:#FAFAFA;padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>1246</span></p>
    </td>
    <td width=48 style='width:29.0pt;border-top:none;border-left:none;border-bottom:
  solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;background:#FAFAFA;
  padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>BRB7</span></p>
    </td>
  </tr>
  <tr style='height:.2in'>
    <td width=122 style='width:73.0pt;border:solid windowtext 1.0pt;border-top:
  none;background:#FAFAFA;padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>1876</span></p>
    </td>
    <td width=48 style='width:29.0pt;border-top:none;border-left:none;border-bottom:
  solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;background:#FAFAFA;
  padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>JAM</span></p>
    </td>
  </tr>
  <tr style='height:.2in'>
    <td width=122 style='width:73.0pt;border:solid windowtext 1.0pt;border-top:
  none;background:#FAFAFA;padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>358</span></p>
    </td>
    <td width=48 style='width:29.0pt;border-top:none;border-left:none;border-bottom:
  solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;background:#FAFAFA;
  padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>FIN</span></p>
    </td>
  </tr>
  <tr style='height:.2in'>
    <td width=122 style='width:73.0pt;border:solid windowtext 1.0pt;border-top:
  none;background:#FAFAFA;padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>33751</span></p>
    </td>
    <td width=48 style='width:29.0pt;border-top:none;border-left:none;border-bottom:
  solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;background:#FAFAFA;
  padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>FRA1</span></p>
    </td>
  </tr>
  <tr style='height:.2in'>
    <td width=122 style='width:73.0pt;border:solid windowtext 1.0pt;border-top:
  none;background:#FAFAFA;padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>33679</span></p>
    </td>
    <td width=48 style='width:29.0pt;border-top:none;border-left:none;border-bottom:
  solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;background:#FAFAFA;
  padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>FRA2</span></p>
    </td>
  </tr>
  <tr style='height:.2in'>
    <td width=122 style='width:73.0pt;border:solid windowtext 1.0pt;border-top:
  none;background:#FAFAFA;padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>599</span></p>
    </td>
    <td width=48 style='width:29.0pt;border-top:none;border-left:none;border-bottom:
  solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;background:#FAFAFA;
  padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>ANT</span></p>
    </td>
  </tr>
  <tr style='height:.2in'>
    <td width=122 style='width:73.0pt;border:solid windowtext 1.0pt;border-top:
  none;background:#FAFAFA;padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>61</span></p>
    </td>
    <td width=48 style='width:29.0pt;border-top:none;border-left:none;border-bottom:
  solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;background:#FAFAFA;
  padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>AUS</span></p>
    </td>
  </tr>
  <tr style='height:.2in'>
    <td width=122 style='width:73.0pt;border:solid windowtext 1.0pt;border-top:
  none;background:#FAFAFA;padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>230</span></p>
    </td>
    <td width=48 style='width:29.0pt;border-top:none;border-left:none;border-bottom:
  solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;background:#FAFAFA;
  padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>MUS</span></p>
    </td>
  </tr>
  <tr style='height:.2in'>
    <td width=122 style='width:73.0pt;border:solid windowtext 1.0pt;border-top:
  none;background:#FAFAFA;padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>31</span></p>
    </td>
    <td width=48 style='width:29.0pt;border-top:none;border-left:none;border-bottom:
  solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;background:#FAFAFA;
  padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>NLD</span></p>
    </td>
  </tr>
  <tr style='height:.2in'>
    <td width=122 style='width:73.0pt;border:solid windowtext 1.0pt;border-top:
  none;background:#FAFAFA;padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>65</span></p>
    </td>
    <td width=48 style='width:29.0pt;border-top:none;border-left:none;border-bottom:
  solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;background:#FAFAFA;
  padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>SGP</span></p>
    </td>
  </tr>
  <tr style='height:.2in'>
    <td width=122 style='width:73.0pt;border:solid windowtext 1.0pt;border-top:
  none;background:#FAFAFA;padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>1721</span></p>
    </td>
    <td width=48 style='width:29.0pt;border-top:none;border-left:none;border-bottom:
  solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;background:#FAFAFA;
  padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>SXM4</span></p>
    </td>
  </tr>
  <tr style='height:.2in'>
    <td width=122 style='width:73.0pt;border:solid windowtext 1.0pt;border-top:
  none;background:#FAFAFA;padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>1</span></p>
    </td>
    <td width=48 style='width:29.0pt;border-top:none;border-left:none;border-bottom:
  solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;background:#FAFAFA;
  padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>USA</span></p>
    </td>
  </tr>
  <tr style='height:.2in'>
    <td width=122 style='width:73.0pt;border:solid windowtext 1.0pt;border-top:
  none;background:#FAFAFA;padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>124623</span></p>
    </td>
    <td width=48 style='width:29.0pt;border-top:none;border-left:none;border-bottom:
  solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;background:#FAFAFA;
  padding:0in 5.4pt 0in 5.4pt;height:.2in'>
      <p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
  text-align:center;line-height:normal'><span style='font-size:8.0pt;
  font-family:"Verdana",sans-serif;color:black'>BRB2</span></p>
    </td>
  </tr>
</table>

</html>  

И у меня есть коды в номерах столбцов следующей таблицы, для которых я хочу выполнить поиск в соответствующей ЗОНЕ из таблицы выше. В приведенной ниже таблице ЗОНА столбца будет результатом, который я пытаюсь получить для значений в номерах столбцов.

 <style type="text/css">
	table.tableizer-table {
		font-size: 12px;
		border: 1px solid #CCC; 
		font-family: Arial, Helvetica, sans-serif;
	} 
	.tableizer-table td {
		padding: 4px;
		margin: 3px;
		border: 1px solid #CCC;
	}
	.tableizer-table th {
		background-color: #BF8F00; 
		color: #FFF;
		font-weight: bold;
	}
.tableizer-table tr:nth-child(even){background-color: #f2f2f2}     
  .tableizer-table tr:first-child td {
      background-color: #305496; color: #FFF;
    }
    tr td:nth-child(3) {
  background: #DFDFDF;
}
tr:nth-child(1) td:nth-child(3) {
  background: #5D5B56;
}

</style>
<table class="tableizer-table">
<thead><tr class="tableizer-firstrow"><th>NUMBERS to SEARCH</th><th>ZONE EXPECTED</th><th>amp;nbsp;</th></tr></thead><tbody>
 <tr><td>NUMBERS</td><td>ZONE</td><td>NOTES about logic to match the zone</td></tr>
 <tr><td>18763044</td><td>JAM</td><td>CC=1876 belongs to JAM</td></tr>
 <tr><td>187635</td><td>JAM</td><td>CC=1876 belongs to JAM</td></tr>
 <tr><td>23092</td><td>MUS</td><td>CC=230 belongs to JAM</td></tr>
 <tr><td>3162</td><td>NLD</td><td>CC=31 belongs to NLD</td></tr>
 <tr><td>38050</td><td>NOT FOUND</td><td>There is no CC that has as prefix 38,380, 3805 etc</td></tr>
 <tr><td>33</td><td>FRA3</td><td>There are 3 CC that begins with 33, but 334 selected because is the shortest and belongs to FRA3</td></tr>
 <tr><td>49185</td><td>NOT FOUND</td><td>There is no CC that begins with 49,491, etc</td></tr>
 <tr><td>51078</td><td>NOT FOUND</td><td>There is no CC that begins with 51,510, etc</td></tr>
 <tr><td>1246</td><td>BRB7</td><td>There are 4 CC that begins with 1246, but there is one exact match, CC=1246 that belongs to ZONE BRB7</td></tr>
 <tr><td>1721</td><td>SXM2</td><td>There are 2 CC that begins with 1721, but the ZONE to select is that that appears first. In this case SXM2</td></tr>
</tbody></table>  

Я поместил значения таблиц в виде массивов, и пока у меня есть приведенный ниже код, который определяет значения массива cc, начинающиеся со значений в числах, но результат далек
из моего ожидаемого результата, поскольку я не уверен, как это сделать. Может быть, кто-нибудь мог бы мне помочь. Заранее спасибо.

 cc=["237","1721","124622","334","124624","124","1246","1876","358","33751","33679","599","61","230","31","65","1721","1","124623"]
zones=["CMR","SXM2","BRB1","FRA3","BRB3","BRB45","BRB7","JAM","FIN","FRA1","FRA2","ANT","AUS","MUS","NLD","SGP","SXM4","USA","BRB2"]
numbers=["18763044","187635","23092","3162","38050","33","49185","51078","1246","1721"]

numbers.map{|n| 
    cc.find {|i|  i.start_with?(n) }
}

=> [nil, nil, nil, nil, nil, "334", nil, nil, "124622", "1721"]
  

Комментарии:

1. @iGian Ожидаемый результат — это зоны в столбце ZONE во втором фрагменте. 3-й столбец во втором фрагменте — это всего лишь объяснение логики, необходимой для применения в разных условиях, чтобы сопоставить более похожий код страны с каждым значением в номерах столбцов. Я показываю фрагменты, чтобы попытаться упростить понимание

2. @iGian По какой-то причине я пропустил поместить первое значение 237 в массив cc. Если вы посмотрите первый фрагмент, вы увидите, что cc и зоны имеют одинаковый размер. Я изменил массив cc.

3. @iGian Привет, iGian. Причина, по которой 1 (USA) никогда не выбирается, заключается в том, что 1 не является частью номеров столбцов, поэтому 1 не является одним из чисел, которые нужно найти. Я не уверен, отвечает ли это на ваши сомнения. Спасибо за помощь.

Ответ №1:

Полностью изменил ответ после некоторых разъяснений, это то, что я делал до сих пор. Возможность оптимизации.


Первым делом, метод подсчета количества совпадений элементов, начиная с самого начала. Это работает только со строками чисел:

 def count_equal_digits_at_beginning(a, b)
  return a.size if a == b
  rabdiff = (a.reverse.to_i - b.reverse.to_i).abs
  rabdiff.digits.count - rabdiff.to_s.reverse.to_i.digits.count
end
  


Во-вторых, сопоставьте пары [cc, zones] с хэшем для быстрого и легкого доступа. Я поменял местами, потому что требование состоит в том, чтобы сохранить первое появление ключа:

 mapping_hash = cc.reverse.zip(zones.reverse).to_h
  


Наконец, напишите код, который ищет соответствия форм, фильтрует и сортирует результат и выбирает из mapping_hash . (Отредактировано, чтобы отдать приоритет точному соответствию и порядку возрастания)

 res = numbers.map.with_object([]) do |n, res|
  exact = cc.find { |c| c == n }
  if exact
    found = exact
  else
    tmp = cc.map { |c| [c, count_equal_digits_at_beginning(c, n)] }
    possibles = tmp.find_all { |c, count| count == tmp.max_by(amp;:last).last amp;amp; count > 1 }
    good = possibles.sort_by(amp;:first).reverse.first
    found = good.first if good
  end
  res << [ n, mapping_hash[found] || "not found" ]
end.to_h
  

Итак, конечный результат

 res #=> {"18763044"=>"JAM", "187635"=>"JAM", "23092"=>"MUS", "3162"=>"NLD", "38050"=>"not found", "33"=>"FRA1", "49185"=>"not found", "51078"=>"not found", "1246"=>"BRB7", "1721"=>"SXM2"}
  

Комментарии:

1. But you pick 1876 from cc not because it starts with 18763044, but for the opposite reason. So why not USA, since in numbers a lot of elements start with "1"? Здесь выбрано значение 1876, потому что цель состоит в том, чтобы сопоставить наиболее похожее значение между NIMBERS и КОДОМ СТРАНЫ.

2. В этом случае выбранный номер, предполагающий, что точного совпадения нет, должен быть первым с наименьшей длиной, а зона для выбора будет первой при сортировке по возрастанию. Например: для значения 1246, "1246"=>[["124622", "BRB1"], ["124624222", "BRB3"], ["124", "BRB45"], ["1", "USA"], ["12465", "BRB2"]] выбираемое значение должно быть 12465 (это наименьшее значение, содержащее префикс 1246). Если точного совпадения нет, но все значения имеют одинаковую длину, тогда выберите первое значение в порядке возрастания и соответствующую ему зону. Для этих значений 124632,124642,124609,124673 выберите 124609

3. Привет, иГиан. Когда я пытаюсь выполнить последний блок кода res = numbers.map.....end.to_h , получаю следующую ошибку. ` undefined method digits' for 44036049:Fixnum У вас тоже это происходит?

4. Я вижу эту альтернативу в ссылке, которой вы поделились, 25.to_s.each_char {|c| print c, ' ' } но где / как внутри блока res можно было бы заменить этот метод вместо digits ?

5. @GerCas Я внес правку, чтобы учесть точное совпадение. Пожалуйста, подумайте о том, чтобы очистить комментарии (возможно, переместив наиболее релевантные в ваш ответ).