21 Востаннє редагувалося koala (02.05.2013 07:57:53)

Re: Цікаві задачі

Chemist-i написав:

Pascal

  a := ... //число яке перевіряємо
  b := (a shr 1)
  c := (a mod 3)

  d := not (boolean)( b and c )
  result d;

А чому зупинилися на 3? Якщо int знаковий 2-байтний, то треба до 32749 йти...
Ну і не кажу про те, що:
- це не Паскаль (хоча й щось паскалевидне);
- ця гілка не про Паскаль.

Втім, цілком зарахую відповідь на Паскалі, якщо вкладеться, скажімо, в 2000 символів. У мене програма на C з людськими назвами і відступами в 300 символів вклалася. Заради цікавості стиснув - вийшло 156 символів, і цілком можливо, що можна й менше, я не профі в мініфікації.

22

Re: Цікаві задачі

А рекурсію можна використовувати?

Подякували: 221VOLT1

23

Re: Цікаві задачі

Chemist-i написав:

А рекурсію можна використовувати?

Треба!
От тільки питання - як її зупинити...

Подякували: 221VOLT1

24

Re: Цікаві задачі

Ну що ж, якщо ніхто не відповідає - моє рішення...

Прихований текст
#include <iostream>
#include <locale>

int (*select[2])(int,int);//це і буде наш замінник if

bool isPrime(int number, int divisor)
{
  //вибір, яку функцію викликати: рекурсію чи перевірку, чи дійшли вже кінця
  return (select[ ! ( number % divisor ) ]) 
  (
    number, divisor-1
  );
}

bool check(int number, int divisor)
{
  return divisor == 0;//якщо передали 0 (тобто в isPrime перше, на що число поділилося - 1), то повертаємо true
}

using namespace std;

int main()
{
  int number;
  setlocale(LC_ALL,"Ukrainian");

  //Ініціалізуємо масив переходів
  select[0] = isPrime;
  select[1] = check;
  
  cout << "Введіть число: ";
  cin >> number;
  char answers[2][4] = { " не", "" };
  cout << "число " << number << answers[ isPrime ( number, number / 2 ) ] << " є простим";
}
Подякували: Очі.завидющі, leofun01, Yola, ch0r_t5

25

Re: Цікаві задачі

koala написав:

Ну що ж, якщо ніхто не відповідає - моє рішення...

Прихований текст
#include <iostream>
#include <locale>

int (*select[2])(int,int);//це і буде наш замінник if

bool isPrime(int number, int divisor)
{
  //вибір, яку функцію викликати: рекурсію чи перевірку, чи дійшли вже кінця
  return (select[ ! ( number % divisor ) ]) 
  (
    number, divisor-1
  );
}

bool check(int number, int divisor)
{
  return divisor == 0;//якщо передали 0 (тобто в isPrime перше, на що число поділилося - 1), то повертаємо true
}

using namespace std;

int main()
{
  int number;
  setlocale(LC_ALL,"Ukrainian");

  //Ініціалізуємо масив переходів
  select[0] = isPrime;
  select[1] = check;
  
  cout << "Введіть число: ";
  cin >> number;
  char answers[2][4] = { " не", "" };
  cout << "число " << number << answers[ isPrime ( number, number / 2 ) ] << " є простим";
}

Я, мабуть, піду втоплюся нап'юся вчитися...

26

Re: Цікаві задачі

Не надто складна. але розминка для розуму - поміняти місцями два, наприклад цілих, без використання додаткової пам"яті.

int a;
int b;

27

Re: Цікаві задачі

Пане Yola, ви старттопік читали? Зокрема, задачу 2? :)

Щоб не залишати гілку без задач: знайти гіпотенузу за двома катетами так, щоб не сталося переповнення (floating point overflow) змінної при надто довгих катетах.

Подякували: Replace, bunyk2

28 Востаннє редагувалося bunyk (08.05.2013 16:04:56)

Re: Цікаві задачі

koala написав:

знайти гіпотенузу за двома катетами так, щоб не сталося переповнення (floating point overflow) змінної при надто довгих катетах.

Прихований текст

Переповнення однозначно від піднесення до квадрата (c = sqrt(sqr(a) + sqr(b)), тому можна спробувати обійтись тригонометрією:

http://upload.wikimedia.org/wikipedia/commons/5/5a/Trig_Functions.PNG

theta = atan2(b, a)
c = b / sin(theta)
Подякували: koala, Yola, leofun013

29

Re: Цікаві задачі

bunyk написав:
intel написав:

Computes the arctangent of the source operand in register ST(1) divided by the source operand
in register ST(0), stores the result in ST(1), and pops the FPU register stack. The result in register
ST(0) has the same sign as the source operand ST(1) and a magnitude less than +π.

хоча atan2 і може працювати з нескінченністю, проте і ми можемо так вчинити, перевіряти чи сталось переповнення.

У будь-якому випадку результат буде приблизний.

30

Re: Цікаві задачі

Непогано, але є рішення без тригонометрії:

Прихований текст
d = b / a;
c = a * sqrt( 1 + d * d ) ;
Подякували: bunyk, signore_massimo, leofun013

31 Востаннє редагувалося Yola (08.05.2013 18:03:43)

Re: Цікаві задачі

koala написав:

Непогано, але є рішення без тригонометрії:

Прихований текст
d = b / a;
c = a * sqrt( 1 + d * d ) ;

b - дуже велике
a - дуже маленьке

ділення - це те саме, що множення

Подякували: koala1

32

Re: Цікаві задачі

Yola написав:

b - дуже велике
a - дуже маленьке

Катети напрошуються на if. :)

Подякували: koala1

33 Востаннє редагувалося Yola (09.05.2013 16:49:37)

Re: Цікаві задачі

маємо аркуш паперу, сфоткали його, але фотік був трошки відхилений. Отже аркуш трохи скошений, як вирахувати трансформацію, яку треба застосувати, щоб зробити наче його сфоткали прямовисно по центру?

Я відповіді не знаю, вигадуватиму по ходу:)

ДОПОВНЕННЯ:
вихідна світлина з аркушем
(0,0), (w,0)
(0,h), (w,h)
сирцева
(a1,b1),(a2,b2)
(a3,b3),(a4,b4)

b4,b3>b2,b1
a2,a4>a1,a3

Увага, трансформація 3-вимірна, просто повернути зображення недостатньо, гадаю треба буде після повороту масштабувати з осями від кутка до кутка. Овва, поки так собі розмірковував і рішення проглянуло :-) Дійсно і масштабування потребуватиметься одненьке. А, ні, потім ще загальний скейл до заданого масштабу.

Вибачаюсь нєа, масштабуванням скошеність не подолаєш((

Post's attachments

GJ575.jpg 5.31 kb, 380 downloads since 2013-05-09 

34

Re: Цікаві задачі

Yola написав:

маємо аркуш паперу, сфоткали його, але фотік був трошки відхилений. Отже аркуш трохи скошений, як вирахувати трансформацію, яку треба застосувати, щоб зробити наче його сфоткали прямовисно по центру?

Я відповіді не знаю, вигадуватиму по ходу:)

Ідея, код поки не маю часу накидати

Потрібні координати вершин прямокутника. Одну з точок (верхній правий кут, наприклад) беремо за вісь обертання, а також знаходимо довжину та ширину фігури (аналітична геометрія ж). Будуємо набір вершин прямокутника, який би стояв прямо, а далі обчислюємо відхилення реальних точок від очікуваних. З цього отримуємо кут повороту у градусах/радіанах і салютуємо.

35

Re: Цікаві задачі

bunyk написав:
Yola написав:

b - дуже велике
a - дуже маленьке

Катети напрошуються на if. :)

При дуже великому b та дуже маленькому a матимемо дуже маленьке d.
От тільки не знаю: якщо щодо недоповнення (брак додаткових розрядів у double)? :)

d = (b>a)? (a/b):(b/a);
c = sqrt(1+d*d) * (b>a)? b:a;

36

Re: Цікаві задачі

Загалом, відповідь така, розвертаємо зображення так щоб дві лінії були горизонтальні або вертикальні і застосовуємо скошення.

37

Re: Цікаві задачі

Написати програму, яка виводить повідомлення "Hello, world!" за умови, що функція main має наступний вигляд:

int main(){
    return 0;
}

Задачу можна розв`язати декількома способами.

Подякували: Replace, prostoPhil2

38 Востаннє редагувалося prostoPhil (27.05.2013 17:25:18)

Re: Цікаві задачі

Не відкривати!!!
#include <stdio.h>

int a = puts("Hello World!");

int main()
{
   return 0;
}
Подякували: cuhedg, Replace2

39

Re: Цікаві задачі

prostoPhil, краще використовуйте spoiler :)

40

Re: Цікаві задачі

А я вже подумав про опцію для лінкера, яка встановлює місцем запуску іншу процедуру.