2

Вывести 3 числа в порядке убывания без использования функций, и так далее. Без max(), min(), if и прочего.

Объясняю), я сегодня делал КР по питону и я сделал через sorted, а препод сказал что можно еще проще и без if и я не могу понять, что он имел ввиду.

jfs
  • 52,361
Andrew
  • 67
  • Еще раз, вывести 3 числа в порядке убывания без использования IF? – pinguin Nov 01 '17 at 21:41
  • да, возможно это связанно как-то с bool.. – Andrew Nov 01 '17 at 21:46
  • С bool связан if, и, похоже, вы просите невозможного – andreymal Nov 01 '17 at 21:47
  • Объясняю), я сегодня делал КР по питону и я сделал через sorted, а препод сказал что можно еще проще и без if и я не могу понять, что он имел ввиду. – Andrew Nov 01 '17 at 21:49
  • @andreymal Можно конечно сделать массив на N место записать число N, потом пройтись циклом и выводить элемент если он равен какому-нибудь из введенных. Формально тут не используется IF но мне кажется это бред какой-то. – pinguin Nov 01 '17 at 21:52
  • @Andrew может, он имел в виду именно min и max? – andreymal Nov 01 '17 at 21:56
  • Можно через прогрессию, но условие у вас не понятное, от куда например эти числа брать которые нужно вывести в порядке убывания? Что это за числа ? как их создать? рандомно ? или они уже заданы ? вы условие сначала нормально оформите. И вообще этот форум не для того что вам задачки решать на заказ. – Игорь Игоряныч Nov 01 '17 at 21:58
  • @ИгорьИгоряныч какя прогрессия для 1 17 -8? – Владимир Мартьянов Nov 01 '17 at 22:04
  • 3 целых числа > 0. – Andrew Nov 01 '17 at 22:04
  • @Владимир Мартьянов это что за три числа? я например могу написать такие которые в формулу прогрессии легко впишутся, автор ничего про числа не сказал, какими они должны быть. – Игорь Игоряныч Nov 01 '17 at 22:06
  • @ИгорьИгоряныч а какая разница? Вы ж не уточняли для каких чисел можно "через прогрессию", вот и хотелось бы понять что тут за прогрессия... – Владимир Мартьянов Nov 01 '17 at 22:07
  • @Владимир Мартьянов мне зачем это уточнять? это автор в вопросе уточнять должен. – Игорь Игоряныч Nov 01 '17 at 22:11
  • @ИгорьИгоряныч вы про прогрессию говорили? Вот и интересно узнать про прогрессию для трех произвольных чисел. – Владимир Мартьянов Nov 01 '17 at 22:12
  • @Владимир Мартьянов любой последовательности чисел для которой можно применить закон арифметической или геометрической прогрессии, автор то не слова не сказал что там за числа должны быть – Игорь Игоряныч Nov 01 '17 at 22:13
  • @Владимир Мартьянов для произвольных согласен, не какой, но опять же автор не чего про числа не сказал, я же про это ему и написал, что бы уточнил про какие числа он говорит. – Игорь Игоряныч Nov 01 '17 at 22:19
  • А хоть сравнивать-то можно? :) – Harry Nov 02 '17 at 08:28

6 Answers6

11

Без ветвления (без if), выполняя одни и те же сравнения вне зависимости от ввода, можно отсортировать три числа a,b,c по убыванию, используя сети сортировки:

sorting network

Значения заходят слева по проводам, выходят справа. Бо́льшие значения тонут, меньшие всплывают (по вертикальным линиям — компараторам: маx вниз, min наверх). Без min, max функций можно использовать индексацию:

[[[(a, b, c), (a, c, b)], [None, (c, a, b)]],
 [[(b, a, c), None], [(b, c, a), (c, b, a)]]][a < b][a < c][b < c]

Пример.

True == 1 and False == 0 в Питоне, поэтому выражение [on_false, on_true][condition] возвращает on_false, если condition ложно и on_true— если истинно.

Код возвращает одну из шести возможных перестановок: abc acb cab bac bca cba так чтобы значения всегда шли по убыванию: sorted([a,b,c], reverse=True). None никогда не выбирается, так как соответствует невозможным ситуациям (при корректном операторе сравнения): c > a >= b >= c и c <= a < b < c. Тест.

Связанные вопросы:

jfs
  • 52,361
6

Алгоритмически:

sub main {
input a,b,c
regularize(a,b)
regularize(b,c)
regularize(a,b)
print a,b,c
}

sub regularize(x,y) {
tmp=(x+y+ABS(x-y))/2
y=tmp-ABS(x-y)
x=tmp
}

PS. Желающим поправить ответ до рабочего кода - создайте свой ответ, пожалуйста.

Akina
  • 31,807
4

challenge accepted

Чисто формально:

a, b, c = list(map(int, input("Enter 3 numbers").split())) 
l = ["" for i in range(a+b+c)] #создаем массив размер которого точно превышает максимальное из введенных чисел
l[a] = a
l[b] = b
l[c] = c
print(" ".join(str(i) for i in l[::-1]))
pinguin
  • 1,873
2

Действительно можно проще: вы использовали функцию sorted, а что она делает? Помимо того, что возвращает отсортированные значения, но возвращает их в новом объекте, т.е. создает новый объект - а это затратно и по времени и по ресурсам:

from timeit import timeit

a = [1,0,9,] def sorted_rev(x): sorted(x, reverse=True) # создаст новый объект

timeit('sorted_rev(a)', globals={'sorted_rev': sorted_rev, 'a': a}) Out: 1.8182791949984676

Можно задействовать метод списка sort, который не будет создавать новый объект, а отсортирует текущий - что выгодно и по времени и по ресурсам:

from timeit import timeit

a = [1,0,9,] def sort_rev(x):
x.sort(reverse=True) # отсортирует текущий объект

timeit('sort_rev(a)', globals={'sort_rev': sort_rev, 'a': a}) Out: 0.9372297810004966

Вывод: это проще, дешевле и быстрее.

Arkadios
  • 21
  • 3
2

ну вот еще одно решение, которое "еще проще". Есть в модуле для куч такие функции: выдать несколько наибольших и несколька наименьших. Даже пересортировывать список в кучу не обязательно )

import heapq
nums = [1, 8, -4]
print(heapq.nlargest(3, nums))   # Prints [8, 1, -4]
print(heapq.nsmallest(3, nums))  # Prints [-4, 1, 8]

Однако интересно, что препод-то имел ввиду?

0

С разрешения @Akina перепишу его код на Python

def regularize(x,y):
    tmp=(x+y+abs(x-y))/2
    y=tmp-abs(x-y)
    x=tmp
    return x, y

a, b, c = list(map(int, input("Enter 3 numbers ").split())) 
a, b = regularize(a,b)
b, c = regularize(b,c)
a, b = regularize(a,b)
print(*list(map(int, [a, b, c])))

Пример

pinguin
  • 1,873
  • 1- list не нужно вызывать здесь. 2- используйте // (целое деление) вместо / 3- последнюю строчку можно упростить print(a, b, c) – jfs Nov 06 '17 at 21:08