Отговори на тема  [ 23 мнения ]  Отиди на страница 1, 2  Следваща
задачка ;) 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 9:14 am
Мнения: 5298
Мнение задачка ;)
Да се извърти цикъл с 256 итерации чрез for() и една еднобайтова променлива. Break в тялото на цикъла и допълнителни променливи не са позволени.

Няма награда - само за умствена гимнастика
:D

За най-напредналите: цикъл с 511 итерации чрез само една еднобайтова променлива

_________________
'просто' е технически синоним на 'красиво'


Сря Юни 20, 2012 2:05 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Май 01, 2009 4:01 pm
Мнения: 1438
Мнение Re: задачка ;)
Два цикъла позволени ли са ??


Сря Юни 20, 2012 3:02 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 04, 2005 9:59 pm
Мнения: 6019
Местоположение: София
Мнение Re: задачка ;)
Код:
var i:byte;
begin
  for i := 0 to 255 do
    WriteLn(i);
  readln;
end.

No sweat.
Pascal FTW.
Edit: намерих он-лайн компилатор, ако искате може да тествате кода: http://www.onlinecompiler.net/pascal


Н'бабане Гт'муан'га написа:
За най-напредналите: цикъл с 511 итерации чрез само една еднобайтова променлива

Това мога да го направя и без променлива, само ми трябва микроконтролера да има 8 битов UP/DOWN mode таймер. :)

_________________
Warriors of the Night, ASSEMBLER!!!


Сря Юни 20, 2012 3:35 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Ное 12, 2011 9:21 pm
Мнения: 62
Мнение Re: задачка ;)
ако може да се правят по две итерации в тялото на цикъла, за да са точно 511, може нещо такова:

Код:

#include <stdio.h>
#include <stdint.h>

void main(void)
{
uint8_t i = 0;

   for (; printf("итерация %i\n", (i << 1)), i ++, printf(i ? "итерация %i\n" : "край\n", (i << 1) - 1), i; );

}




(тук за 'итерация' се приема работата, която се върши ако се замести печатането на низ 'итерация х' с някаква реална работа; така сметката би трябвало да излиза, и броят на изпълненията да е 511)


Сря Юни 20, 2012 7:02 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пон Апр 16, 2012 9:05 pm
Мнения: 182
Мнение Re: задачка ;)
Два цикъла с една променлива(byte), ако е позволено?? :)
Идеята му е веднъж бори нагоре, после обратно до 0 и излиза...


Прикачени файлове:
code.txt [169 Байта]
280 пъти
Сря Юни 20, 2012 10:33 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Нед Ное 16, 2008 1:16 pm
Мнения: 179
Местоположение: София
Мнение Re: задачка ;)
Ако това е истинското решение на задачата с 511, както го е написал Пушека, да ме прощавате, ама задачата е мега некоректно зададена.

Искате ли една малко по-трудна?

Имате масив с цели числа (могат да са и големи, 32-битови примерно). В него масив, всички числа се срещат точно два пъти, с изключение на едно от тях, което го има само веднъж. Примерно { 3, 188, 55, 55, 3 }.
Търси се кое е самотното. Не се разрешава сортиране. O(N) сложност се гони.

_________________
2 + 2 = 5, при много големи стойности на 2.


Сря Юни 20, 2012 11:35 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 04, 2005 9:59 pm
Мнения: 6019
Местоположение: София
Мнение Re: задачка ;)
Задачата е елементарна. Правиш един масив от 4 300 000 000 бита. Четеш число от масива и гледаш бита, който съответства на числото ако е 0 прибавяш числото към временна променлива, ако е 1 бита, правиш го на 0 и изваждаш числото от временната променлива. накрая временната променлива е със стойност самотното число.

_________________
Warriors of the Night, ASSEMBLER!!!


Чет Юни 21, 2012 12:00 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Нед Ное 16, 2008 1:16 pm
Мнения: 179
Местоположение: София
Мнение Re: задачка ;)
А, не съм догледал, числата били 64-битови :D

_________________
2 + 2 = 5, при много големи стойности на 2.


Чет Юни 21, 2012 1:30 am
Профил ICQ WWW
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Нед Апр 17, 2005 9:23 am
Мнения: 112
Мнение Re: задачка ;)
anrieff написа:
Търси се кое е самотното. Не се разрешава сортиране. O(N) сложност се гони.

Хм, не мога да си представя какъв трик може да се приложи, че да постигнеш O(N). В най-добрия случай виждам O(N^2/2).


Чет Юни 21, 2012 8:33 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Нед Ное 16, 2008 1:16 pm
Мнения: 179
Местоположение: София
Мнение Re: задачка ;)
Дори само със сортиране вече е O(N logN), но, както казах, има и по-добро решение :)

_________________
2 + 2 = 5, при много големи стойности на 2.


Чет Юни 21, 2012 10:44 am
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 9:14 am
Мнения: 5298
Мнение Re: задачка ;)
anrieff написа:
Ако това е истинското решение на задачата с 511, както го е написал Пушека, да ме прощавате, ама задачата е мега некоректно зададена.

Искате ли една малко по-трудна?

Имате масив с цели числа (могат да са и големи, 32-битови примерно). В него масив, всички числа се срещат точно два пъти, с изключение на едно от тях, което го има само веднъж. Примерно { 3, 188, 55, 55, 3 }.
Търси се кое е самотното. Не се разрешава сортиране. O(N) сложност се гони.


Абе аз си мислех, че като съм писал for() всеки ще разбере, че става дума за C-код. На Паскал и Бейсик и бабите могат да го направят това. Освен това съм писал "итерации" т.е. не е казахо, че променливата трябва да се извърти последователно. Е, след тая подсказка... :wink:

А това с масива... не съм го пробвал, само като идея - ако извъртиш целия масив и правиш XOR на всички числа в него, би трябвало накрая да остане това, което е самотно, тъй като другите ще са се нулирали побитово.
Ето в примера, който си дал, резултатите след всеки XOR: 0 (начално), 3, 191, 136, 191, 188 (краен резултат)

_________________
'просто' е технически синоним на 'красиво'


Чет Юни 21, 2012 10:52 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Нед Апр 17, 2005 9:23 am
Мнения: 112
Мнение Re: задачка ;)
Н'бабане Гт'муан'га написа:
… ако извъртиш целия масив и правиш XOR на всички числа в него, би трябвало накрая да остане това, което е самотно, тъй като другите ще са се нулирали побитово.

Мда-а-а… :oops:


Чет Юни 21, 2012 11:21 am
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Вто Окт 25, 2005 10:54 am
Мнения: 896
Мнение Re: задачка ;)
uint8_t ii;

for (ii = 0; ii; ii++)
do_something();

???


Чет Юни 21, 2012 4:23 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 04, 2005 9:59 pm
Мнения: 6019
Местоположение: София
Мнение Re: задачка ;)
t_i_t_o написа:
uint8_t ii;

for (ii = 0; ii; ii++)
do_something();

???

Това тества ли го? Ако да кажи с кой компилатор.

_________________
Warriors of the Night, ASSEMBLER!!!


Чет Юни 21, 2012 4:34 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Вто Окт 25, 2005 10:54 am
Мнения: 896
Мнение Re: задачка ;)
Мда няма да стане щото условието се проверява в началото а не в края... с do-while ще стане...


Чет Юни 21, 2012 4:52 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 23 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: Google [Bot] и 31 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни