За последние 24 часа нас посетил 18931 программист и 1730 роботов. Сейчас ищет 1281 программист ...

Как реализовать задачу на PHP, Python, C++, Java и ECMAScript

Тема в разделе "Решения, алгоритмы", создана пользователем Vladimir Kheifets, 18 фев 2025 в 18:24.

Метки:
  1. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    457
    Симпатии:
    92
    Адрес:
    Бавария, Германия
    Добрый день!
    Коллега jerkyboy выставил на форуме тему:
    как из массива данных вывести интервалы
    https://php.ru/forum/threads/kak-iz-massiva-dannyx-vyvesti-intervaly.103045/
    PHP
    PHP:
    1. <?
    2. function getIntervals($inData){
    3.  
    4.     foreach($inData as $item){
    5.         preg_match("/^(\D+)(\d+)$/", $item, $out);
    6.         $groups[$out[1]][] = $out[2];
    7.     }
    8.  
    9.     $intervals = [];
    10.     foreach($groups as $preff => $group){
    11.         sort($group);
    12.         //---------------------------------
    13.         $interval = "";
    14.         $numberBefor = 0;
    15.         foreach($group as  $number)
    16.         {
    17.             $val = $preff.$number;
    18.             if($numberBefor == 0)
    19.                 $interval = $val;
    20.             else
    21.             {
    22.                 if(($number - $numberBefor) > 1)
    23.                 {
    24.                     $valBefor = $preff.$numberBefor;
    25.                     if($interval != $valBefor)
    26.                         $interval .= " - $valBefor";
    27.                     $intervals[] = $interval;
    28.                     $interval = $val;
    29.                 }
    30.             }
    31.             $numberBefor = $number;
    32.         }
    33.         if($interval != $val)
    34.             $interval .= " - $val";
    35.         $intervals[] = $interval;
    36.     }
    37.     return $intervals;
    38. }
    39. ##################################################################################
    40. echo "<pre>";
    41. $data = ["А8","А7", "А3","А1", "А4","А5", "В23", "В24", "В25", "В26", "Ж32", "Ж33", "Ж34", "Z_1",
    42. "Z_2", "Z_3","W 202", "W 203", "W 204"];
    43.  
    44. $intervals = getIntervals($data);
    45.  
    46. $out = "Intervals:<br>";
    47. foreach($intervals as $interval)
    48.     $out .= "$interval<br>";
    49. echo $out;
    50.  
    51. /*
    52.  
    53. Intervals:
    54. А1
    55. А3 - А5
    56. А7 - А8
    57. В23 - В26
    58. Ж32 - Ж34
    59. Z_1 - Z_3
    60. W 202 - W 204
    61.  
    62. */
    Python
    Код (Text):
    1. import re
    2.  
    3. data = ["А8","А7", "А3","А1", "А4","А5", "В23", "В24", "В25", "В26", "Ж32", "Ж33", "Ж34", "Z_1", "Z_2", "Z_3","W 202", "W 203", "W 204"];
    4.  
    5. def getintervals(inData):
    6.   groups = {}
    7.   patt = re.compile(r'^(\D+)(\d+)$')
    8.   for item in inData:  
    9.     out = patt.findall(item)    
    10.     key = out[0][0]
    11.     val = int(out[0][1])    
    12.     if key in groups:
    13.       groups[key].append(val)
    14.     else:  
    15.       groups[key]=[val]
    16.  
    17.   intervals = []
    18.  
    19.   for preff in groups:
    20.     group = groups[preff]
    21.     group.sort()
    22.     numberBefor = 0;
    23.  
    24.     for number in group:
    25.       val = preff + str(number)
    26.       if(numberBefor == 0):
    27.         interval = val
    28.       else:          
    29.         if((number - numberBefor) > 1):
    30.           valBefor = preff + str(numberBefor)
    31.  
    32.           if(interval != valBefor):
    33.             interval += " - " + valBefor
    34.  
    35.           intervals.append(interval)
    36.           interval = val
    37.       numberBefor = number
    38.  
    39.     if(interval != val):
    40.       interval += " - " + val;
    41.     intervals.append(interval)
    42.  
    43.   return intervals;
    44.  
    45. intervals = getintervals(data);
    46.  
    47. out = "Intervals:\n";
    48. for interval in  intervals:
    49.   out += interval + "\n";
    50.  
    51. print(out);
    52.  
    53. """
    54. Intervals:
    55. А1
    56. А3 - А5
    57. А7 - А8
    58. В23 - В26
    59. Ж32 - Ж34
    60. Z_1 - Z_3
    61. W 202 - W 204
    62.  
    63. """
    C++
    Код (Text):
    1. #include <iostream>
    2. #include <string>
    3. #include <regex>
    4. #include <map>
    5.  
    6. using namespace std;
    7.  
    8. vector<string> getIntervals(vector<string> inData) {
    9.     map< string, vector<int> > groups;
    10.     string interval;
    11.     string valBefor;
    12.     string val;
    13.     vector <int> group;
    14.     vector <string> intervals;
    15.  
    16.     for (auto item : inData)
    17.     {
    18.         string str(item);
    19.         regex r("^(\\D+)(\\d+)$");
    20.         smatch m;
    21.         regex_search(str, m, r);
    22.         groups[m[1]].push_back(stoi(m[2]));
    23.     }
    24.  
    25.     for (const auto& pair : groups)
    26.     {
    27.         string preff = pair.first;
    28.         group = pair.second;
    29.         sort(group.begin(), group.end());
    30.  
    31.         int numberBefor = 0;
    32.         for (int number : group)
    33.         {
    34.             val = preff + to_string(number);
    35.             if (numberBefor == 0)
    36.                 interval = val;
    37.             else
    38.             {
    39.                 if ((number - numberBefor) > 1)
    40.                 {
    41.                     valBefor = preff + to_string(numberBefor);
    42.                     if (interval != valBefor)
    43.                         interval += " - " + valBefor;
    44.                     intervals.push_back(interval);
    45.                     interval = val;
    46.                 }
    47.             }
    48.             numberBefor = number;
    49.         }
    50.  
    51.         if (interval != val)
    52.             interval += " - " + val;
    53.         intervals.push_back(interval);
    54.     }
    55.  
    56.     return intervals;
    57. }
    58.  
    59.  
    60. int main()
    61. {  
    62.     vector<string> data{ "А8","А7", "А3","А1", "А4","А5", "В23", "В24", "В25", "В26", "Ж32", "Ж33", "Ж34",
    63.         "Z_1", "Z_2", "Z_3","W 202", "W 203", "W 204" };
    64.  
    65.     vector<string> intervals = getIntervals(data);
    66.  
    67.     cout << "Intervals:" << endl;
    68.     for (auto interval : intervals)
    69.         cout << interval << endl;
    70.  
    71.     /*
    72.         Intervals:
    73.         W 202 - W 204
    74.         Z_1 - Z_3
    75.         А1
    76.         А3 - А5
    77.         А7 - А8
    78.         В23 - В26
    79.         Ж32 - Ж34
    80.     */
    81.  
    82.     return 0;
    83. }
    Java
    Код (Text):
    1. import java.util.*;
    2. import java.util.regex.*;
    3. import java.util.function.Function;
    4.  
    5. public class Main {
    6.  
    7.     public static void main(String[] args) {
    8.  
    9.  
    10.     //------------------------------------------------------------------------------
    11.     Function < String[], List<String> > getIntervals = ( String[] inData ) -> {
    12.  
    13.         Map< String, Vector<Integer> > groups = new HashMap<>();
    14.         List<String> intervals = new ArrayList<String>();
    15.         Pattern p = Pattern.compile("^(\\D+)(\\d+)$");
    16.  
    17.         for(String item : inData)
    18.         {
    19.             Matcher m = p.matcher(item);
    20.             boolean b = m.matches();
    21.             String preff = m.group(1);
    22.             int number = Integer.parseInt(m.group(2));
    23.             if(groups.get(preff) == null)
    24.                 groups.put(preff, new Vector<Integer>());
    25.             groups.get(preff).add(number);
    26.         }
    27.  
    28.         groups.entrySet().forEach(entry -> {
    29.  
    30.           String preff = entry.getKey();
    31.  
    32.           Vector<Integer> group = new Vector<Integer>();
    33.           group = entry.getValue();
    34.           Collections.sort(group);
    35.  
    36.           int numberBefor = 0;
    37.           String interval = "";
    38.           String val = "";
    39.  
    40.           for(int number : group)
    41.           {
    42.  
    43.             val = preff + Integer.toString(number);
    44.             if (numberBefor == 0)
    45.               interval = val;
    46.             else
    47.             {
    48.                 if ((number - numberBefor) > 1)
    49.                 {
    50.                     String valBefor = preff + Integer.toString(numberBefor);
    51.  
    52.                     if (!interval.equals(valBefor))
    53.                         interval += " - " + valBefor;
    54.  
    55.                     intervals.add(interval);
    56.                     interval = val;
    57.                 }
    58.             }
    59.  
    60.             numberBefor = number;
    61.  
    62.           }
    63.  
    64.  
    65.           if (interval != val)
    66.               interval += " - " + val;
    67.           intervals.add(interval);
    68.  
    69.         });
    70.  
    71.         return  intervals;
    72.  
    73.        };
    74.  
    75.       //------------------------------------------------------------------------------
    76.  
    77.       String[] data = { "А8","А7", "А3","А1", "А4","А5", "В23", "В24", "В25", "В26", "Ж32", "Ж33", "Ж34","Z_1", "Z_2", "Z_3","W 202", "W 203", "W 204" };
    78.  
    79.       List<String> intervals  = getIntervals.apply(data);
    80.  
    81.  
    82.       String out = "Intervals:\n";
    83.  
    84.         for(String item : intervals)
    85.           out += item + "\n";
    86.  
    87.         System.out.println(out);
    88.  
    89.         /*
    90.             Output:
    91.  
    92.             Intervals:
    93.             А1
    94.             А3 - А5
    95.             А7 - А8
    96.             В23 - В26
    97.             Z_1 - Z_3
    98.             Ж32 - Ж34
    99.             W 202 - W 204
    100.         */
    101.   }
    102. }
    ECMAScript
    Код (Javascript):
    1. const data = ["А8","А7", "А3","А1", "А4","А5", "В23", "В24", "В25", "В26", "Ж32", "Ж33", "Ж34", "Z_1", "Z_2", "Z_3","W 202", "W 203", "W 204"];
    2.  
    3. function getIntervals(inData){
    4.  
    5.     const regex = /^(\D+)(\d+)$/;
    6.     let groups = {};
    7.  
    8.     for(let item of inData){
    9.         let out = regex.exec(item);
    10.         if(!groups[out[1]])
    11.             groups[out[1]]=[];
    12.         groups[out[1]].push(out[2]);
    13.     }
    14.  
    15.     let intervals = [];
    16.  
    17.     for( let preff in groups)
    18.     {
    19.         let group = groups[preff];
    20.         group.sort();
    21.  
    22.         let numberBefor = 0;
    23.  
    24.         for (let number of group)
    25.         {
    26.             var val = preff + number;
    27.             if(numberBefor == 0)
    28.                 var interval = val;
    29.             else
    30.             {
    31.                 beforVal = preff + numberBefor;
    32.                 if((number - numberBefor) > 1)
    33.                 {
    34.                     if(interval != beforVal)
    35.                         interval += ` - ${beforVal}`;
    36.                     intervals.push(interval);
    37.                     interval = val;
    38.                 }
    39.             }
    40.             numberBefor = number;
    41.  
    42.         }
    43.         if(interval != val)
    44.             interval += ` - ${val}`;
    45.         intervals.push(interval);
    46.     }
    47.     return intervals;
    48. }
    49.  
    50. const intervals = getIntervals(data);
    51.  
    52.  
    53. let out = "Intervals:\n";
    54. for(let interval of  intervals )
    55.     out += `${interval}\n`;
    56. alert(out);
    57.  
    58. /*
    59. А1
    60. А3 - А5
    61. А7 - А8
    62. В23 - В26
    63. Ж32 - Ж34
    64. Z_1 - Z_3
    65. W 202 - W 204
    66. */
    Удачи!
     

    Вложения:

    • Intervals.zip
      Размер файла:
      4 КБ
      Просмотров:
      0
    Survivor и artoodetoo нравится это.
  2. Survivor

    Survivor Новичок

    С нами с:
    8 фев 2023
    Сообщения:
    92
    Симпатии:
    18
    Владимир, Вы молодец, давно Вас чту!) Спасибо за помощь новичкам и просто халявщикам)))

    Но почему короткие теги используем?
    Это рано или поздно а) удалят б) тыЩщщу лет как не рекомендуют использовать в) Могут возникать различные конфликты, например с xml г) не везде "прокатит" (т.е. не будет работать), просто потому, что они там отключены. Не всегда есть возможность включить при желании или наоборот. Времена другие, правила поменялись, меняйтесь и Вы! В ногу, да со временем!)

    Эх, где мой любимый 5.3 ;)
     
  3. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    457
    Симпатии:
    92
    Адрес:
    Бавария, Германия
    Добрый день!
    Спасибо за Ваш комментарий.
    Относительно коротких тэгов, Вы правы, возможно их когда-нибудь
    их запретят использовать и из конфига уберут настройку.
    На всякий случай в PHP-коде заменил короткий тэг на длинный.

    Онако, это не гланое.
    Не заю как вам, но не нравится то, что рассмореная задача
    абстракная и не имеет практического смысла.

    Теперь, хотел бы рассмотреть практическую задачу про интевалы дат:

    Допустим, что заданы два неупорядоченных набора дат:
    1. Набор из пар полных названий месяцов и дат:
    Код (Text):
    1. "January 8", "May 11", "January 3","January 1", "April 2", "January 4","January 5", "May 11","February 24", "April 1", "February 25", "February 26", "March 12", "January 7", "March 13", "January 3", "March 14", "February 24", "April 3","May 10", "May 12","February 23"
    2. Набор ISO-дат:
    Код (Text):
    1. "2025-05-10", "2025-03-14","2025-05-11", "2025-01-04", "2025-03-13", "2025-01-08","2025-05-12", "2025-01-03",  "2025-04-03","2025-02-24", "2025-01-01", "2025-01-05", "2025-02-23",  "2025-02-25", "2025-02-26", "2025-03-12",  "2025-04-01", "2025-04-02", "2025-01-07"
    Требуется вычислить для этих данных упорядоченные интевалы дат по месяцам, например:
    Код (Text):
    1. intervals:
    2.  
    3. Days in  January
    4. 1
    5. 3 - 5
    6. 7 - 8
    7.  
    8. Days in  February
    9. 23 - 26
    10.  
    11. Days in  March
    12. 12 - 14
    13.  
    14. Days in  April
    15. 1 - 3
    16.  
    17. Days in  May
    18. 10 - 12
    PHP:
    PHP:
    1. <?php
    2.  
    3. function getIntervals($inData){
    4.  
    5.     $months = getMonths();
    6.  
    7.     foreach((array)$inData as $item){
    8.  
    9.         $pattern1 = "/^(\D+)(\d+)$/";
    10.         $pattern2 = "/^(\d{4})\-(\d{2})\-(\d{2})$/";
    11.         if(preg_match($pattern1, $item, $out))
    12.         {
    13.             $month = array_search(trim($out[1]), $months);
    14.             $day = intval($out[2]);
    15.         }
    16.         else if(preg_match($pattern2, $item, $out2))
    17.         {
    18.             $month = intval($out2[2])-1;
    19.             $day = intval($out2[3]);
    20.         }
    21.         else
    22.             return false;
    23.  
    24.         $groups[$month][] = $day;
    25.     }
    26.  
    27.     ksort($groups);
    28.  
    29.     foreach($groups as $preff => $group){
    30.  
    31.         sort($group);
    32.  
    33.         //---------------------------------
    34.         $interval = "";
    35.         $numberBefor = 0;
    36.         foreach($group as  $number)
    37.         {
    38.             if($numberBefor == 0)
    39.                 $interval = $number;
    40.             else
    41.             {
    42.                 if(($number - $numberBefor) > 1)
    43.                 {
    44.                     if($interval != $numberBefor)
    45.                         $interval .= " - $numberBefor";
    46.                     $intervals[$preff][] = $interval;
    47.                     $interval = $number;
    48.                 }
    49.             }
    50.             $numberBefor = $number;
    51.         }
    52.         if($interval != $number)
    53.             $interval .= " - $number";
    54.         $intervals[$preff][] = $interval;
    55.     }
    56.     return $intervals;
    57. }
    58.  
    59. //---------------------------------------------------------
    60.  
    61. function viewIntervals($intervals){
    62.     if($intervals)
    63.     {
    64.         $months = getMonths();
    65.         $out = "-----------------------------------<br>";
    66.         $out .= "Intervals:<br>";
    67.         foreach($intervals  as $month => $interval){
    68.             $out .= "Days in  {$months[$month]}:<br>";
    69.             foreach($interval as $numberDays)
    70.             {
    71.                 $out .= "$numberDays<br>";
    72.             }
    73.             $out .= "<br>";
    74.         }
    75.         echo $out;
    76.     }
    77. }
    78.  
    79. //---------------------------------------------------------
    80.  
    81. function getMonths(){
    82.   return  array_map(fn (int $m): string => (DateTime::createFromFormat('m-d', "$m-1")
    83.   -> format('F')),  range(1, 12),);
    84. }
    85.  
    86. //---------------------------------------------------------
    87.  
    88. $data = ["January 8", "May 11", "January 3","January 1", "April 2", "January 4","January 5", "May 11","February 24", "April 1", "February 25", "February 26", "March 12", "January 7", "March 13", "January 3", "March 14", "February 24", "April 3","May 10", "May 12","February 23"];
    89.  
    90.  
    91. $intervals = getIntervals($data);
    92. viewIntervals($intervals);
    93.  
    94. //-------------------------------------------------------
    95.  
    96. $data = ["2025-05-10", "2025-03-14","2025-05-11", "2025-01-04", "2025-03-13", "2025-01-08","2025-05-12", "2025-01-03",  "2025-04-03","2025-02-24", "2025-01-01", "2025-01-05", "2025-02-23",  "2025-02-25", "2025-02-26", "2025-03-12",  "2025-04-01", "2025-04-02", "2025-01-07"];
    97.  
    98.  
    99. $intervals = getIntervals($data);
    100. viewIntervals($intervals);
    101.  
    102. /*
    103.  
    104. -----------------------------------
    105.     Intervals:
    106.     Days in January:
    107.     1
    108.     3 - 5
    109.     7 - 8
    110.  
    111.     Days in February:
    112.     23 - 26
    113.  
    114.     Days in March:
    115.     12 - 14
    116.  
    117.     Days in April:
    118.     1 - 3
    119.  
    120.     Days in May:
    121.     10 - 12
    122.  
    123.     -----------------------------------
    124.     Intervals:
    125.     Days in January:
    126.     01
    127.     03 - 05
    128.     07 - 08
    129.  
    130.     Days in February:
    131.     23 - 26
    132.  
    133.     Days in March:
    134.     12 - 14
    135.  
    136.     Days in April:
    137.     01 - 03
    138.  
    139.     Days in May:
    140.     10 - 12
    141.  
    142. */
    Python:
    Код (Text):
    1. import re
    2. import datetime
    3. import calendar
    4.  
    5. def getintervals(inData):
    6.  
    7.   groups = {}
    8.   patt1 = re.compile(r'^(\D+)(\d+)$')
    9.   patt2 = re.compile(r'^(\d{4})\-(\d{2})\-(\d{2})$')
    10.   intervals = {}
    11.  
    12.   for item in inData:
    13.     if re.match(patt1,item):
    14.       out = patt1.findall(item)
    15.       month = list(calendar.month_name).index(out[0][0].strip());
    16.       day = int(out[0][1])
    17.     elif re.match(patt2,item):
    18.       out = patt2.findall(item)
    19.       month = int(out[0][1])
    20.       day = int(out[0][2])
    21.     else:
    22.       return intervals
    23.  
    24.     if month in groups:
    25.       groups[month].append(day)
    26.     else:
    27.       groups[month]=[day]
    28.  
    29.   monthGroups = sorted(list(groups.keys()))
    30.  
    31.   for preff in monthGroups:
    32.     group = groups[preff]
    33.     group.sort()
    34.     numberBefor = 0
    35.     for number in group:
    36.       val = str(number)
    37.       if numberBefor == 0:
    38.         interval = val
    39.       else:
    40.         if number - numberBefor > 1:
    41.           valBefor = str(numberBefor)
    42.           if interval != valBefor:
    43.             interval += " - " + valBefor
    44.           if preff in intervals:
    45.             intervals[preff].append(interval)
    46.           else:
    47.             intervals[preff]=[interval]
    48.           interval = val
    49.  
    50.       numberBefor = number
    51.  
    52.     if interval != val:
    53.       interval += " - " + val;
    54.     if preff in intervals:
    55.        intervals[preff].append(interval)
    56.     else:
    57.        intervals[preff] = [interval]
    58.  
    59.   return intervals;
    60.  
    61. #--------------------------------------
    62.  
    63. def viewIntervals(intervals):
    64.   out = "---------------------\n\n"
    65.   out += "intervals:\n\n"
    66.  
    67.   for month in  intervals:
    68.     out +=  "Days in  " +    calendar.month_name[month] + "\n"
    69.     for numberDays in intervals[month]:
    70.        out +=  numberDays + "\n"
    71.     out +=  "\n"
    72.   print(out)
    73.  
    74. #--------------------------------------
    75.  
    76. data = ["January 8", "May 11", "January 3","January 1", "April 2", "January 4","January 5", "May 11","February 24", "April 1", "February 25", "February 26", "March 12", "January 7", "March 13", "January 3", "March 14", "February 24", "April 3","May 10", "May 12","February 23"];
    77.  
    78. intervals = getintervals(data)
    79. viewIntervals(intervals)
    80.  
    81. #------------------------------------------------------------
    82.  
    83. data = ["2025-05-10", "2025-03-14","2025-05-11", "2025-01-04", "2025-03-13", "2025-01-08","2025-05-12", "2025-01-03",  "2025-04-03","2025-02-24", "2025-01-01", "2025-01-05", "2025-02-23",  "2025-02-25", "2025-02-26", "2025-03-12",  "2025-04-01", "2025-04-02", "2025-01-07"];
    84.  
    85. intervals = getintervals(data)
    86. viewIntervals(intervals)
    87.  
    88. """
    89. Output:
    90.  
    91. ---------------------
    92.  
    93. intervals:
    94.  
    95. Days in  January
    96. 1
    97. 3 - 5
    98. 7 - 8
    99.  
    100. Days in  February
    101. 23 - 26
    102.  
    103. Days in  March
    104. 12 - 14
    105.  
    106. Days in  April
    107. 1 - 3
    108.  
    109. Days in  May
    110. 10 - 12
    111.  
    112.  
    113. ---------------------
    114.  
    115. intervals:
    116.  
    117. Days in  January
    118. 1
    119. 3 - 5
    120. 7 - 8
    121.  
    122. Days in  February
    123. 23 - 26
    124.  
    125. Days in  March
    126. 12 - 14
    127.  
    128. Days in  April
    129. 1 - 3
    130.  
    131. Days in  May
    132. 10 - 12
    133.  
    134. """
    C++, Java и ECMAScript в zip-файле

    Удачи!
     

    Вложения:

    • IntervalsV2.zip
      Размер файла:
      5,9 КБ
      Просмотров:
      0