Помнится в школе, на уроке информатики, мне не хотелось особо показывать что я разбираюсь в компьютерах, вечно задавал глупые вопросы, отвечал с ошибками и т.д
И вот как-то был урок на тему «условного ветвления». Проходили тогда какой-то Бейсик, но это не суть важно. Так вот на дом было следующее задание: «Написать программу, которая спрашивает у пользователя значение X и Y. Далее программа должна вывести на экран какое значение больше, т.е. X или Y».
Я, уже не знаю зачем, сказал «что-то я не разобрался с условиями, «ифами» и пр. Можно я сделаю это без условий?» Учитель, конечно, улыбнулась моей наивности и сказала, что если я так сделаю, то 5 обеспечена.
Зачем так сказал не знаю, но следующие пару дней я ходил и думал как же на этом бейсике сделать такую программу и при этом не использовать никакого условного перехода… И ведь придумал!

Я написал прогу, которая спрашивает у пользователя эти две переменные и выводит на экран название наибольшей переменной. При этом в программе не было не единого условия (даже как-то завуалированного и типа того). Учитель так и не смогла понять, как «это» работает, но факт, программа выдавала правильные ответы! :)

Я этой зимой уже вспоминал об этой шутке, товарищ Мельников ее даже решил. Правда можно было бы чуток прооптимизировать, и подход немного другой, но, по сути, было похоже на то как я писал.

Так вот, теперь хотелось бы задать эту же задачку моим уважаемым читателям :) Если у кого появится мысль как это реализовать, то пришлите вариант решения на igor@artamonov.ru. В комментарии писать ответ не стоит, я потом опубликую интересные решения. Язык программирования не особо важен, если он из алгоритмических. Так как компилировать я не собираюсь, то, для понятности, лучше написать на чем-то похожем на паскаль или вообще по-русски :) Варианты принимаются до 5 августа 2006г. Ну что, кому хочется показать себя?

Мне скорее интересно не то чтобы нашли именно мое решение, а вообще какие тут вообще решения такой задачи возможны, помоему их будет порядочно. И еще, хотелось бы проверить действительно это простая задача или нет, потому что сейчас, зная решение, кажется что это элементарно.

Update: имелось ввиду вывести не само наибольшее значение, а имя наибольшей переменной.
Т.е. диалог примерно такой:


Введите A:
1
Введите B:
3
Наибольшее значение в переменной: B

29 Комментариев на “Школьная задачка”

  1. Дима сказал:

    Школьная, у меня без минусов правда
    (($a+$b)-(($a+$b)-abs($a-$b))/2);

  2. Андрей сказал:

    array (x,y)[(int) ((x%y) && (x%y)) ]

  3. Андрей сказал:

    array (x,y)[(int) ((y%x) && (y%x)) ] – ошибся

  4. Стас сказал:

    Именно if-ы нельзя использовать, или вообще операцию сравнения в любом виде и различные условные конструкции?

    Если можно использовать condition ? trueValue : falseValue, или условную конструкцию в while(), то все вообще просто. А если нет, то.. счас пришлю соображения, интересную задачку загадал. :)

  5. igor сказал:

    Не, это нельзя пользовать :)

  6. xeye сказал:

    числа могут быть отрицательными?

  7. dulanov сказал:

    Ну это почти очевидно тем, кто знаком с функциональным программированием.

    : func1()
    elif : func2()
    else: func3()

    # Эквивалентное «накоротко замкнутое» выражение
    ( and func1()) or ( and func2()) or (func3()> (подробности смотри по http://www.iso.ru/journal/articles/75.html)

    В Java это, как и многое другое, не поддерживается явно, поэтому поиграем битами:

    /*
    * Created by Ulanov D.P. at Jul 20, 2006 12:25:39 PM
    *
    * $LastChangedBy$
    * $LastChangedDate$
    * $LastChangedRevision$
    */
    package ru.festo;

    import junit.framework.TestCase;

    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.BufferedReader;

    /**
    * ?????????? ????????? ??? ????????? ???? ????????????? ????? ? ?????? ???????? ?? ??? ??? ????????????? ??????????? ?????????.
    *
    * ????: ??? ????????????? ?????
    * ?????: ???????? ???????? ?????
    *
    * ???????? ??????: http://www.artamonov.ru/2006/07/18/shkolnaya-zadachka/
    */
    public class NumberComparator extends TestCase {
    /**
    * @return 1 ???? a > b ????? 0
    */
    private static int isGreater(int a, int b) {
    return ((((a – b) & 0×80000000) >> 31) & 1) ^ 1;
    }

    public static int greater(int a, int b) {
    //return (a > b) && a || b; // ?? ?????????????? ? Java
    return a * isGreater(a, b) + b * isGreater(b, a);
    }

    public void testISGreater() {
    assertEquals(0, NumberComparator.isGreater(0, 1));
    assertEquals(1, NumberComparator.isGreater(1, 0));
    assertEquals(0, NumberComparator.isGreater(1, 2));
    assertEquals(1, NumberComparator.isGreater(2, 1));
    }

    public void testGreater() {
    assertEquals(1, NumberComparator.greater(0, 1));
    assertEquals(1, NumberComparator.greater(1, 0));
    assertEquals(2, NumberComparator.greater(1, 2));
    assertEquals(2, NumberComparator.greater(2, 1));
    }

    public static void main(String[] args) throws IOException {
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

    System.out.println(«Input A:»);
    int a = Integer.decode(in.readLine()).intValue();

    System.out.println(«Input B:»);
    int b = Integer.decode(in.readLine()).intValue();

    System.out.println(«Greater value is: » + greater(a, b));
    }
    }

  8. dulanov сказал:

    Ну это почти очевидно тем, кто знаком с функциональным программированием.

    : func1()
    elif : func2()
    else: func3()

    # Эквивалентное «накоротко замкнутое» выражение
    ( and func1()) or ( and func2()) or (func3()> (подробности смотри по http://www.iso.ru/journal/articles/75.html)

    В Java это, как и многое другое, не поддерживается явно, поэтому поиграем битами:

    /*
    * Created by Ulanov D.P. at Jul 20, 2006 12:25:39 PM
    *
    * $LastChangedBy$
    * $LastChangedDate$
    * $LastChangedRevision$
    */
    package ru.festo;

    import junit.framework.TestCase;

    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.BufferedReader;

    /**
    * Консольная программа для сравнения двух целочисленных чисел и вывода большего из них без использования конструкции ветвления.
    *
    * Вход: два целочисленных числа
    * Выход: значение большего числа
    *
    * Источник задачи: http://www.artamonov.ru/2006/07/18/shkolnaya-zadachka/
    */
    public class NumberComparator extends TestCase {
    /**
    * @return 1 если a > b иначе 0
    */
    private static int isGreater(int a, int b) {
    return ((((a – b) & 0×80000000) >> 31) & 1) ^ 1;
    }

    public static int greater(int a, int b) {
    //return (a > b) && a || b; // не поддерживается в Java
    return a * isGreater(a, b) + b * isGreater(b, a);
    }

    public void testISGreater() {
    assertEquals(0, NumberComparator.isGreater(0, 1));
    assertEquals(1, NumberComparator.isGreater(1, 0));
    assertEquals(0, NumberComparator.isGreater(1, 2));
    assertEquals(1, NumberComparator.isGreater(2, 1));
    }

    public void testGreater() {
    assertEquals(1, NumberComparator.greater(0, 1));
    assertEquals(1, NumberComparator.greater(1, 0));
    assertEquals(2, NumberComparator.greater(1, 2));
    assertEquals(2, NumberComparator.greater(2, 1));
    }

    public static void main(String[] args) throws IOException {
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

    System.out.println(«Input A:»);
    int a = Integer.decode(in.readLine()).intValue();

    System.out.println(«Input B:»);
    int b = Integer.decode(in.readLine()).intValue();

    System.out.println(«Greater value is: » + greater(a, b));
    }
    }

  9. dulanov сказал:

    Update:

    /*
    * Created by Ulanov D.P. at Jul 20, 2006 12:25:39 PM
    *
    * $LastChangedBy$
    * $LastChangedDate$
    * $LastChangedRevision$
    */
    package ru.festo;

    import junit.framework.TestCase;

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;

    /**
    * Консольная программа для сравнения двух целочисленных чисел и вывода большего из них без использования конструкции ветвления.
    *
    * Вход: два целочисленных числа
    * Выход: значение большего числа
    *
    * Источник задачи: http://www.artamonov.ru/2006/07/18/shkolnaya-zadachka/
    */
    public class NumberComparator extends TestCase {

    private static boolean func(String inString, StringBuffer outString) {
    outString.append(inString);
    return true;
    }

    public static String greater(int a1, String s1, int a2, String s2) {
    StringBuffer buffer = new StringBuffer();
    boolean flag = (a1 > a2) && func(s1, buffer) || func(s2, buffer);
    return buffer.toString();
    }

    public void testGreater() {
    assertEquals(«b», NumberComparator.greater(0, «a», 1, «b»));
    assertEquals(«a», NumberComparator.greater(1, «a», 0, «b»));
    assertEquals(«b», NumberComparator.greater(1, «a», 2, «b»));
    assertEquals(«a», NumberComparator.greater(2, «a», 1, «b»));
    }

    public static void main(String[] args) throws IOException {
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

    System.out.println(«Input A:»);
    int a = Integer.decode(in.readLine()).intValue();

    System.out.println(«Input B:»);
    int b = Integer.decode(in.readLine()).intValue();

    System.out.println(«Greater value is: » + greater(a, «A», b, «B»));
    }
    }

  10. igor сказал:

    Глеб, ну это как тебе удобно, главное идея.
    В моем решении тоже был косяк с тем что не все числа воспринимала.

    ЗЫЖ уже прислали 4 разных варианта решения :)

  11. Женя сказал:

    А можно пользоваться sign?
    Типа посчитать int id = (sign(a-b)+1)
    А потом из массива выдать нужную букву? :-)
    res[0]=»B»
    res[1]=»одинаковые»
    res[2]=»A»

  12. SergINI сказал:

    Igor. Найти значение это понятно! Но имя переменной- это просто именованная область памяти. Извините за нескромный вопрос: откуда комп узнает как я обозвал переменную? ;)
    Я уже не говорю про С++, в котором можно поменять значение переменной, не присваивая его этой переменной! Вы уверены, что у этой задачи есть решение? Упростим задачу!!! Выведите переменные так, как я их обозвал в программе? :)

  13. igor сказал:

    Под названием переменных я имел ввиду то, как мы ее показываем пользователю, т.е. все эти «Введите X» и «Введите Y». А как внутри программы именовать это не важно.

  14. aefimov сказал:

    Так можно?
    public char maxVar(int a, int b) {
    char[] names = new char[a + b];
    Arrays.fill(names, 0, a, ‘a’);
    Arrays.fill(names, a, a + b, ‘b’);
    return names[(a + b) >> 1];
    }

  15. Setti @ PlayStation сказал:

    Я сейчас себе мозг сломаю :-) Тут какая-то математическмя хитрость?

  16. igor сказал:

    Ага, у меня была математическая хитрость. Но, судя по предлагаемым решениям, вариантов хитрости может быть очень много. Сам в шоке :)

  17. Висельник сказал:

    Тем не менее, эту задачку нам когда-то предлагали в политехе(Волгоград) на коллоквиуме =)

  18. Setti @ PlayStation сказал:

    Есть! Я решил! Отправил свое решение на почту. Когда будут опубликованы все решения?

  19. igor сказал:

    Сегодня до вечера еще жду всех решений, и завтра выкладываю все способы решения.

  20. элит @ паркет сказал:

    жду недождусь.. как на бейсике воплотить такое мне непонятно

  21. Gen сказал:

    Ну, когда же будут варианты реализации?

  22. c0nst сказал:

    Написал на Java без использования библиотечных функций и каких-либо конструкций (if-then-else, for, while). Когда уже решения будут?

  23. Vlad сказал:

    Написал в одну строчку на python. Жду решений.

  24. Setti сказал:

    Где же решение?

  25. Максим сказал:

    я думаю что-нибудь в этом роде поможет
    max(x, y) = (x + y + abs(x – y)) / 2
    Мне тут более интересную задачку задали. написать на джаве прогу которая просит ввести число N и потом печатает числа от 1 до N не используя циклов, условных операторов и перехват эксепшенов.

  26. demjan сказал:

    не смог написать без оператора сдвига. Идея такая: если разделить A/B то получится либо 0 (А меньше Б) либо что-то больше 1. Соответсвенно сдвигать массив или строку на это число. Но сдвиг по сути тоже условие.

    В общем, очень хотел бы посмотреть на решение.

  27. aefimov сказал:

    Не понял, а куда делся пост сегодняшний с решением? :)

  28. kmmbvnr сказал:

    ага в rss кусочек остался :)
    —————–
    Решение задачки было на самом деле простым, если присмотрется к условию Суть ведь не в том чтобы определить кто из них больше, на сколько, а лишь вывести на экран один из трех вариантов, а для простоты из двух. Вариант 1 Допустим у нас есть массив из двух элементов [”А больше чем Б”,”Б больше чем А”]. [...]

  29. igor сказал:

    А сейчас есть? сам не понял что там произошло… почемуто как приватное пометилось.

Оставьте свое мнение

XHTML: Вы можете использовать следующие html теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> Если в комментарии пишете XML то вместо "<" используйте "&lt;"

Благодарности, комментарии не по теме и пр. спам ссылками удаляется, к тому же автоматически, можете не стараться.