Имя: Пароль:
LIFE
 
OFF: конкурс по оптимизации кода pascal
,
0 program345
 
24.07.14
08:15
главный приз - признание форумчан.



задача: вводим три разные числа и надо найти максимальное но с выводом  номера числа. Например: вводим первое-1, второе-2, третье-3; вывод должен быть: наибольшее третье число.

примечание: если числа одинаковые это должно быть учтено, если максимальных чисел 2 это тоже должно быть учтено.

мое решение:

var
  a,b,c:integer;
begin
  write('введите 3 числа через пробел: ');
  read(a,b,c);
  if (a>b)and (a>c) then
    writeln('самое большое число введено первым')
    else
      if (b>c) and (b>a) then
       writeln('самое большое число введено вторым')
          else
            if (c>a) and (c>b)
              then writeln('самое большое число введено третьим')
                else
                  if (a=b) and (b=c) then
                    writeln('введенные числа равны');
                      if (a=b)and (a>c) then
                        writeln('самые больные числа - первое и второе ')
                          else
                            if (a=c)and (a>b) then
                              writeln('самые больные числа -  первое и третье')
                                else
                                  if (b=c) and (b>a) then
                                    writeln('самые больные числа - второе и третье');
end.

платформа PascalABC http://pascalabc.net
1 Ненавижу 1С
 
гуру
24.07.14
08:17
>>самые больные числа

порадовало
2 Wobland
 
24.07.14
08:17
массив чисел, массив найденных индексов
3 shuhard
 
24.07.14
08:17
(0)[главный приз - признание форумчан. ]
УГ твой паскаль, древний как гауно мамонта
4 Wobland
 
24.07.14
08:18
что-то поздновато для сессии
5 Ненавижу 1С
 
гуру
24.07.14
08:18
А почему не 1С? разницы собственно никакой
6 Ненавижу 1С
 
гуру
24.07.14
08:30
(0) как минимум последнее условие лишнее, варианты окончились
7 Ненавижу 1С
 
гуру
24.07.14
08:37
(0) наколеночное творение:

А=1;
Б=2;
В=3;

Если А>Б Тогда
    Если А>В Тогда
        Сообщить("1");
    ИначеЕсли А=В Тогда    
        Сообщить("1 3");
    Иначе
        Сообщить("3");
    КонецЕсли;     
ИначеЕсли Б>В Тогда    
    Если А=Б Тогда
        Сообщить("1 2");
    Иначе
        Сообщить("2");
    КонецЕсли;
ИначеЕсли Б=В Тогда
    Если А=Б Тогда
        Сообщить("1 2 3");
    Иначе
        Сообщить("2 3");
    КонецЕсли;
Иначе    
    Сообщить("3");
КонецЕсли;
8 vde69
 
24.07.14
08:40
мой препод первое чего сделал-бы на приемке это ввел такие числа "0" "Х" "К"....
9 Ненавижу 1С
 
гуру
24.07.14
08:42
(8) я думаю, автор предполагал корректные данные, ибо это уже совсем другая задача
10 SeraFim
 
24.07.14
08:44
(9) писать защиту от дурака тоже надо уметь
11 vde69
 
24.07.14
08:45
(9) нормализация ввода в паскале - это ОБЯЗАНОСТЬ, по тому как язык имеет строгую типизацию.
12 Эмбеддер
 
24.07.14
08:46
(0) открой для себя массивы
13 butterbean
 
24.07.14
08:46
м = макс(а,б,в);
т = "";
Если а = м тогда т = "1" конецЕсли;
Если б = м тогда т = т + " 2" конецЕсли;
Если в = м тогда т = т + " 3" конецЕсли;
сообщить(т);
14 MiniMuk
 
24.07.14
08:46
Г = максимум(максимум(А,Б),В);
Если А= г тогда writeln('самое большое число А');
Если Б= г тогда writeln('самое большое число Б');
Если В= г тогда writeln('самое большое число В');
15 butterbean
 
24.07.14
08:47
массивы нах, не наш метод :-)
16 vde69
 
24.07.14
08:47
и еще вариант ввода

"1" "1" "1"
17 Ненавижу 1С
 
гуру
24.07.14
08:48
(10)(11) я это прекрасно понимаю и считаю эту задачу проверки данных также важной, но ИМХО, эта задача тут боком
18 Эмбеддер
 
24.07.14
08:49
(17) + т.е. в принципе считывать число штатными средствами паскаля для лабораторной работы нельзя? и считывать строку, потом преобразовывать ее в число
19 СвинТуз
 
24.07.14
08:52
оптимизация бывает разной
если на длину кода это одно
если на быстродействие, то кейс и наверное лучше не будет
если на ресурсы то ввод по одному и двумя переменными можно обойтись.
20 MiniMuk
 
24.07.14
08:52
(8) если считавать readln("%d", А)
вроде не даст ввести не число
21 MiniMuk
 
24.07.14
08:53
(19) Еще можешь добавить читаемость кода
22 СвинТуз
 
24.07.14
08:54
(18)
давно в паскале работали? )
там жесткая типизация и нет графического интерфейса ...
раньше не было. Если это не делфи конечно.
23 СвинТуз
 
24.07.14
08:57
(19)
*тремя , количество дублей нужно хранить
24 Эмбеддер
 
24.07.14
09:04
(22) если вместо числа ввести строку, программа вылетит. у нас преподы действительно могли ввести строку вместо числа. но не для лабораторной работы, это должна быть курсовая
25 skunk
 
24.07.14
09:06
(24)программа не вылетит ... если использовать правильные директивы
26 СвинТуз
 
24.07.14
09:07
(24)
я уже не помню ничего ...

var
  a,b,c:integer;

read(a,b,c);

а даст ввести буквы?
27 sda553
 
24.07.14
09:11
Решение масштабируемое на любое количество чисел со сложностью О(N)

const N=3
var i,max :integer;
a:array[1..N] of integer;
begin
writeln('введите три числа');
for i:=1 to N begin
   readln(a[i]);
   if a[i]>max then
         max:=a[i];
end;
for i:=1 to 3 if a[i]=max then writeln(i);
end
28 Ярус
 
24.07.14
09:12
тс хитроопый студент, которому задали задачку, разводит
29 Эмбеддер
 
24.07.14
09:14
(25) видимо да. но по крайней мере буквы с консоли будут вводиться всегда, независимо от директив
(26) вот специально скачал turbo pascal, ввел букву вместо цифры, нажал enter. Error 106: Invalid numeric format
30 Эмбеддер
 
24.07.14
09:16
(25) у Турбо паскаля точно есть такая директива? может у Борланда конечно сделали, но у Турбо мало чего на Compiler Options есть
31 VladZ
 
24.07.14
09:18
(0) Однако не быть тебе программистом.
32 VladZ
 
24.07.14
09:19
+31 Мыслишь только категориями "Если - то".
33 VladZ
 
24.07.14
09:20
Настоящий программист мыслит алгоритмами.
34 Эмбеддер
 
24.07.14
09:20
(32) всегда должен быть вариант Иначе?
35 skunk
 
24.07.14
09:27
(30)точно ... у них различия были в другом
36 VladZ
 
24.07.14
09:29
(34) Речь не о том. Код не должен быть перегружен конструкциями "Если - то - иначе". Достаточно сравнить (0) и (27). В (27) четко прослеживается алгоритм:

1. Ввести числа.
2. Найти максимальное.
3. Показать максимальные числа.

Т.е. есть определенный порядок (он как известно начинается в голове). В (0) порядка нет. Сплошные "если"...
37 Соло
 
24.07.14
09:41
в (27) есть недоделки, а именно нет первоначального определения max (но при этом всё будет работать из среды, но выдаст ошибку при работе в EXE, компилятор очищает переменные при инициализации), ну и в последнем цикле опечатка 3 вместо N
38 sda553
 
24.07.14
09:43
(37) Я аналитик, а не программист. Подал идею реализации, а дальше пусть программеры дошлифовывают
39 VladZ
 
24.07.14
09:45
+36 Если мне, как преподавателю, принесли алгоритм как в (0). Я бы попросил решить эту задачу для 10 значений. Потом для 20ти. Потом для 100... Пока автор не начнет мозг напрягать.
40 mzelensky
 
24.07.14
10:12
Задача фигня - есть интересней, как мне кажется:

Даны 2 числа (любые!!!). Нужно определить какое из них больше, но при этом ЗАПРЕШЕНО использовать операторы сравнения (функции макс, мин, свитч и так далее тоже нельзя).

Язык реализации любой (паскаль, си, ява, 1С...)
41 sda553
 
24.07.14
10:17
(40) баян, не интересный
42 mzelensky
 
24.07.14
10:18
(41) Ну если знаешь решение, то не подсказывай. Остальные пусть подумают.
43 Asmody
 
24.07.14
10:18
а вот так эта задача решается на python

b = [a.index(x) for x in a if x == max(a)]

почувствуйте разницу
44 sda553
 
24.07.14
10:19
(43) почти никакой
45 Asmody
 
24.07.14
10:20
(44) с (27) никакой. но какова выразительность языка!
46 Wobland
 
24.07.14
10:21
(40) Сортировать() - не оператор сравнения
47 Ненавижу 1С
 
гуру
24.07.14
10:22
(46) тогда и Макс не оператор сравнения
48 sda553
 
24.07.14
10:25
(43) тут еще недочет, операция max имеет сложность О(n), и она у тебя она вызывается в цикле по n. В итоге, хоть это выражение и записывается так просто, оно будет иметь сложность o(n^2).
Так что на больших массивах выгоднее будет пожертвовать красотой и определить-запомнить max за границами цикла
49 Wobland
 
24.07.14
10:25
(47) mzelensky говорит, что это функция
50 Ненавижу 1С
 
гуру
24.07.14
10:28
(49) ну он еще говорит, что "и так далее тоже нельзя"
51 Wobland
 
24.07.14
10:29
(50) может, он нам ещё складывать запретит? постановка задачи некорректна имхо
52 Ненавижу 1С
 
гуру
24.07.14
10:33
(51) постановка скорее корректна, вот только решения в рамках 1С нет
в Джава вроде есть за счет битовых операторов
http://habrahabr.ru/post/124878/
53 mzelensky
 
24.07.14
10:40
(51) Давай не будем ЛЯ-ля!!! Как ты сделаешь сортировку без сравнения? Покажи!

Если ты явно не вызываешь операторы сравнения, то это еще не значит ,что метод "Сортировать" их не вызывает, а это по условию задачи - запрещено!
54 Ненавижу 1С
 
гуру
24.07.14
10:40
(40)
Середина = (А+Б)/2;
МодульРазности = Pow(Pow(А-Б,2),0.5);
Результат = Середина+МодульРазности/2;
55 sda553
 
24.07.14
10:41
(52) Тут подвох. Побитовые операции ни при чем.
Выражение x*'Y' имеет внутри языка реализацию в виде цикла по x с выводом 'Y'. Любой цикл имеет внутри условие выхода из него.
Т.е. в данном случае в выражении используются условное сравнение скрытое в реализации оператора.
56 Wobland
 
24.07.14
10:43
(53) функция, возвращающая максимум из двух чисел есть. миниму тоже. поменять местами два элемента массива без сравнения можно. а что там находится внутри Сортировать(), мне не интересно ;)
57 Wobland
 
24.07.14
10:44
+(56) мало ли где встретится какой-нибудь je или jne ;)
58 Ненавижу 1С
 
гуру
24.07.14
10:45
(55) ошибаешься, там арифметическое умножение
59 sda553
 
24.07.14
10:47
(58) А, точняк
60 mzelensky
 
24.07.14
10:51
(56) Чувак, не тупи - сегодян не пятница. Написано же:

ЗАПРЕШЕНО использовать операторы сравнения функции макс, мин, свитч и так далее тоже нельзя.

Какой нафиг:

"функция, возвращающая максимум из двух чисел есть. миниму тоже"
61 Wobland
 
24.07.14
10:55
(60) 1. плохо написано, не доходит
2. хорошо, нет. можно создать
62 mzelensky
 
24.07.14
10:58
(54) Что-то до меня не доходит что в "результате" должно получиться.

Например при

А = -10
Б = 5,6
63 Ненавижу 1С
 
гуру
24.07.14
11:02
(62) 5.6 должно получиться
64 sda553
 
24.07.14
11:03
Тогда аналог побитовой операции x>>1 в 1с будет
Цел(x/2), а аналогом а^b будет
Рез=0;
bitA = a-2*Цел(a/2);
a=Цел(a/2);
bitB = b-2*Цел(b/2);
b=Цел(b/2);
Рез=Рез+(bitB*bitB-bitA*bitA)*(bitB*biB-bitA*bitA);
bitA = a -2*Цел(а/2);
а=Цел(а/2);
... и т.д, 8 раз для каждого бита
65 sda553
 
24.07.14
11:05
(64) это к 52
66 mzelensky
 
24.07.14
11:05
(62) Я просто не помню что делает "Pow("

Мы так делали:

Попытка
Результат = Sqrt(А-Б);
Сообщить("А больше")
Исключение
Сообщить("Б больше")
КонецПопытки;
67 sda553
 
24.07.14
11:08
(66) используется условие в реализации оператора, незачет
68 Ненавижу 1С
 
гуру
24.07.14
11:09
(66) Pow это степень
69 mzelensky
 
24.07.14
11:13
(67) в попытке есть условие?
70 sda553
 
24.07.14
11:14
(69) Да, условие вида Если счетчикОшибок>0 в реализации оператора
71 Ненавижу 1С
 
гуру
24.07.14
11:16
(69) в попытке есть поднятие исключения, условие на которое проверяется, заходить в ветвь Исключение или нет
72 acsent
 
24.07.14
11:17
(16) может сразу:
х у @
73 Asmody
 
24.07.14
11:21
эту ссылку уже кидали? http://projecteuler.net/
74 Ненавижу 1С
 
гуру
24.07.14
11:23
(73) первая же задача, а там надо программировать или математику использовать?
75 sda553
 
24.07.14
11:28
(73) интересные задачки, пощелкаем
76 skunk
 
24.07.14
11:35
а чего там интересного ... просто ради любопытства первую задачку прочитал ... там она из учебника для школьников 8 или 9 класса ...
77 NikVars
 
24.07.14
11:40
(0) Звиздец! Цель оптимизации кода какая?!
78 Shurjk
 
24.07.14
11:43
Учитывая что всего три числа, то применение хитрых алгоритмов здесь нецелесообразно. Тупая задача.
79 mrDSide
 
31.07.14
13:38
Бред. А не судьба обойти 1 раз все 3 числа, потом второй раз просто сравнить и вывести те которые равны максимальному?
80 NS
 
31.07.14
13:57
var a,m,i:integer;
var s:string;
begin
   read(a);
   m:=a;
   s:="1";
   for i:=2 to 3 do
   begin
        read(a);
        if a=m then s:=s+","+chr(ord('0')+i) else
           if a>m then
              begin
                  m:=a;
                  s:=chr(ord('0')+i);
              end;
   end;
   writeln(s);
end.
81 NS
 
31.07.14
14:02
Виноват,
var a,m,i:integer;
var s:string;
begin
   read(a);
   m:=a;
   s:='1';
   for i:=2 to 3 do
   begin
        read(a);
        if a=m then s:=s+','+chr(ord('0')+i) else
           if a>m then
              begin
                  m:=a;
                  s:=chr(ord('0')+i);
              end;
   end;
   writeln(s);
end.
82 mrDSide
 
01.08.14
00:40
(80) (81) - ошибка. В условии вывести все максимальные числа.
83 NS
 
03.08.14
00:04
(82) В условии - вывести их порядковые номера.
84 mrDSide
 
03.08.14
22:14
(83) примечание: если числа одинаковые это должно быть учтено, если максимальных чисел 2 это тоже должно быть учтено.
85 User_Agronom
 
03.08.14
22:16
(3) Теорема Пифагора старше ;)
86 NS
 
03.08.14
22:17
(84) Ну и? У меня всё это учтено. Еще раз прочитай задание, и посмотри что у меня выводит.
87 mrDSide
 
04.08.14
13:03
(86) все верно, видимо поздно очень было.
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший