Найти - Пользователи
Полная версия: По номеру квартиры вычислить номер подъезда и номер этажа
Начало » Центр помощи » По номеру квартиры вычислить номер подъезда и номер этажа
1
Adriana
Здравствуйте.
Есть программа, выдаёт ошибку на 7 тесте, подскажите, пожалуйста, как исправить
Мой код:
 K1, M, K2, P2, N2 = map(int, input().split())
if M != 1:
    for i in range(1,1000):
        if  i!=0 and N2==((K2-1)//i)+1:
            P1 = (((K1-1)//i)//(M-1))+1
            N1=(((K1-1)//i)%(M-1)) 
if M == 1:
   for i in range(1,1000):
        P1 = (K1//i)%1
        N1 = M
if K2 < P2*M or N2 > M:
    P1 = -1
    N1 = -1
print(P1, N1)
Условие задачи:
Бригада скорой помощи выехала по вызову в один из отделенных районов. К сожалению, когда диспетчер получил вызов, он успел записать только адрес дома и номер квартиры K1, а затем связь прервалась. Однако он вспомнил, что по этому же адресу дома некоторое время назад скорая помощь выезжала в квартиру K2, которая расположена в подъезда P2 на этаже N2. Известно, что в доме M этажей и количество квартир на каждой лестничной площадке одинаково. Напишите программу, которая вычилсяет номер подъезда P1 и номер этажа N1 квартиры K1.
Формат ввода
Во входном файле записаны пять положительных целых чисел K1, M, K2, P2, N2. Все числа не превосходят 1000.
Формат вывода
Выведите два числа P1 и N1. Если входные данные не позволяют однозначно определить P1 или N1, вместо соответствующего числа напечатайте 0. Если входные данные противоречивы, напечатайте два числа –1.
Пример 1
Ввод
89 20 41 1 11
Вывод
2 3
FishHook
Adriana
Есть программа, выдаёт ошибку на 7 тесте
вы искренне полагаете, что понятие “седьмой тест” что-то значит для большинства людей?
вот если я вам скажу, что вы своим постом нарушаете закон 88, что вам это даст?
Adriana
FishHook
поняла)) я думала есть определённый критерий для каждого теста
py.user.next
Adriana
Условие задачи:
Бригада скорой помощи выехала по вызову в один из отделенных районов. К сожалению, когда диспетчер получил вызов, он успел записать только адрес дома и номер квартиры K1, а затем связь прервалась. Однако он вспомнил, что по этому же адресу дома некоторое время назад скорая помощь выезжала в квартиру K2, которая расположена в подъезда P2 на этаже N2. Известно, что в доме M этажей и количество квартир на каждой лестничной площадке одинаково. Напишите программу, которая вычилсяет номер подъезда P1 и номер этажа N1 квартиры K1.
Формат ввода
Во входном файле записаны пять положительных целых чисел K1, M, K2, P2, N2. Все числа не превосходят 1000.
Формат вывода
Выведите два числа P1 и N1. Если входные данные не позволяют однозначно определить P1 или N1, вместо соответствующего числа напечатайте 0. Если входные данные противоречивы, напечатайте два числа –1.
Пример 1
Ввод
89 20 41 1 11
Вывод
2 3
Тут надо составить параметризованную систему неравенств, а потом итеративно подбирать для неё количество квартир на этаже, начиная с единицы и заканчивая тысячей. Когда количество квартир на этаже станет известно, тогда по этому количеству квартир на этаже можно вычислить сначала номер подъезда, а потом по этому номеру подъезда можно вычислить номер этажа в этом подъезде.
Ну, это на первый взгляд всё.

Adriana
Есть программа, выдаёт ошибку на 7 тесте, подскажите, пожалуйста, как исправить
Даже если ты исправишь пределы в range(), так как твои range()'ы сейчас перебирают только до 999, то это не изменит ничего.
Надо более грамотный подход применить. Сначала нужно математически её решить, а потом уже эту математику перевести в реализацию в виде кода на языке программирования.

Вот пример тупости твоего кода
Adriana
  
    for i in range(1,1000):
        if  i!=0 and N2==((K2-1)//i)+1:
i никогда не будет равно нулю в этом цикле, зачем её проверять на ноль?

То есть во всех смыслах нужно не вот с этого кода начинать, а с того, что я описал, - с математического решения. Когда получишь систему неравенств, тогда станет ясно, как её закодировать.

Вот эта задача https://acmp.ru/index.asp?main=task&id_task=258
А вообще, если есть такая возможность, то лучше эту задачу не решать. Она слишком сложная и слишком не нужная. То есть её решение ничего не даёт, а времени на неё уйдёт много. Тут, я так понял, нужно насоздавать больше вариантов реальных и ответов для них, потом для этого всего написать множество юнит-тестов, и когда все юнит-тесты будут готовы, под них писать уже реализацию, пока эти юнит-тесты все не будут пройдены. Там придётся рассматривать случаи, когда там один подъезд и когда там не один подъезд. Потом надо будет этот x выделять, который означает количество квартир на этаже, и определять, какая дробь подходит для вычисления полного x, а какая не подходит. Довольно муторная задача, которая просто жрёт время, а при этом ничему не учит. Конечно, прикольно там написать программу, которая вычисляет то, что мозгами не очень сообразишь быстро, но, как выясняется, она не всегда вычисляет, так как в некоторых случаях вычисляет только половину данных, а в некоторых случаях вообще не вычисляет ничего. Ну, и зачем она нужна тогда? Обычная олимпиадная задача - пустая трата времени, которое можно было бы потратить на нормальную задачу, которая какие-нибудь полезные навыки вырабатывает, которые потом точно пригодятся в деле.
AD0DE412
FishHook
закон 88
но вы же понимаете шо ответ в любом случае 42
AD0DE412
Adriana
выдаёт ошибку на 7 тесте
а где трасебек сам то
ZerG
AD0DE412
в тесте же
Palrom
py.user.next
Ну, и зачем она нужна тогда? Обычная олимпиадная задача - пустая трата времени
Вопрос даже больше в том, зачем ТС, ударившись в откровенную олимпиадщину, пришёл на форум за помощью.. Выглядит как штангист, который пропускал трени, вследствие чего не смог взять вес на соревновании и побежал нанимать грузчиков.. Те кто придумывают подобные задачи, видимо настолько преисполнились, что даже правдоподобную жизненную ситуацию под своё это неравенство подогнать не смогли, где это могло бы пригодиться.
Я прям представил диспетчера, который вместо того чтобы тупо перенабрать, или в ЖЕК позвонить, или лифтёрам на худой конец, скинул гарнитуру, хрустнул пальцами, открыл консоль питона и погнал строчить эту дичь.
Adriana
Известно, что в доме M этажей и количество квартир на каждой лестничной площадке одинаково.
Одно только это утверждение обесценивает программу. Это практически не применимо к новым человейникам, а количество квартир на этаже в советских типовых панельках знает любой водила скорой помощи, да даже если не знает, достаточно забежать в первый попавшийся подъезд и глянуть номер квартиры слева и по дверям посчитать. Тамбуры закрыты? Считай по звонкам. Или бабок возле подъезда напряги. Да и над каждым подъездом висит табличка с количеством квартир в нём. Бред короче какой-то.
Adriana
программа, выдаёт ошибку на 7 тесте, подскажите, пожалуйста, как исправить
Между постановкой задачи и вашей конкретной реализацией пропасть из формул, построения алгоритма и пр. Вы бы хоть пару комментариев в коде оставили, пытаясь обьяснить, что и зачем вы делаете.. Что такое 7 тест?
py.user.next
Сначала нужно математически её решить, а потом уже эту математику перевести в реализацию в виде кода на языке программирования
Вот да.

Вот тут вроде как решили вашу задачу:
https://qna.habr.com/q/733429
py.user.next
Palrom
Вот тут вроде как решили вашу задачу:
https://qna.habr.com/q/733429
Не, я вот взял его решение оттуда, подставил туда перевёрнутые данные, выдало ерунду
(немножко принты его поменял тоже, так как он тоже такой слабенький, не может вывод прилично написать, чтобы понятно всё было)
  
#!/usr/bin/env python3
 
dann = [
    (89, 20, 41, 1, 11),
    (11, 1, 1, 1, 1),
 
    (41, 20, 89, 2, 3)
]
 
 
def round_up(v, d):
    result = v // d + (1 if v % d else 0)
    return result
 
 
def find(room_1, max_level, room_old, p_old, level_old):
    count_room_for_level = 0
    # Определим количество этажей на этаже
    if max_level == 1 and p_old == 1:
        return 1, 1
 
    for count_room_for_level in range(40):
        if ((level_old - 1) * count_room_for_level) * p_old < \
           room_old < (count_room_for_level * level_old) * p_old:
            #print(count_room_for_level)
            break
    else:
        return -1
 
    # Определим возможный подъезд
    p_new = round_up(room_1, (max_level * count_room_for_level))
    # Этаж
    level_new = round_up(room_1, count_room_for_level) % max_level
    #print(p_new, level_new)
    return p_new, level_new
 
 
#print(list(find(*v) for v in dann))
 
for i in dann:
    print(i, '->', find(*i))
Выводит
[guest@localhost domkv]$ ./domkv1.py 
(89, 20, 41, 1, 11) -> (2, 3)
(11, 1, 1, 1, 1) -> (1, 1)
(41, 20, 89, 2, 3) -> (1, 3)
[guest@localhost domkv]$
А должно для 41 20 89 2 3 выводить 1 11, как указано в задаче изначальной в виде примера входных и выходных данных.

Понимаешь, это такая туфта с секретом.

Palrom
Те кто придумывают подобные задачи, видимо настолько преисполнились, что даже правдоподобную жизненную ситуацию под своё это неравенство подогнать не смогли, где это могло бы пригодиться.
Не, такие задачи маскируют всякие области, где это может быть нужно. Например, криптоанализ: там бывает, что поступают шифротексты, зашифрованные известным алгоритмом, а нужно найти ключ шифрования, и по битам в этом шифротексте методом построения гипотез проверяют типа “а там могла быть такая-то буква в ключе или не могло её там быть; и если она там могла быть, то с какой вероятностью она там была и выше ли эта вероятность, чем вероятность того, что там этой буквы не было”. Ну, вот таким макаром там ковыряют эти шифры разные, так вскрывают всякую хрень в итоге. Или же вирусная аналитика: там тоже приходит какой-то вирус и нужно понять, из какого примерно кода он был скомпилирован, и происходит обратная разработка (reverse engineering), и для этого тоже надо строить гипотезы, что-то там определять наугад и так далее.

Но вот эта задача - это просто какая-то брутфорсная задача, которая находит ни пойми что в ни пойми чём, и зачем это всё делать, вообще не понятно. Тратить время на эту херню. А зачем? Она не учит ничему.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB