Ваша реклама могла б бути тут!
1 млн переглядів на місяць!
Google Page Rank: 5

Новые задачи по программированию или продолжение балета

🔴 20:19 Повітряна тривога в Харків.обл.
Статус: Offline
Реєстрація: 01.01.2011
Повідом.: 1622
  • 🔴 20:19 Повітряна тривога в Харків.обл.
  • #1
Новые задачи по программированию или продолжение балета

Итак, появилась задачка, есть строка с перечислением чисел в некоем диапазоне от 1 до эн. Пречисление через запятую, интервалы из 3-ех подряд и длиннее представдяются в виде границ интервала через тире, например
6,8,9,11,16-18,24
1-4,8,11,13,16,17,19
1-5,24
Необходима ф-ция, получающая 2 параметра:
исходную строку
число от 1 до эн,
возвращающая строку, составленную по тем же правилам, что и исходная из чисел, присутствующих в исходной, а также нового числа (аргумент 2). Причем ес-но аргумент уже моэжет быить в исходной строке.
Также нужна ф-ция удаляющая число.
 
  • 🔴 20:19 Повітряна тривога в Харків.обл.
  • #2
рацуха: интервалы от 2х и длиннее делать через тире. Так сделано в списках вланов в коммутаторах, и алгоритм от этого проще, а смысл тот же.
 
  • 🔴 20:19 Повітряна тривога в Харків.обл.
  • #3
я знаю, шо так сделано в списке вланов, это список вланов и есть!
вопрос в том, как навоять гавнокодик?
 
  • 🔴 20:19 Повітряна тривога в Харків.обл.
  • #4
допилишь сам а то голова болит :(

Код:
	public static String myMethod(String source, int number) {
		
		String[] s = source.split(",");
		
		StringBuilder sb = new StringBuilder();
		Integer prev = null;
		boolean inserted = false;
		for (String str:s) {
			if (str.indexOf("-") != -1) {
				String[] range = str.split("-");
				Integer low = Integer.parseInt(range[0].trim());
				Integer high = Integer.parseInt(range[1].trim());
				if ((number + 1) == low) {
					inserted = true;
					low--;
				}
				if ((number - 1) == high) {
					inserted = true;
					high++;
				}
				if (!inserted && ((number > low && number < high) || number == low || number == high)) inserted = true;
				sb.append(low).append("-").append(high).append(",");
				prev = high;
			} else {
				Integer i = Integer.parseInt(str.trim());
				if (i > number && (prev != null && prev < number)) {
					inserted = true;
					sb.append(number).append(",");
				} else if (i > number && prev == null) {
					inserted = true;
					sb.append(number).append(",");
				} else if (i == number) {
					inserted = true;
				}
				prev = i;
				sb.append(str).append(",");
			}

		}
		if (!inserted) sb.append(number).append(",");
		return sb.toString();
	}
 
  • 🔴 20:19 Повітряна тривога в Харків.обл.
  • #5
я знаю, шо так сделано в списке вланов, это список вланов и есть!
вопрос в том, как навоять гавнокодик?

Вот копипаста мной нацарапанного говнокодика:

Код:
def parse_line(line):
    numbers = set()
    for i in line.split(","):
        try:
            numbers.add(int(i))
        except ValueError:
            start, end = [int(x) for x in i.split("-")]
            numbers.update(set(range(start, end+1)))
    return numbers

def generate_line(numbers):
    in_range = False
    previous = numbers[0]
    line = "%d" % previous
    for i in numbers[1:]:
        if previous + 1 != i:
            if in_range:
                line += "-%d" % previous
                in_range = False
            line += ",%d" % i
        else:
            in_range = True
        previous = i
    if in_range:
        line += "-%d" % i
    return line

def insert_number(line, number):
    numbers = parse_line(line)
    numbers.add(number)
    numbers = list(numbers)
    numbers.sort()
    return generate_line(numbers)


import unittest

class testLine(unittest.TestCase):
    def test_parsing(self):
        self.assertEqual(parse_line("1-3,6-10"), set([1,2,3,6,7,8,9,10]))
    def test_generating(self):
        self.assertEqual(generate_line([1,2,3,5,6,7]), "1-3,5-7")

if __name__ == "__main__":
    unittest.main()
 
  • 🔴 20:19 Повітряна тривога в Харків.обл.
  • #6
о, я тоже так делал, просто может есть каике то готовые конструкции для работы с таким перечнем

Код:
sub port_add {
  my $ports = $_[0];
  my $new = $_[1];
  return $ports.",".$new;
}

sub port_rem {
  my $ports = $_[0];
  my $old = $_[1].",";
  my @arr = split(/,/,$ports);
  my $res = '';
  foreach my $port (@arr) {
    my $newport = $port;
    if (index($port,'-')>-1) {
      $newport = '';
      my @range = split(/-/,$port);
      for (my $i=$range[0]; $i<$range[1]+1; $i++) {
        $newport .= $i.",";
      }
      chop($newport);
    }
    $res .= $newport.",";
  }
  $res =~ s/$old//;
 # $res =~ s/,,/,/;
  chop($res);
  return $res;
}
 
  • 🔴 20:19 Повітряна тривога в Харків.обл.
  • #7
Здравствуйте, Стрензер,Айленд,Какмпот.
Радость переполнила мою душу,когда читал и думал,
как так может быть,что люди ,живущие в разных концах света,от разных родителей,разной национальности,разного возраста как в длине тела,так и в летах его,окончившие разные школы,имеющие разное количество детей,разного цвета жен, спящие в комнатах ногами в разные направления ,так чтобы не стыковались глаза, могут думать одинаково,читать одинаково,писать разными почерками одинаково,ходить на разные ноги одинаково, иметь одинаковое количество нейронного вещества и дружно понимать одинаково.
 
  • 🔴 20:19 Повітряна тривога в Харків.обл.
  • #8
Почему одинаково?
 
  • 🔴 20:19 Повітряна тривога в Харків.обл.
  • #9
Потому что у него оливье в черепной коробке
 
  • 🔴 20:19 Повітряна тривога в Харків.обл.
  • #10
Потому что у него оливье в черепной коробке

Здрастуй ,ты помнишь меня ?
Как ничтожно неразумно твое сознание по сравнению с тайнами вселенной ,которыми владеет лишь их создатель.
 
Назад
Зверху Знизу