Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: quant13 on January 30, 2016, 07:38:41 AM
-
У меня есть схожая задача. Нужно построить ряды чисел от 1 до Х, количеством Х, но числа в ряду повторяться не должны и ряды повторяться тоже не должны. например ряд 1 до 3 в лог должно выдать примерно:
123
132
213
231
312
321
-
Я тоже думаю, что вопрос чисто теоретический, так что подтягивание теории конечно-же в тему. :)
Смущает постановка задачи от 1 до х,
сразу вспоминается анекдот
Вам сколько вешать?
- Ну, грамм 20-30.
- Говорите точно, сколько вешать в граммах!
- А к чему такая точность?!
- Да потому что это кокаин, дура!!!
Понятно, что такой постановкой задачи, автор хочет получить универсальный микроскоп, для раскалывания всех орехов от грецких до арахиса, вот только он одни орехи решил проигнорировать (кедровые- цифра 0 ), а другие ему попробовать в этой жизни несветит(кокосовые - цифры A, B и т.д.). Вот если выбирать числа, от у до х, тогда всё выглядит логично, если от 1 до 7, выглядит практично, поэтому выбираем золотую середину. :P
Если нужно, код можно обрезать или дописать под нужное колличество используемых цифр .
#name "от 1 до 5 Построить ряды из цифер"
STRSEPARATE("1,2,3,4,5", ",", $arr1)
$siz = ARRSIZE($arr1)
FOR($a1=0,$a1<$siz)
FOR($a2=0,$a2<$siz))
FOR($a3=0,$a3<$siz)
FOR($a4=0,$a4<$siz)
FOR($a5=0,$a5<$siz)
// условие неповторяемости цифр в числе
IF(($a1!$a2)&($a1!$a3)&($a1!$a4)&($a1!$a5)&($a2!$a3)&($a2!$a4)&($a2!$a5)&($a3!$a4)&($a3!$a5)&($a4!$a5))
ARRPUSH($arr2, STRCONCAT($arr1[$a1],$arr1[$a2],$arr1[$a3],$arr1[$a4],$arr1[$a5]))
END_IF
END_CYC
END_CYC
END_CYC
END_CYC
END_CYC
TFWRITEARR("ряды чисел.txt", $arr2)
TFWRITE("ряды чисел.txt", "//ряды чисел от 1 до 5",1)// шапка в текстовый файл
HALT// сливай воду, генератор сдох ;-)
-
до Х, потому что я надеялся да универсальное элегантное решение, и был прав, т.к я смотрю на решение 1-5 и глаза от количества условий и циклов разбегаются, что же будет если надо будет например до 9? ужс.
-
Добавляется 4 цикла, 26 условий, всего 6 новых строк кода,это займёт минуту, если не ковырять в носу двумя руками.
Ничего придумывать не нужно просто копируются существующие участки и вставляются в код всего 5 раз . Человек не страдающий олигофренией за 2 минуты исправит в скопированных участках цифры на нужные, дописать строку используемых цифр, дописать разрядность в итоговой строке, с этим заданием за 2 минуты справится даже цыган, на призывной коммиссии, если пообещать что служить будет конюхом. :P
Ну и в чём тут УЖС, в том что в коде вы ни бум бум? А ведь вам специально написал максимально просто, на основе доступных вам ранее примеров, в код Анрея довавлено всего одно, так понравившеесе вам, комплексное условие и ведь тоже специально решил короче написать, чтоб особо одарённым было понятнее. Я то могу всё это подпрограммами описать, но в ответ от тебя гарантированно увижу традиционный вопль сына пустыни при встрече с ШАЙТАНАРБОЙ! :o
Незабываем систематически обрабатывать мышку и монитор моюще-дизинфицирующими средствами, как выяснилось всёж таки есть среди нас тонкие ценители элегантности. А чёж, ты раньше боялся поделиться своими надеждами? 8)
-
Как ты элегантно сумел оскорбить среди "многабукафф". Блеск. Еще бы программные решения были такими же.
А сделать ряд 1-999? Добавляется еще 100500 циклов и 99999999 условий, всего бесконечность новых строк, это займет минуту.. и человек не страдающий шизофренией быстренько отправляется в психушку.
-
Вот сделал более универсальный вариант, но обработка занимает куда больше времени.
$start = 1 // начальное число
$end = 5 // конечное число
FOR($a=$start,$a<$end+1) // подготавливаем массив чисел
ARRPUSH($arr1, $a)
END_CYC
TFWRITEARR("temp_arr.txt", $arr1)
UNDEFINE($arr1)
$num = $start
FOR($a=$start,$a<$end+1) // тут вычисляем количество вариантов
$num = $num*$a
END_CYC
WHILE(ARRSIZE($arr2)<$num) // основной цикл
TFREADARR("temp_arr.txt", $arr)
$i = ARRSIZE($arr)-1
WHILE($i>0) // рандомизация массива чисел
$j = RND(0,$i)
IF($i ! $j)
$tmp = $arr[$j]
$arr[$j] = $arr[$i]
$arr[$i] = $tmp
END_IF
INC($i,-1)
END_CYC
$str = ""
$siz = ARRSIZE($arr)
FOR($a=0,$a<$siz) // собираем строку из чисел
IF(STRLEN($str) = 0)
$str = $arr[$a]
ELSE
$str = STRCONCAT($str, $arr[$a])
END_IF
END_CYC
UNDEFINE($arr)
$check = 0
$siz = ARRSIZE($arr2)
FOR($a=0,($a<$siz)&($check = 0)) // проверяем есть ли такая строка в конечном массиве
IF($arr2[$a] = $str)
$check = 1
END_IF
END_CYC
IF($check = 0) // если нет записываем
ARRPUSH($arr2, $str)
END_IF
END_CYC
TFCLEAR("temp_arr.txt", 1)
// здесь сортируем конечный массив по порядку (можно и без этого, будет быстрее)
$siz = ARRSIZE($arr2)
$srtcheck = 0
$srt = 0
FOR($a=$siz-1,($a>0)&($srt=0),-1)
FOR($b=0,$b<$a)
IF($arr2[$b] > $arr2[$b+1])
$srtcheck = 1
$tmp = $arr2[$b]
$arr2[$b] = $arr2[$b+1]
$arr2[$b+1] = $tmp
END_IF
END_CYC
IF($srtcheck = 0)
$srt = 1
END_IF
END_CYC
TFWRITEARR("Ряды чисел.txt", $arr2) // выводим конечный массив в файл
HALT
-
Это оно. Спасибо.
-
Это оно. Спасибо.
Там долеко не все гладко. Правильно будет работать только от 0-9.