Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Подскажите по неравенствам:) (http://www.flasher.ru/forum/showthread.php?t=124523)

oiBulldog 02.05.2009 02:45

Подскажите по неравенствам:)
 
Объясните пожалуйста, почему в одном случае выдаётся "true", в другом "false", причём это всё как то связано с "1", при замене допустим на "4" или "6" в обоих случая выдаётся "true". Подскажите как происходит обсчёт и как этого избежать, чтобы всё считалось верно?
Код AS1/AS2:

q = 9;
w = 8;
e = 7;
r = 1;
trace(q!=w!=e!=r);
trace(q!=w!=r!=e);


VVall 02.05.2009 03:05

Как избежать - не писать подобных конструкций. Есть скобки, есть && и ||. Не надо лишний раз запутывать компилятор и себя.

iNils 02.05.2009 03:41

Для оформления своего кода надо использовать теги [code][/code]

При неравенстве с единицей, последняя преобразуется в булево значение true, что не происходит с другими числами, они дают false. Есть строгое неравенство !== там такого не будет.
В вашем случаи q!=w это true, true != 7 тоже true, а true != 1, это true != true, что дает false.
Получается:
(true != true) != false, это false != false и результат true
(true != false) != true, это true != true и результат false

oiBulldog 02.05.2009 13:35

Ясно, немного разобрался в механизме. Спасибо. Но тогда возникает вот какой вопрос, а как тогда всё таки добиться того, что изначально планировал, как должно выглядеть уровнение, которое выдаёт "false" в том случае если хотя бы "2" из "n" чисел равны и "true" в том случае если все числа отличны друг от друга?:)

Psycho Tiger 02.05.2009 13:49

Ну, каждое нужно сравнить с каждым. Это 2 вложенных цикла.

oiBulldog 02.05.2009 14:25

Это ясно, то есть без цикла не обойтись?)

Psycho Tiger 02.05.2009 14:40

Ну в голову пока идея не лезет.
Когда на бумажке смотришь на цифры, ты ведь каждый сравниваешь с каждым, так?

iNils 02.05.2009 14:45

Можно, ручками.
Код AS1/AS2:

trace(q!=w && q!=e && q!=r && w!=e && w!=r && e!=r);

Но смотрите, для 3-х чисел нужно 3 сравнения, для 4-х 6, а для 5 - 10. А если чисел больше?
Но два цикла не надо, хватит одного.
Код AS1/AS2:

var array:Array = [9, 8, 7, 1];
var arrayComparison:Array = [];
var result:Boolean = true;
for (var i:Number = 0; i < array.length; i++) {
        if (arrayComparison[array[i]] == true) {
                result = false;
                break;
        } else {
                arrayComparison[array[i]] = true;
        }
}
trace (result);


etc 02.05.2009 14:58

Код AS1/AS2:

var array:Array = [9, 8, 7, 1, 5, 4];
var result:Boolean = true;
var index:Number;
 
for (var i:Number = 0; i < array.length; i++) {
        index = array.indexOf(array[i]);
 
        if (index >= 0 && index != i) {
                result = false;
                break;
        }
}
trace (result);

:p

Wolsh 02.05.2009 15:00

Гениально! Спасибо, никогда бы сам такое не придумал))) Меня только на такое хватило))
Код:

var array:Array = [1, 8, 4, 9];
var arrayCom:Array = array.sort();
var result:Boolean = true;
for (var i:Number = 0; i < arrayCom.length; i++) {
    if (arrayCom[i] == arrayCom[i+1]) {
        result = false;
        break;
    }
}
trace (result);


iNils 02.05.2009 15:02

Денис, а почему у тебя результат false, когда в массиве все числа разные?

etc 02.05.2009 15:03

Скорее всего при обратном пробеге работать будет быстрее :)
У iNils-а, по идее, работать должен ещё быстрее.

iNils, у тебя неправильный флеш :) Копипаст кода выдает true.

UPD: Опа, под AS3 работает, под AS2 нет :(

Добавлено через 10 минут
Нате вот:

Код AS1/AS2:

var array:Array = [9, 8, 7, 1, 5, 4, 6];
var str:String = '|' + array.join('|') + '|';
var result:Boolean = true;
 
for (var i:String in array) {
        i = '|' + i + '|';
 
        if (str.indexOf(i) != str.lastIndexOf(i)) {
                result = false;
                break;
        }
}
trace(result);

:D

Wolsh 02.05.2009 15:21

Ну да, в АС2 не было Аrray.indexOf ))))

Psycho Tiger 02.05.2009 15:30

Wolsh, у тебя сравнивает это со следующим, так что не катит.)

__etc, разве indexOf по сути сам не работает как цикл? ИМХО с вложенным циклом будет бегать быстрее, чем с indexOf (если indexOf реализован тоже на АС, черт его знает скорость прогонки, если не на нем написан), надо проверить, как будет минутка.

2iNils: *___* ты гений)

etc 02.05.2009 15:34

Psycho Tiger, у Wolsh-а сортировка в начале :)

Mnilionic 02.05.2009 22:01

вот и моя очередь подошла предложить оптимальный вариант:
Код AS1/AS2:

var arr = [1, 2, 3, 3, 5];
var result:Boolean = !!arr.sort(12);
trace(result);

:)

iNils 02.05.2009 22:22

Отлично.

Psycho Tiger 03.05.2009 13:34

2__etc: ой, проглядел :)

Гм, вообще странно... АС без угрызений совести записывает в Boolean массив, (без !!), даже не сругиваясь на тип мисмач... Вообще, обьясните мне как этот код работает?

Wolsh 03.05.2009 13:57

Хелп:
Цитата:

If you specify a value of 4 or Array.UNIQUESORT for the options parameter and two or more elements being sorted have identical sort fields, Flash returns a value of 0 and does not modify the array.
Соотв. если вернет 0 - приводится к false, !false дает true и !true опять false)) А если вернет массив - то цепочка преобразований начнется с true и им, соответственно, закончится.
Единственно, я не знаю что такое 12, но с 4 нормально вроде работает.

iNils 03.05.2009 13:58

На самом деле, там не нужно 12, хватит и 4.
4 - соответствует константе Array.UNIQUESORT - "Задает уникальное требование сортировки для методов сортировки класса Array. Эта уникальная возможность прекращает сортировку, если любые два сортируемых элемента имеют одинаковые значения." Таким образом, как если будут найдены два одинаковых числа, sort вернет число 0, а в других случаях массив. Двойное отрицание сначала переводит результат в булев тип (0 в true, массив в fasle), а потом инвертирует булев тип в необходимое нам по условию значение.

Psycho Tiger 03.05.2009 19:24

Дак я так и не понял - я четко указал тип Boolean - на какой радости туда флеш посмел записать массив?

etc 03.05.2009 20:05

Потому что это AS1/AS2 :)
Типизация отсутствует в runtime.

dimarik 04.05.2009 12:16

Итак, резюме

Цитата:

Но тогда возникает вот какой вопрос, а как тогда всё таки добиться того, что изначально планировал, как должно выглядеть уровнение, которое выдаёт "false" в том случае если хотя бы "2" из "n" чисел равны и "true" в том случае если все числа отличны друг от друга?
Код AS1/AS2:

trace( Boolean([1, 3, 3, 2, 5].sort(Array.UNIQUESORT)) );


Mnilionic 04.05.2009 21:40

12 это 4 + 8.
Потому, что если в массиве все зачения уникальны, то массив отсортируется.
Поэтому, чтоб изначальный массив оставался неизменным и плюсуется 8.

Хотя если плевать на очерёдность элементов, то пусть сортируются :)

dimarik 04.05.2009 23:37

Так лучше?

Код AS1/AS2:

var arr:Array = new Array (1, 3, 3, 2, 4);
// TODO: Debug alternate array value
//var arr:Array = new Array (1, 3, 2, 4);
trace( Boolean(arr.sort(Array.UNIQUESORT | Array.RETURNINDEXEDARRAY)) );



Часовой пояс GMT +4, время: 21:05.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.