powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / еще одна задача по прогаммированию
63 сообщений из 63, показаны все 3 страниц
еще одна задача по прогаммированию
    #35018781
Фотография -Sergey-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в последнне время как обычно перед сессией увеличилось кол-во постов от учащихся с просьбой решить элементарные задачи по программированию( сложить, умножить матрицы и т.д. )

меня тоже настигла эта волна в виде бывшего одногруппника,
который в разговоре по аське поделился печалью как он решал задачу по програмированию 2 дня.
мне стало очень интересно .. условие задачи он скинул - и ничего экстраординарного в ней не было..
у меня на решение данного примера ушло около 15 минут - это гораздо меньше но не показательно, дело в том что одногруппник весьма далек от программирования

Условиеданы числа 1, 2, 3, 4, 5, 6, 7. Как их сложить, используя все семь, чтобы получилось 99.
Пример сложения: 1+2+3+54+67, 21+34+7+6+5, 1+2+3+4+5+6+7 1+27+3+46 и т.д.

меня боле заинтересовало на сколько сильно можно оптимизировать решение, на сколько туго закрутиь все гайки. чтобы получить максимальный результат.

и так предлагаю что-то вроде конкурса на самое оптимальное решение:
1. по скорости
2. по количеству строк кода

мой вариант смотрите ниже

-

Цель в жизни определяет все..
Выбор есть всегда..
Но мы часто не хотим его делать..
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35018795
Фотография -Sergey-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
#include "stdio.h"

int main(){

    int ish[] = {  1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7  };
    int vart[ 100 ] = {  0  };
    int kol =  0 ;
    int obsKolvo =  0 ;

    for ( int i =  0 ; i <  7 ; i++ )
    {

        for ( int j =  0 ; j <  7 ; j++ )
        {
            if ( ish[i] != ish[j] ){
                vart[kol] = ish[i]* 10  + ish[j];
                kol++;
            }

        }
        printf( "\n" );

    }

    printf( "Kol-vo elementov=%i", kol);

    for ( int i =  0 ; i <  7 ; i++ )
    {
        int a = ish[i];

        for ( int j =  0 ; j < kol; j++ )
        {
            if ( a != vart[j]/ 10  && a != vart[j]% 10  &&  a + vart[j] <  99  )
            {
                int b = vart[j];

                for ( int k =  0 ; k < kol; k++ )
                {
                    if ( b != vart[k]/ 10  && b != vart[k]% 10  && a != vart[k]/ 10  && a != vart[k]% 10  && a + b + vart[k] <  99  )
                    {
                        int c = vart[k];

                       for ( int l =  0 ; l < kol; l++ )
                       {
                            int d  = vart[l];
                            if ( a != d/ 10  && a != d% 10  &&  b != d/ 10  && b != d% 10  &&  c != d / 10  && c != d% 10  && a + b + c + d ==  99  )
                            {

                                printf( "res = %i %i %i %i \n", a, b, c, d );
                                obsKolvo++;
                            }

                       }

                    }

                }

            }

        }

    }

    printf( "Obsh Kolvo Variantov=%i", obsKolvo );
    return  0 ;
}

из принципа оптимизации следует ввести проверку числа В : В должно быть меньше 86
так как 1+2+3+4+5 +B(86) >99
-

Цель в жизни определяет все..
Выбор есть всегда..
Но мы часто не хотим его делать..
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35018804
Фотография -Sergey-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
  
...
 if ( b != vart[k]/ 10  && b != vart[k]% 10  && a != vart[k]/ 10  && a != vart[k]% 10  && a + b + vart[k] <  99   && b <  86  )
...
-

Цель в жизни определяет все..
Выбор есть всегда..
Но мы часто не хотим его делать..
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35018840
0bsid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-Sergey-...
и так предлагаю что-то вроде конкурса на самое оптимальное решение:
1. по скорости
2. по количеству строк кода
...

3. лучше на понятность кода
а то ish, vart и прочая куча вложенных циклов и условий
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35018850
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-Sergey-Как их сложить, используя все семь, чтобы получилось 99.
По-моему, никак. Выходит ноль результатов.

-Sergey-1. по скорости
Лень, честно говоря.

-Sergey-2. по количеству строк кода
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
 type 
  TDigit =  1 .. 7 ;
  TDigits =  set   of  TDigit;

 procedure  Calc (Sum, Cur: integer; Trace:  string ; Digits: TDigits);
 var  i: integer;
 begin 
   if  Digits = []  then 
     if  Sum + Cur =  99   then 
      FormCalc.edResult.Lines.Add (Trace + '+' + IntToStr (Cur))
     else 
   else 
     for  i := Low (TDigit)  to  High (TDigit)  do 
       if  i  in  Digits  then 
       begin 
         if  Cur >  0   then  Calc (Sum + Cur, i, Trace + '+' + IntToStr (Cur), Digits - [i]);
        Calc (Sum, Cur *  10  + i, Trace, Digits - [i]);
       end ;
 end ;

 procedure  TFormCalc.btnCalcClick(Sender: TObject);
 begin 
  edResult.Clear;
  Calc ( 0 ,  0 , '', [ 1 .. 7 ]);
 end ;
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35018860
:(
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
:(
Гость
Странно, мой код сказал, что таких комбинаций нет :(
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35018868
:(
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
:(
Гость
Код: plaintext
1.
2.
Not found... Iterations =  210 
In  0  msec
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35018870
:(
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
:(
Гость
Тут негде соревноваться по скорости.
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35018909
0bsid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я тож не нашёл
64 варианта
самый близкий 1 + 23 + 4 + 5 + 67 = 100
тото он второй день решает
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35018922
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-Sergey-мой вариант смотрите ниже
1) мешанина из Си и С++
2) обилие нечитаемых имен переменных
3) возможно считает не правильно. В условии не сказано что можно одну и туже цифру использовать дважды. Впрочем и запрета на это нету, хотя он обычно подразумевается в таких задачах.
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35018932
0bsid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl..
3) возможно считает не правильно. В условии не сказано что можно одну и туже цифру использовать дважды. Впрочем и запрета на это нету, хотя он обычно подразумевается в таких задачах.
вот блин, я не заметил даже, что их можно переставлять
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35018933
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0bsidсамый близкий 1 + 23 + 4 + 5 + 67 = 100
Да, если скорректировать, вариантов полно. Например, без единицы:
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35018985
Фотография -Sergey-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0bsid softwarer and other
да я действительно не сказал что мой вариант "условно" правильный. :-)
При заданных условиях (не использовать перестановку , использовать цифру только один раз ) толку в нем ноль..

3. читабельность кода(оформление) - это хороший критерий , и
мой код на него не претендует, но учитывать его стоит.

по признаку 2 и 3 наиболее удачным является пример softwarer

-

Цель в жизни определяет все..
Выбор есть всегда..
Но мы часто не хотим его делать..
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35019001
Фотография -Sergey-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если кому-то еще данный топик интересен предлагаю следующую задачку

Условие: написать функцию которая на входе получает байт а на выходе возвращает количество установленных в нем битов, написать несколько вариантов функции :
а) опитимизованный по памяти
б) оптимизированный по скорости


данную задачу я прочитал давно на каком-то форуме посвященному поиску работы, и на авторство не предендую.

-

Цель в жизни определяет все..
Выбор есть всегда..
Но мы часто не хотим его делать..
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35019025
:(
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
:(
Гость
-Sergey-
Условие: написать функцию которая на входе получает байт а на выходе возвращает количество установленных в нем битов, написать несколько вариантов функции :
а) опитимизованный по памяти
б) оптимизированный по скорости


данную задачу я прочитал давно на каком-то форуме посвященному поиску работы, и на авторство не предендую.
Возникают сомнения в том, что здесь вообще что-то можно оптимизировать. Алгоритм известен 100 лет и туп как дрова.
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35019040
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алгоритм - слишком громкое слово Упражнение на знание системы команд.
Для Эльбруса - одна команда - ПЧЕ
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35019088
Фотография -Sergey-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:( -Sergey-
Условие: написать функцию которая на входе получает байт а на выходе возвращает количество установленных в нем битов, написать несколько вариантов функции :
а) опитимизованный по памяти
б) оптимизированный по скорости


данную задачу я прочитал давно на каком-то форуме посвященному поиску работы, и на авторство не предендую.
Возникают сомнения в том, что здесь вообще что-то можно оптимизировать. Алгоритм известен 100 лет и туп как дрова.

код в студию :-)
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35019092
Фотография -Sergey-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилАлгоритм - слишком громкое слово Упражнение на знание системы команд.
Для Эльбруса - одна команда - ПЧЕ
к сожаления с Эльбрусом не знаком, но я не занал что существует стандартное решение данной задачи..
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35019100
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
массив из 256 элементов, содержащтй к-во единиц в байте, используемом как индекс массива - как самое быстрое устроит?
Оптимизированный по памяти - в каких попугаях измерять будем?
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35019103
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилАлгоритм - слишком громкое слово Упражнение на знание системы команд.
Для Эльбруса - одна команда - ПЧЕ
фигасе. какие люди
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35019105
:(
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
:(
Гость
Можно смело писать вот так (особенно, когда у нас двухбатовые и более числа).
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
    private final static byte[] BITS = new byte[] {
                                        1 ,  2 ,  4 ,  8 ,  16 ,  32 ,  64 , (byte)  128 };
    public static byte getBytesCount (byte b) {
        byte sum =  0 ;
        for (int i =  0 ; i < BITS.length; i++) {
            sum += (b & BITS[i]) ==  0  ?  0  :  1 ;
        }
        return sum;
    }
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35019668
0bsid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:(Можно смело писать вот так (особенно, когда у нас двухбатовые и более числа).
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
    private final static byte[] BITS = new byte[] {
                                        1 ,  2 ,  4 ,  8 ,  16 ,  32 ,  64 , (byte)  128 };
    public static byte getBytesCount (byte b) {
        byte sum =  0 ;
        for (int i =  0 ; i < BITS.length; i++) {
            sum += (b & BITS) ==  0  ?  0  :  1 ;
        }
        return sum;
    }


вместо BITS [i] мог бы написать (1<<i) и убрать массив BITS
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35019713
Фотография -Sergey-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилОптимизированный по памяти - в каких попугаях измерять будем?
на сколько я помню критерием выступало количество переменных и их размерность -
чем больше количество используемых для вычисления переменных тем менее эфективен код по памяти.
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35019838
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0bsid
вместо BITS мог бы написать (1<<i) и убрать массив BITS

оптимизирующему компилятору - по барабану, он цикл развернёт, а константы -вместо выборки из массива - будет сам сдвигом в регистре формировать.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
?getBytesCount@@YAEE@Z PROC				; getBytesCount, COMDAT
; _b$ = ecx

;  10    :         unsigned char sum =  0 ;
;  11    :         for (int i =  0 ; i <  8 ; i++) {
;  12    :             sum += (b & BITS[i]) ==  0  ?  0  :  1 ;

   00000 	8a c1		 mov	 al, cl
   00002 	c0 e8  06 	 shr	 al,  6 
   00005 	 24   01 		 and	 al,  1 
   00007 	8a d1		 mov	 dl, cl
   00009 	c0 ea  05 	 shr	 dl,  5 
  0000c	 80  e2  01 	 and	 dl,  1 
  0000f	 02  c2		 add	 al, dl
   00011 	8a d1		 mov	 dl, cl
   00013 	c0 ea  04 	 shr	 dl,  4 
   00016 	 80  e2  01 	 and	 dl,  1 
   00019 	 02  c2		 add	 al, dl
  0001b	8a d1		 mov	 dl, cl
  0001d	c0 ea  03 	 shr	 dl,  3 
   00020 	 80  e2  01 	 and	 dl,  1 
   00023 	 02  c2		 add	 al, dl
   00025 	8a d1		 mov	 dl, cl
   00027 	c0 ea  02 	 shr	 dl,  2 
  0002a	 80  e2  01 	 and	 dl,  1 
  0002d	 02  c2		 add	 al, dl
  0002f	8a d1		 mov	 dl, cl
   00031 	d0 ea		 shr	 dl,  1 
   00033 	 80  e2  01 	 and	 dl,  1 
   00036 	 02  c2		 add	 al, dl
   00038 	8a d1		 mov	 dl, cl
  0003a	c0 ea  07 	 shr	 dl,  7 
  0003d	 02  c2		 add	 al, dl
  0003f	 80  e1  01 	 and	 cl,  1 
   00042 	 02  c1		 add	 al, cl

;  13    :         }
;  14    :         return sum;
;  15    :     }
Вопрос остаётся - в каких попугаях будем измерять оптимизацию по памяти?
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35019876
0bsid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил 0bsid
вместо BITS мог бы написать (1<<i) и убрать массив BITS

оптимизирующему компилятору - по барабану, он цикл развернёт, а константы -вместо выборки из массива - будет сам сдвигом в регистре формировать.

Вопрос остаётся - в каких попугаях будем измерять оптимизацию по памяти?

Код: plaintext
shr	dl,  7 
интересно он двигает биты
по идее должно быть shl dl, 1

вообще задача для 7-классника
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35019891
:(
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
:(
Гость
0bsidвместо BITS мог бы написать (1<<i) и убрать массив BITS
Мог бы. Только не хотел.
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35020333
MAPA3OT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
господа, хоть режьте меня, хоть бейте
но вот это вот:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
	    byte[] BITS = new byte[] {
             1 ,  2 ,  4 ,  8 ,  16 ,  32 ,  64 , (byte)  128 };
	    byte sum =  0 ;
	    Random r = new Random();
	    byte[] bytes=new byte[ 10000000 ];
	    for (int i= 0 ;i<bytes.length;i++)
	    {
	    	bytes[i]=(byte)r.nextInt( 256 );
	    }

	    int byteLength=bytes.length;
	    for (int i= 0 ;i<byteLength;i++)
	    {
	    	bytes[i]=(byte)r.nextInt( 256 );
	    }

	    long time1=new Date().getTime();
	    for (int j= 0 ;j<byteLength;j++)
	    {
 
	    	sum= 0 ;
	    	byte b=bytes[j];
			for (int i =  0 ; i < BITS.length; i++) {
			sum += (b & BITS[i]) ==  0  ?  0  :  1 ;
			}
	    }
		
	    System.out.println(new Date().getTime()-time1);
		
	    long time2=new Date().getTime();
	    for (int j= 0 ;j<byteLength;j++)
	    {
	    	sum= 0 ;
	    	byte b=bytes[j];
			while (b> 0 )
			{
				if (b% 2 == 0 )sum++;
				b=(byte)(b/ 2 );
			}
	    }
		
	    System.out.println(new Date().getTime()-time2);

        long time3=new Date().getTime();
	    for (int j= 0 ;j<byteLength;j++)
	    {
	    	sum= 0 ;
	    	byte b=bytes[j];
			while (b> 0 )
			{
				sum=(byte)(sum+b% 2 );
				b=(byte)(b/ 2 );
			}
	    }
		
	    System.out.println(new Date().getTime()-time3);
Говорит, что
1-ый кусок кода выполняется за 984 мс,
2-ой за 485 мс
3-ий за 375 мс
, вот такая вот загогулина.
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35020379
MAPA3OT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если же в первом варианте алгоритма, мы меняем проверку по массиву, на
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
for (int j= 0 ;j<byteLength;j++)
	    {
 
	    	sum= 0 ;
	    	byte b=bytes[j];
			for (int i =  0 ; i <  8 ; i++) {
			sum += ((b>>i)& 1 );
			}
	    }
то время будет - 360
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35020388
:(
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
:(
Гость
Код: plaintext
1.
2.
3.
 359 
 422 
 219 

Возвращает 0. Как это работает?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
sum =  0 ;
         byte  b = ( byte )  255 ;
         while  (b >  0 ) {
            sum = ( byte ) (sum + b %  2 );
            b = ( byte ) (b /  2 );
        }
        System.out.println("sum = " + sum);
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35020392
:(
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
:(
Гость
MAPA3OTесли же в первом варианте алгоритма, мы меняем проверку по массиву...
Код: plaintext
1.
2.
3.
4.
 218 
 375 
 422 
 219 

Значит мое предположение об интеллектуальности компилятора Java не оправдалось.
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35020398
MAPA3OT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тэк-с, удалось еще чуть-чуть сократить время
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 for (int j= 0 ;j<byteLength;j++)
	    {
 
	    	sum= 0 ;
	    	byte b=bytes[j];
			for (int i =  0 ; (b>>i)> 0 ; i++) {
			sum += ((b>>i)& 1 );
			}
	    }
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35020412
:(
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
:(
Гость
MAPA3OTтэк-с, удалось еще чуть-чуть сократить время
Займись чем-нибудь полезным :)
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35020460
MAPA3OT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
работает нормально, только не правильно :)
Кстати, второй вариант тоже косячный :(
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35022940
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:(Странно, мой код сказал, что таких комбинаций нет :(
Скорее всего можно использовать не только +, но и - :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
module Main where
 
solve []     n = []
solve (d:ds) n = map ((show n ++ "=")++) (solve' d ds n)
    where
        solve' cur []     n | cur == n = [show cur]   
        solve' cur (d:ds) n = solve' (cur*10+d) ds n
                              ++ (map ((show cur ++ "+")++) (solve' d ds (n-cur)))  
                              ++ (map ((show cur ++ "-")++) (solve' d ds (n+cur)))  
        solve' _   _      _ = []   
 
main = putStrLn $ unlines $ map show $ filter (not.null) $ map (solve [1..7]) [90..100] 

Фактически решение в 8 строчек :)

Результат:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
["90=1+23+4+5-67","90=1+23-45+67","90=1-23+4-5+67"]
["91=123+45-6+7","91=12+3+4+5+67","91=1+23+4+56+7"]
["92=1+23+4-5+67"]
["93=1-2-34+5-67"]
["94=12-34+5+67","94=1-2-34+56+7"]
["95=1+2-34+5-67"]
["96=1+2-34+56+7"]
["97=12-3-45+67","97=1-2+34+5-67"]
["98=1-23+4+5+67","98=1-2+34+56+7"]
 ["99=1+2+34+5-67"] 
["100=1+23+4+5+67","100=1+2+34+56+7"]
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35022955
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs
"99=1+2+34+5-67"
калькулятор утверждает, что это выражение = -25 (((
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35022974
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych NotGonnaGetUs
"99=1+2+34+5-67"
калькулятор утверждает, что это выражение = -25 (((

Есть такое. Багс :)
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35023085
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych NotGonnaGetUs
"99=1+2+34+5-67"
калькулятор утверждает, что это выражение = -25 (((

Тоже самое без багов:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
module Main where
 
solve []     n = []
solve (d:ds) n = map ((show n ++ "=")++) (solve' (+) 0 d ds) 
    where
        solve' f acc cur []     | f acc cur == n = [show cur]   
        solve' f acc cur (d:ds) = solve' f acc (cur*10+d) ds
                              ++ (map ((show cur++"+")++) (solve' (+) (f acc cur) d ds))  
                              ++ (map ((show cur++"-")++) (solve' (-) (f acc cur) d ds))  
        solve' _ _   _   _ = []   
 
main = putStrLn $ unlines $ map show $ filter (not.null) $ map (solve [1..7]) [90..100] 

Результат:

Код: plaintext
1.
2.
3.
4.
5.
6.
["90=1+23+4-5+67","90=1-23+45+67"]
["91=123-45+6+7","91=12+3+4+5+67","91=1+23+4+56+7"]
["92=1+23-4+5+67"]
["95=12+34+56-7","95=1-2+34-5+67"]
["96=1-2+34+56+7"]
 ["99=1+2+34-5+67"] 
["100=1+23+4+5+67","100=1+2+34+56+7"]
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35024588
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs
Код: plaintext
module Main where
А это на чем, простите?
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35024622
:(
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
:(
Гость
White Owl NotGonnaGetUs
Код: plaintext
module Main where
А это на чем, простите?
На чем-то лиспоподобном.
Медленное, тормознутое, для реальных задач неприменимое, но вот поиграться — отличная штука.
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35024780
Егорище85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl NotGonnaGetUs
Код: plaintext
module Main where
А это на чем, простите?

Очень похоже на Хаскелл. Но, мне кажется, решение неправильное, т.к. перестановки цифр не учитываются...
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35024866
Егорище85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, задача конечно тупая - нужно фактически все перестановки и все склейки рассмотреть. Для 99 у меня решения нет. А вот для 100 - 8352 варианта.

Время расчета - 5 секунд (правда на бесплатном учебном компиляторе )

Реализация, разумеется, на самом лучшем языке программирования - Лиспе (диалект - Scheme).

Код не очень красивый, но и алгоритм не строгий с точки зрения математики... Перебор дурацкий ведь...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
(define (split-one items)
        (if (null? (cdr items)) items 
                                (list (car items) (cdr items))
        )
)

(define (split-two items)
        (if (null? (cdr items)) ()
                                (if (null? (cdr (cdr items))) (list (+ (* (car items)  10 ) (car (cdr items))))
                                                              (list (+ (* (car items)  10 )
                                                                       (car (cdr items))
                                                                    )
                                                                    (cdr (cdr items))
                                                              )
                                )
        )
)

(define (split-one-iteration items)
        (define (iter-split result elems)
                (if (null? elems) result
                    (if (not (pair? (car elems))) (iter-split (append result (list (car elems))) (cdr elems))
                                                  (let ((car-elems (car elems))
                                                       )                                                     
                                                       (if (null? (split-two car-elems)) (append result (split-one car-elems))
                                                                                         (list (append result (split-one car-elems))
                                                                                               (append result (split-two car-elems))
                                                                                         )
                                                       )
                                                  )
                    )
                )
        )
        (if (null? items) items
                          (iter-split () items)                
        )
)

(define (split items)
        (if (simple-list? items) (list items)
                                 (if (have-pairs? items) (flatmap (lambda (x) (if (simple-list? x) (list x) 
                                                                                                   (split (split-one-iteration x))
                                                                                                    
                                                                              )
                                                                  )
                                                                  items
                                                         )
                                  )
        )
)

(define (task digits require-sum)
        (if (null? digits) ()
                           (filter (lambda (x) (= (accumulate +  0  x) require-sum))
                                   (split (flatmap (lambda (x)
                                                           (list (split-one x) (split-two x)
                                                           )
                                                   ) 
                                                   (permutations digits)
                                          )
                                   )
                           )
        )
)

Результат выполнения:
Код: plaintext
(task (list  1   2   3   4   5   6   7 )  100 )
здесь
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35024926
:(
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
:(
Гость
Егорище85
Время расчета - 5 секунд (правда на бесплатном учебном компиляторе )
На тормознутой джаве эта задача занимает неощутимые доли миллисекунды.
Лисп решает, ясен перец.
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35024953
Егорище85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:( Егорище85
Время расчета - 5 секунд (правда на бесплатном учебном компиляторе )
На тормознутой джаве эта задача занимает неощутимые доли миллисекунды.
Лисп решает, ясен перец.

Ну да, такие задачи конечно же очень часто встречаются.

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

Если хотите, чтобы быстро работало - берите голый С и высчитывайте мили- и микросекунды...
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35025371
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:( White Owl NotGonnaGetUs
Код: plaintext
module Main where
А это на чем, простите?
На чем-то лиспоподобном.
Медленное, тормознутое, для реальных задач неприменимое, но вот поиграться — отличная штука.

Напрасно так думаете. Всего раз в 8 медленнее, чем java %)

Егорище85
Очень похоже на Хаскелл. Но, мне кажется, решение неправильное, т.к. перестановки цифр не учитываются...


Он самый. При желании, можно расширить задачу расстановкой скобок :)
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35025439
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUsПри желании, можно расширить задачу расстановкой скобок :) для сложения/вычитания расстановка скобок ни помочь, ни помешать не может
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35025500
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych NotGonnaGetUsПри желании, можно расширить задачу расстановкой скобок :) для сложения/вычитания расстановка скобок ни помочь, ни помешать не может

Ну мы же не в первом классе. Добавим возможность использовать * и / :)
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35026121
Егорище85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUsОн самый. При желании, можно расширить задачу расстановкой скобок :)

Приятно увидеть любителя функциональных языков. Давно с хаскеллом играетесь?
Используете его для реальных задач?
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35026137
Егорище85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUsНапрасно так думаете. Всего раз в 8 медленнее, чем java %)

А что за компилятор использовали? Hugs 98?
Дело ведь наверно не только в самом языке...

Кстати у меня работает так долго потому что алгоритм самый дубовый был выбран - все перестановки, а это 7! а потом все возможные парные склейки подряд (без изменения порядка), а это еще около 2^7.

Наверно можно как-то хитрее задачу решить...
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35026275
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Мысль дурацкая шевельнулась, что надо-де BCD-арифметику использовать. Пока обосновать не могу... Внутренний голос советует

2) Есть один сайтец, где подобные задачки (проблемы) решают каждый день, да еще и конкурсы устраивают. Как-бишь его... Забыл...

3) Эх... нету Ксенофонта...
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35026767
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Егорище85 NotGonnaGetUsНапрасно так думаете. Всего раз в 8 медленнее, чем java %)

А что за компилятор использовали? Hugs 98?
Дело ведь наверно не только в самом языке...

Кстати у меня работает так долго потому что алгоритм самый дубовый был выбран - все перестановки, а это 7! а потом все возможные парные склейки подряд (без изменения порядка), а это еще около 2^7.

Наверно можно как-то хитрее задачу решить...

ghc.

Сделал твой алгоритм на haskell (чтобы сравнить лаконичность кода и время работы одного и того же дубового алгоритма):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
module Main where
 
import Text.Printf
import System.CPUTime
 
--- Solution:
 
permutations :: Eq a => [a] -> [[a]]
permutations []    = [[]]
permutations xs = concat [map (x:) (permutations $ filter (x/=) xs) | x <- xs]
 
splice :: [a] -> [[[a]]]
splice []     = [[]]
splice xs = concat [map (first:) (splice rest) | (first, rest) <- split2 xs]
    where
        split2 xs = map (\n -> splitAt n xs) [1.. length xs]
          
combineInts :: [[Int]] -> [Int]
combineInts [] = []
combineInts xs = foldr (\x r -> makeInt x : r) [] xs
    where
        makeInt = foldl (\n r -> n * 10 + r) 0
 
solve :: [Int] -> Int -> [[Int]]           
solve [] n = []
solve xs n = filter (\e -> n == sum e) $ concatMap ((map combineInts). splice) $ permutations xs
 
--- Run test and show computation time:
 
main = 
    do
        putStrLn "Starting..."
        time $ putStrLn $ unlines $ map show $ solve [1..7] 100
        putStrLn "Done."
    where
        time :: IO t -> IO t
        time a = do
            start <- getCPUTime
            v <- a
            end   <- getCPUTime
            let diff = (fromIntegral (end - start)) / (10^12)
            printf "Computation time: %0.3f sec\n" (diff :: Double)
            return v


Получаются теже 8352 вариантов для 1..7 и 100.
Код: plaintext
1.
Computation time: 1.375 sec

Хаскелл круче лиспа :)
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35026938
Егорище85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUsХаскелл круче лиспа :)

По красоте кода - да.
Насчет скорости я грешу всё же на интерпретатор, Scheme - упрощенный диалект лиспа и интерпретатор Dr.Scheme предназначен всё же для учебных задач.

Фиг знает, как это будет работать на Common Lisp, я пока ещё не дорос...

Хаскелл - лучшее воплощение функциональной парадигмы, поэтому код такой красивый и изящный. Но Лисп, в свою очередь, лучше реализует возможности метапрограммирования.

У меня есть ощущение, что при умелом обращении из Лиспа можно гораздо больше выжать, чем из Хаскелла.

Кстати, вот статья Пола Грэма, которую Ксеноцефал рекомендовал почитать - http://startupjournal.ru/articles-graham-lisp.php (на русском). Довольно интригующе.
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35026962
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прикольно всё-таки.

Решение на haskell:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
solve [] n = []
solve xs n = filter ((n==).sum) $ concatMap ((map combineInts). splice) $ permutations xs
    where
        permutations [] = [[]]
        permutations xs = concat [map (x:) (permutations $ filter (x/=) xs) | x <- xs]
         
        splice [] = [[]]
        splice xs = concat [map (first:) (splice rest) | (first, rest) <- map (\n -> splitAt n xs) [1.. length xs]]
                   
        combineInts [] = []
        combineInts xs = foldr (\x r -> foldl (\n r -> n * 10 + r) 0 x : r) [] xs

Занимает количество строк меньшее, чем одна только генерация всех перестановок на java или любом другом мейнстрим языке... :)
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35027090
:(
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
:(
Гость
NotGonnaGetUsПрикольно всё-таки.

Решение на haskell:

...
Занимает количество строк меньшее, чем одна только генерация всех перестановок на java или любом другом мейнстрим языке... :)
softwarer уже дал решение на Delphi :)
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35027351
pirovindos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример того, как нельзя решать задачи по програмированию
Консольное на С++. MS VS 2005.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#define N ( 7 )
#define M  100000 
typedef unsigned char BYTE;
BYTE randN() {return BYTE((double)rand()/((double)RAND_MAX+ 1 )*(N+ 1 ));}
int _tmain(int argc, _TCHAR* argv[])
{
	int res =  99 ,i,j,k,a,na,sum;
	BYTE s[N+N];
	for(i= 0 ;i<M;i++)
	{	s[ 0 ]= 0 ;	na =  0 ;	sum =  0 ;
		for(j= 1 ;j<N+N;j++)
		{
			do
			{
				a=randN();
				if(j> 2 &&a!= 0 &&s[j- 1 ]!= 0 &&s[j- 2 ]!= 0 ) a= 0 ;
				if(a!= 0 ) for(k= 1 ;k<j;k++) if(s[k]==a) break;
			}while((a!= 0  && k!=j) || (a== 0 &&s[j- 1 ]== 0 ));
			s[j]=a;
			if(a!= 0 ) na++; else	sum+=s[j- 2 ]* 10 +s[j- 1 ];
			if(na==N)
			{
				sum+=s[j- 1 ]* 10 +s[j];
				break;
			}
		}
		if(na==N && sum==res) break;
	}
	if(i==M) printf("Unsuccess!\n");
	else
	{
		for(k= 1 ;k<=j;k++) s[k- 1 ]=(s[k]?s[k]+ 48 :'+'); s[j]= 0 ;
		printf("%s=%d\n",s,sum);
		printf("Success!\n");
	}
	getch();
	return  0 ;
}
Если изменить 99 на 100, то Success!
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35027363
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:(softwarer уже дал решение на Delphi :)

И чего? Где там генерация перестановок и прочии прелести "дубового" алгоритма, готовые к реюзу? Если на дельфи реализовать тот же самый алгоритм будет существенно больше кода.


Эквивалент алгоритма softwarer'a на хаскелл вот:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
solve [] n = []
solve ds n = concatMap (\d -> (solve' d (filter (d/=) ds) n)) ds    
    where
        solve' cur [] n | cur == n  = [show cur]
        solve' cur ds n | cur > n   = [] --optimization 
                        | otherwise = concatMap (\d -> solve' (cur*10+d) (filter (d/=) ds) n) ds
                                      ++ (map ((show cur ++ "+")++) (solve ds (n-cur)))          
 
Computation time: 0.156 sec

Как видно, он эффективнее дубового алгоритма в 10 раз.
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35027408
:(
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
:(
Гость
NotGonnaGetUs
И чего? Где там генерация перестановок и прочии прелести "дубового" алгоритма, готовые к реюзу?
Зачем нам дубовый алгоритм?
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35027415
Егорище85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:( NotGonnaGetUs
И чего? Где там генерация перестановок и прочии прелести "дубового" алгоритма, готовые к реюзу?
Зачем нам дубовый алгоритм?

Дубовой задаче - дубовый алгоритм

Кстати, а что думают опытные люди, может ли решение подобных задач научить чему-нибудь полезному?
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35027475
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Егорище85Кстати, а что думают опытные люди, может ли решение подобных задач научить чему-нибудь полезному?Может. Научит внимательно работать с циклами.
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35027478
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:(Зачем нам дубовый алгоритм?
Затем:
NGGU
Сделал твой алгоритм на haskell (чтобы сравнить лаконичность кода и время работы одного и того же дубового алгоритма)
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35037326
pirovindos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-Sergey-
у меня на решение данного примера ушло около 15 минут - это гораздо меньше но не показательно, дело в том что одногруппник весьма далек от программирования

Условиеданы числа 1, 2, 3, 4, 5, 6, 7. Как их сложить, используя все семь, чтобы получилось 99.
Пример сложения: 1+2+3+54+67, 21+34+7+6+5, 1+2+3+4+5+6+7 1+27+3+46 и т.д.

меня боле заинтересовало на сколько сильно можно оптимизировать решение, на сколько туго закрутиь все гайки. чтобы получить максимальный результат.

и так предлагаю что-то вроде конкурса на самое оптимальное решение:
1. по скорости
2. по количеству строк кода
-


Если строго читать задание, то самое оптимальное решение по обоим критериям такое:
Код: plaintext
void main(){}
Поскольку, можно доказать, что получить 99 нельзя.
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35037746
Фотография TonY.Soprano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а 0x99 ?
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35043315
rm15
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Условиеданы числа 1, 2, 3, 4, 5, 6, 7. Как их сложить, используя все семь, чтобы получилось 99.
Пример сложения: 1+2+3+54+67, 21+34+7+6+5, 1+2+3+4+5+6+7 1+27+3+46 и т.д.

Никак, сумма цифр не делится на 9.
Если использовать можно не все цифры, то при поиске подходящих вариантов нужно использовать это условие, можно еще признак делимости на 11.
...
Рейтинг: 0 / 0
еще одна задача по прогаммированию
    #35043320
rm15
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-Sergey- ИзопропилОптимизированный по памяти - в каких попугаях измерять будем?
на сколько я помню критерием выступало количество переменных и их размерность -
чем больше количество используемых для вычисления переменных тем менее эфективен код по памяти.
sb=bait;
while(bait/=2) sb-=bait;
...
Рейтинг: 0 / 0
63 сообщений из 63, показаны все 3 страниц
Форумы / Программирование [игнор отключен] [закрыт для гостей] / еще одна задача по прогаммированию
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]