Страницы

Поиск по вопросам

воскресенье, 24 ноября 2019 г.

Поменять две переменные местами, не используя третью


Задача об обмене двух целочисленных переменных значениями (без использования третьей) является одним из классических программистских ребусов.

Как сделать это в PHP, используя минимальное количество символов?

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



Пожалуйста, указывайте в ответе количество символов, чтобы проще было выявить победителя.



function getAnswers(questionId, answer_filter, page) {
  return jQuery.ajax({
    url: '//api.stackexchange.com/2.2/questions/' + questionId + '/answers?page=
+ page + '&pagesize=100&order=desc&sort=activity&site=ru.stackoverflow&filter=' + answer_filter,
    method: "get",
    dataType: "jsonp",
    crossDomain: true
  }).then(function(data) {
    if (data.has_more) {

      return getAnswers(questionId, answer_filter, page + 1).then(function(d) {
        return data.items.concat(d.items);
      })
    }
    return data.items;
  });
}

function getAuthorName(e) {
  return e.owner.display_name
}

function process(items) {

  return items.map(function(item) {
    var matched = item.body.match(/(\d+)[^\d]*?<\/h/);
    if (matched) {
      return {
        count: +matched[1],
        link: item.share_link,
        author: getAuthorName(item)

      };
    } else {
      return {
        count: 'N/A',
        link: item.share_link,
        author: getAuthorName(item)
      }
    }
  });
}

function sort(items) {
  return items.sort(function(a, b) {
    if (a.count == 'N/A') return 1;
    if (b.count == 'N/A') return -1;
    return a.count - b.count;
  })
}

function fillTemplate(sortedItems) {
  $('#leadership').append(sortedItems.map(function(item, index) {
    return $('').append($('').html(index + 1))
      .append($('').html(item.author))
      .append($('').html(item.count))
      .append($('').append($('').attr('href', item.link).text('Link')));
  }));
  return sortedItems;
}

var QUESTION_ID = 540286,
  ANSWER_FILTER = "!4*SyY(4Kifo3Mz*lT",
  startPage = 1;
getAnswers(QUESTION_ID, ANSWER_FILTER, startPage)
  .then(process)
  .then(sort)
  .then(fillTemplate);
#leadership {
  border-collapse: collapse;
}
#leadership td,
#leadership th {
  padding: 5px;
}
#leadership th,
td:nth-child(3) {
  text-align: center;
}

Таблица лидеров

Автор Количество символов
Комментарий, о причине выбора победителя: Лидирующий ответ @PashaPash (0 символов) фактически не меняет переменных, поэтому не участвует в конкурсе. Ответ от @Naumov (10 символов), вместо обмена переменных просто присваивает им новы значения. Ну и его длина не является постоянной, а зависит от значений переменных. Рассматривать этот ответ в рамках конкурсной программы я не буду.


Ответы

Ответ 1



PHP, 14 Символов $a+=+$b-$b=$a; Рабочий пример на IDEOne.

Ответ 2



PHP, 15 символов $x^=$y^=$x^=$y;

Ответ 3



PHP, 25 20 list($a,$b)=[$b,$a];

Ответ 4



PHP, 15 Символов $a=$a+$b-$b=$a;

Ответ 5



17, 19, 23 и 42 символа $x=[$y,$y=$x][0]; // 17 $x/=$y=($x*=$y)/$y; // 19 eval("\$x=$y;\$y=$x;"); // 23 extract(unpack("iy/ix",pack("i2",$x,$y))); // 42

Ответ 6



Совсем альтернативный вариант: Повторное присвоение значений переменным - в целом плохая идея. В плане читабельности кода - глядя на первое присвоение значений переменным тяжеп понять, чему ж они будут равны в конце метода. Особенно актуально для языков с нестрогой типизацией. В плане производительности - процессору гораздо удобнее просто начать брать значени из другого места, чем терять время на перекладывание значений из одного куска памяти в другой, и обратно. Гораздо лучше просто заменить использование переменных в том коде, который расположен ниже места, где вы собирались вписать swap. PHP, 0 символов

Ответ 7



PHP, 17 символов $a=$a+$b-($b=$a);

Ответ 8



в общем для оригинальности 28 символов extract(['b'=>$a,'a'=>$b]);

Ответ 9



Смеха ради, 76 символов try{ throw new Exception($b); }catch(Exception $e){ $b=$a; $a=$e->getMessage(); }

Ответ 10



PHP 7.1 (16 символов)

Ответ 11



PHP 10 символов допустим у нас $a=1;$b=5; чтобы поменять их местами мы можем сделать так $a=5;$b=1;

Комментариев нет:

Отправить комментарий