21 Востаннє редагувалося Chemist-i (02.05.2013 08:39:54)

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

Pascal

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

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

22 Востаннє редагувалося koala (02.05.2013 08: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 символів, і цілком можливо, що можна й менше, я не профі в мініфікації.

23

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

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

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

24

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

Chemist-i написав:

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

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

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

25

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 ) ] << " є простим";
}

Подякували: Очі.завидющі, Bartash, leofun01, Yola4

26

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 ) ] << " є простим";
}


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

I belong to the Dead Generation.
Подякували: leofun011

27

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

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

int a;
int b;
ukrainian.stackexchange.com - це питання-відповіді з української мови

28

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

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

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

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

29 Востаннє редагувалося bunyk (08.05.2013 17: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

30

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 і може працювати з нескінченністю, проте і ми можемо так вчинити, перевіряти чи сталось переповнення.

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

ukrainian.stackexchange.com - це питання-відповіді з української мови

31

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

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

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

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

Подякували: bunyk, signore_massimo2

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

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

koala написав:

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

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

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

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

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

ukrainian.stackexchange.com - це питання-відповіді з української мови
Подякували: koala1

33

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

Yola написав:

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

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

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

34 Востаннє редагувалося Yola (09.05.2013 17: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, 142 downloads since 2013-05-09 

ukrainian.stackexchange.com - це питання-відповіді з української мови

35

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

Yola написав:

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

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

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

36

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;
I belong to the Dead Generation.

37

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

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

ukrainian.stackexchange.com - це питання-відповіді з української мови

38

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

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

int main(){
    return 0;
}

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

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

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

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

Не відкривати!!!

#include <stdio.h>

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

int main()
{
   return 0;
}

Подякували: cuhedg, Replace2

40

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

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