1. Pascal / Говнокод #13978

    +106

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    for i:= 1 to 24 do read (a[i]);
    if (abs(sqrt ((a[1]-a[4])*(a[1]-a[4])+(a[2]-a[5])*(a[2]-a[5])+(a[3]-a[6])*(a[3]-a[6]))) = abs(sqrt ((a[4]-a[7])*(a[4]-a[7])+(a[5]-a[8])*(a[5]-a[8])+(a[6]-a[9])*(a[6]-a[9]))) and
    (abs(sqrt ((a[4]-a[7])*(a[4]-a[7])+(a[5]-a[8])*(a[5]-a[8])+(a[6]-a[9])*(a[6]-a[9]))) =abs(sqrt ((a[7]-a[10])*(a[7]-a[10])+(a[8]-a[11])*(a[8]-a[11])+(a[9]-a[12])*(a[9]-a[12]))) and
    (abs(sqrt ((a[7]-a[10])*(a[7]-a[10])+(a[8]-a[11])*(a[8]-a[11])+(a[9]-a[12])*(a[9]-a[12]))) =abs(sqrt ((a[10]-a[1])*(a[10]-a[1])+(a[11]-a[2])*(a[11]-a[2])+(a[12]-a[3])*(a[12]-a[3])))and
    (abs(sqrt ((a[13]-a[16])*(a[13]-a[16])+(a[14]-a[17])*(a[14]-a[17])+(a[15]-a[18])*(a[15]-a[18]))) = abs(sqrt ((a[13]-a[16])*(a[13]-a[16])+(a[14]-a[17])*(a[14]-a[17])+(a[15]-a[18])*(a[15]-a[18]))) and
    (abs(sqrt ((a[13]-a[16])*(a[13]-a[16])+(a[14]-a[17])*(a[14]-a[17])+(a[15]-a[18])*(a[15]-a[18]))) =abs(sqrt ((a[16]-a[19])*(a[16]-a[19])+(a[17]-a[20])*(a[17]-a[20])+(a[18]-a[21])*(a[18]-a[21]))) and
    (abs(sqrt ((a[16]-a[19])*(a[16]-a[19])+(a[17]-a[20])*(a[17]-a[20])+(a[18]-a[21])*(a[18]-a[21]))) =abs (sqrt ((a[19]-a[22])*(a[19]-a[22])+(a[20]-a[23])*(a[20]-a[23])+(a[21]-a[24])*(a[21]-a[24]))) and
    (abs(sqrt ((a[19]-a[22])*(a[19]-a[22])+(a[20]-a[23])*(a[20]-a[23])+(a[21]-a[24])*(a[21]-a[24]))) =abs(sqrt ((a[22]-a[13])*(a[22]-a[13])+(a[23]-a[14])*(a[23]-a[14])+(a[24]-a[15])*(a[24]-a[15]))) and
    (abs(sqrt ((a[22]-a[13])*(a[22]-a[13])+(a[23]-a[14])*(a[23]-a[14])+(a[24]-a[15])*(a[24]-a[15])))=abs(sqrt ((a[13]-a[1])*(a[13]-a[1])+(a[14]-a[2])*(a[14]-a[2])+(a[15]-a[3])*(a[15]-a[3]))) and
    (abs(sqrt ((a[13]-a[1])*(a[13]-a[1])+(a[14]-a[2])*(a[14]-a[2])+(a[15]-a[3])*(a[15]-a[3]))) = abs(sqrt ((a[16]-a[4])*(a[16]-a[4])+(a[17]-a[5])*(a[17]-a[5])+(a[18]-a[6])*(a[18]-a[6])))and
    (abs(sqrt ((a[16]-a[4])*(a[16]-a[4])+(a[17]-a[5])*(a[17]-a[5])+(a[18]-a[6])*(a[18]-a[6])))= abs(sqrt ((a[19]-a[1])*(a[19]-a[7])+(a[20]-a[8])*(a[20]-a[8])+(a[21]-a[9])*(a[21]-a[9]))) and
    (abs(sqrt ((a[19]-a[1])*(a[19]-a[7])+(a[20]-a[8])*(a[20]-a[8])+(a[21]-a[9])*(a[21]-a[9]))) = abs(sqrt ((a[22]-a[10])*(a[22]-a[10])+(a[23]-a[11])*(a[23]-a[11])+(a[24]-a[12])*(a[24]-a[12])))) then writeln ('yes');
    
    Readln;

    программа выясняет, является ли фигура с задаными 24 координатами кубом

    Запостил: Abbath, 20 Октября 2013

    Комментарии (49) RSS

    • Меня смущает, что здесь вообще есть квадратные корни. Наверняка ж можно без них.
      Про abs(sqrt(...)) я вообще молчу.
      Ответить
    • Вторая версия
      for i:= 1 to 24 do read (a[i]);
      b[12]:=abs(sqrt ((a[1]-a[4])*(a[1]-a[4])+(a[2]-a[5])*(a[2]-a[5])+(a[3]-a[6])*(a[3]-a[6])));
      b[1]:=abs(sqrt ((a[4]-a[7])*(a[4]-a[7])+(a[5]-a[8])*(a[5]-a[8])+(a[6]-a[9])*(a[6]-a[9])));
      b[2]:=abs(sqrt ((a[7]-a[10])*(a[7]-a[10])+(a[8]-a[11])*(a[8]-a[11])+(a[9]-a[12])*(a[9]-a[12])));
      b[3]:=abs(sqrt ((a[10]-a[1])*(a[10]-a[1])+(a[11]-a[2])*(a[11]-a[2])+(a[12]-a[3])*(a[12]-a[3])));
      b[4]:=abs(sqrt ((a[13]-a[16])*(a[13]-a[16])+(a[14]-a[17])*(a[14]-a[17])+(a[15]-a[18])*(a[15]-a[18])));
      b[5]:=abs(sqrt ((a[16]-a[19])*(a[16]-a[19])+(a[17]-a[20])*(a[17]-a[20])+(a[18]-a[21])*(a[18]-a[21])));
      b[6]:=abs(sqrt ((a[19]-a[22])*(a[19]-a[22])+(a[20]-a[23])*(a[20]-a[23])+(a[21]-a[24])*(a[21]-a[24])));
      b[7]:=abs(sqrt ((a[22]-a[13])*(a[22]-a[13])+(a[23]-a[14])*(a[23]-a[14])+(a[24]-a[15])*(a[24]-a[15])));
      b[8]:=abs(sqrt ((a[13]-a[1])*(a[13]-a[1])+(a[14]-a[2])*(a[14]-a[2])+(a[15]-a[3])*(a[15]-a[3])));
      b[9]:=abs(sqrt ((a[16]-a[4])*(a[16]-a[4])+(a[17]-a[5])*(a[17]-a[5])+(a[18]-a[6])*(a[18]-a[6])));
      b[10]:=abs(sqrt ((a[19]-a[1])*(a[19]-a[7])+(a[20]-a[8])*(a[20]-a[8])+(a[21]-a[9])*(a[21]-a[9])));
      b[11]:=abs(sqrt ((a[22]-a[10])*(a[22]-a[10])+(a[23]-a[11])*(a[23]-a[11])+(a[24]-a[12])*(a[24]-a[12])));
      if (b[1]=b[2]) and (b[3]=b[4]) and (b[4]=b[5])and (b[5]=b[6])and (b[6]=b[7])and (b[7]=b[8])and (b[8]=b[9])and (b[9]=b[10])and (b[10]=b[11])and (b[11]=b[12])
      then writeln ('Fuck Yeah');
      Ответить
    • Автору прописать клизму и изучение записей (record)... Мне вот лень в уме переводить a[22] в a[8].x, поэтому текст особо не читал, может быть код и нерабочий.

      P.S. Треду плюс, говно знатное ;)
      Ответить
      • P.P.S. А код походу нерабочий, и вернет true не только для полноценного куба, но и для непрямоугольного параллелепипеда, у которого все ребра равной длины ;)
        Ответить
    • по моему очень ограниченому опыту работы с геометрией, сразу в глаза бросается отсутствие сортировки координат. потому что если соседние координаты не являются соседними вершинами куба, то это очевидно работать не будет.

      чисто на вскидку, я бы попытался для начала найти соседние вершины. из них - грани и посчитать площадь граней.
      Ответить
    • Не знаю правильно ли, но суть такова: для каждой из точек три ближайшие к ней должны лежать на одинаковом расстоянии. Ну и еще угол между какими-то отрезками, выходящими из одной д.б. равен 90.
      int square_dist(Point p1, Point p2);
      Point points[8];
      bool is_cube(Point *points) {
          for(int i = 0; i < 8; i++) {
              int min_dist = INF, count = 0;
              for(int j = 0; j < 8; j++) {
                  if(i!=j && square_dist(points[i], points[j]) == min_dist) count++;
                  if(i!=j && square_dist(points[i], points[j]) < min_dist) {min_dist =square_dist(points[i], points[j]), count = 1; }
              }
              if(count != 3) return false;
          }
          //тут еще сделать проверку для каких либо 2-х отрезков выходящих из одной точки, чтобы они были перпендикулярны
          return true;
      }
      Ответить
    • показать все, что скрытоОбычная лаба, хуле.
      Ответить
    • Пусть есть точки A, B, C, D, E, F, G, H. После необходимой сортировки (ABCD и EFGH - предположительно квадраты, E лежит напротив A, F - напротив B) нужно проверить следующие условия (речь идёт о векторах):
      AB AD=0
      AB AE=0
      AD AE=0
      |AB|=|AD|=|AE| (естественно, компьютеру проще проверить AB AB = AD AD = AE AE)
      AB+AD=AC
      AB+AE=AF
      AD+AE=AH
      AB+AD+AE=AG
      При несоблюдении любого из этих условий куба уже не будет.
      Ответить
    • зачем сложности? находим длинны всех отрезков, сортируем, должно быть 12 длинны а 12 sqrt(2)*a и 4 sqrt(3)*a
      Ответить
      • Кому-то копипаста была по нраву.
        Ответить
      • о. а я не догадался до такого.
        Ответить
      • А теперь докажи, что из этого следует кубичность
        Ответить
        • Ну кагбе если все диагонали равны (4 sqrt(3)*a), то он симметричен относительно центра. По аналогии с квадратом - если все стороны равны, этого недостаточно - можем получить ромб. Но доп. условие когда обе диагонали равны, да еще и явно sqrt(2)*a достаточно и необходимо даёт нам квадрат.
          Так и это условие (12 диагоналей sqrt(2)*a) даёт нам что гранями куба являются квадраты.
          Ответить
        • Хм. Попробую

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

          Жесткая геометрическая фигура - фигура, вид которой однозначно определяется из длин отрезков, соединяющих попарно вершины

          Простейший пример - треугольник.

          теперь докажем, что - любая фигура (состоящая из вершин и ребер, естественно) - жесткая

          в данном случае разница будет только в количестве вершин

          посему доказываем матиндукцией

          база - для 3 вершин - верно

          предположение - для х верно -> верно ли для Х+1?

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

          Вывод - я аля прав)
          Ответить
          • если длины сгруппированы так, как ты подумал - то да
            но почему б из какой-то вершины не выходить 4м отрезкам длины 1, например? или только двум?
            Ответить
            • тогда другие стороны будут другой длинны . При конкретном наборе длинн - конкретная фигура
              Ответить
          • Тривиальный пример не-куба при таком раскладе:
            два квадрата в параллельных плоскостях, но проекции их диагоналей на одну плоскость не совпадают, или, более наглядно, два квадрата параллельны друг другу (в параллельных плоскостях) но "повернуты" под углом друг к другу.
            Ответить
            • Из-за этих перекосов sqrt(2)*a и sqrt(3)*a в нужных количествах не получатся. Так что ваши примеры некорректны.
              Ответить
              • Разве нельзя получить изометрию (rigid transformation) такую, чтобы стороны были "повернуты" друг относительно друга? Почему? Мне как-то кажестыся, что можно...
                Ответить
                • Ну я пока не могу придумать деформацию не нарушающую количества отрезков длины sqrt(2)*a и sqrt(3)*a...

                  Равно как и не могу доказать, что построение единственно ;(
                  Ответить
                  • Кстати тут интересен еще такой вопрос:
                    12 sqrt(2)*a и 4 sqrt(3)*a - не только ли достаточно ли этого условия, а минимально ли оно достаточное?
                    Можно ли проверить меньше отрезков?
                    Ответить
                    • > Можно ли проверить меньше отрезков?
                      Ну это уже задача со звездочкой. Для начала надо бы доказать достаточность всех 28 отрезков.
                      Ответить
                      • Сдается мне что как минимум джве диагонали из 4 sqrt(3)*a можно убрать.
                        12 sqrt(2)*a плюс ребра определяют что у нас есть 12 граней-квадратов.

                        А две диагонали определяют правильное расположение этих 12 граней между собой. В смысле концы этих двух отрезков захватывают каждую из 12 граней.

                        Вот Тарас говорит.
                        >>если длины сгруппированы так, как ты подумал - то да

                        Ну это легко проверить какая длина куда входит.
                        Ответить
                    • в общем случае - нельзя
                      Ответить
                • Выше написано почему нет
                  Ответить
              • >Из-за этих перекосов sqrt(2)*a и sqrt(3)*a в нужных количествах не получатся.
                А если сделать их не прямыми, а кривыми?!
                Ответить
    • показать все, что скрытоКакой багор )))
      Ответить
    • показать все, что скрыто-
      Ответить

    Добавить комментарий