Это вопрос об интервью Google, здесь вы найдете ссылку на YouTube.
Задание:
Найти 2 целых числа из неупорядоченного списка, которые суммируются с заданным целым числом.
- Получив неупорядоченный список целых чисел, найдите 2 целых числа, которые суммируются с заданным значением, выведите эти 2 целых числа и укажите успех (выход 0). Они не должны быть какими-то конкретными числами (то есть первые 2 целых числа, суммирующими правильное число), любая пара, которая суммирует значение, будет работать.
- целое число положительное и больше нуля.
- Список целых чисел может быть в любой структуре данных, включая файл целых чисел - одно целое число в строке.
- если целые числа не найдены, укажите сбой (выход 1).
- два целых числа в разных позициях в списке должны быть возвращены. (то есть вы не можете вернуть один и тот же номер из одной и той же позиции дважды)
(Примечание: в видео это не совсем требования. «Интервьюер» менял его несколько раз.)
например.
sum2 8 <<EOF
1
7
4
6
5
3
8
2
EOF
Печатает 3
и 5
и выходит из состояния 0. Обратите внимание, что в этом 1,7
и 2,6
будут также разрешены результаты.
sum2 8 <<EOF
1
2
3
4
Возвращает статус выхода 1, так как невозможна комбо. 4,4
не разрешено, согласно правилу 5.
code-golf
arithmetic
array-manipulation
philcolbourn
источник
источник
Ответы:
Баш, 84 байта
Моя реализация (примерно) решения инженера Google, но с использованием bash и потока ввода - не мое решение, так что это не считается.
метод
в то время как мы можем прочитать целое число V из входного потока, если оно меньше целевого $ 1, тогда, если уже видели $ 1-V, вывести $ 1-V и V и выйти 0 (иначе), сохранить кандидата для ввода $ 1-V и выхода 1
источник
Брахилог , 9 байт
Попробуйте онлайн!
Предполагая, что я правильно понял задачу ...
объяснение
источник
Perl 6 , 59 байт
Попробуй
Попробуй без возможного результата
Expanded:
источник
JavaScript ES6,
58 70 6864 байтаВозвращает пару чисел в виде массива, если найдено, в противном случае возвращает
undefined
ложное значение.источник
3, 5
но это выводит1, 7
...f([2,2] 4)
?includes
трюк.JavaScript (ES6),
615756 байтПринимает массив целых чисел
a
и ожидаемую суммуs
в синтаксисе карри(a)(s)
. Возвращает пару совпадающих целых чисел в виде массива или,undefined
если такой пары не существует.Отформатировано и прокомментировано
Тестовое задание
Показать фрагмент кода
источник
Желе , 14 байт
Попробуйте онлайн!
Это функция (не полная программа), которая выводит на стандартный вывод. (Ссылка TIO имеет оболочку, которая запускает функцию и игнорирует ее возвращаемое значение.)
Эта программа может быть на 4 байта короче, если не требуется код выхода; вернуть код выхода 1 в Jelly довольно сложно. (Возможно, есть более краткий способ сделать это, что я пропустил.)
объяснение
Мы можем просто вдвое сократить каждое целое число в паре, поэтому
o⁶H
мы ничего не сделаем, если найдем результат, кроме возврата бесполезного возвращаемого значения, которое в любом случае не имеет значения (Ṅ
служит удобным однобайтовым методом для определения возврата функции). стоимость рано, в соответствии с правилами PPCG). Однако, если мы не нашли результат, мы заканчиваем тем, что пытаемся вдвое сократить символ пробела, операция настолько бессмысленная, что вызывает сбой интерпретатора Jelly. К счастью, этот сбой дает код выхода 1.источник
Perl 5 , 51 байт
46 байт кода + 5 байт для
-pli
флагов.Попробуйте онлайн!
Идея состоит в том, чтобы перебрать список ввода: для числа
x
($_
), если мы ранее виделиn-x
($^I-$_
), то мы нашли то, что искали, и установили$\
эти два значения ("$_ $v"
). В конце, если$\
не установлено, то мыexit 1
, иначе это будет неявно напечатано.источник
^I
?Рёда ,
6056 байтПопробуйте онлайн!
Этот код выдает ошибку, если ответа нет. Он генерирует все возможные пары, которые могут составить сумму
s
, т.е.1, s-1
,2, s-2
,3, s-3
, ... Тогда он проверяет , если оба числа в массиве ,a
и если да, подталкивает их к потоку.pull
читает одно значение из потока и возвращает его. Если в потоке нет значений, выдается ошибка.a-x
возвращает массивa
сx
удаленнымисточник
Python 2, 60 байт
Этот короткий, пока правила с выходом с кодом 1 не будут разъяснены. Теперь выходит с ошибкой, если ничего не найдено.
-5 байт благодаря @Peilonrayz
-4 байта благодаря @Rod
Попробуйте онлайн
источник
input()
на уменьшение 4 байтаeval(raw_input())
(я думаю).C ++ 133 байта (скомпилировано с помощью clang 4 и gcc 5.3 -std = c ++ 14)
C 108 байтов
источник
#include <set>
и еще несколько дляstd::set
. Хотя вы также можете сохранить несколько байтов, еслиp.insert(v-i);
main
. Мы считаем (если в заявке не указано иное), что функция является допустимым представлением. (добро пожаловать на сайт кстати!)end
, но он компилируется на GCC безstd::
(и установить, если, конечно, нет)Haskell , 34 байта
Попробуйте онлайн!
Для каждого элемента списка эта функция проверяет, находится ли (sum-element) в следующей части списка. Возвращает первую найденную пару. Если функция достигает конца списка, она выдает ошибку «неисчерпывающие шаблоны» и завершается с кодом 1.
источник
[2,2]#4
.PowerShell,
10997 байтЗаключил 12-байтную сделку, предложенную AdmBorkBork
объяснение
Текущие правила ищут код выхода, который это делает. Они могут быть удалены и просто проверить возвращаемые номера и ложные.
Образец использования
Если код выше был сохранен как функция
s
источник
$c
и зацикливаясь вниз -($a.count-1)..1|%{$f=$_;--$_..0|%{if...
R, 49 байт
Это находит все 2-комбинации
x
и возвращает матрицу. Затем суммирует столбец и находит все суммы, которые равныy
(поэтому без[,1]
части в конце он напечатает все комбинации, которым равны их суммыy
)источник
Japt , 9 байт
Сохранено много байтов благодаря @ETHproductions
Попробуйте онлайн!
объяснение
пример
источник
Javascript,
114968684 байтаСохранено 1 байт благодаря @Cyoce и еще 8 байт благодаря @ETHProductions
Это возвращает кортеж с первой комбинацией элементов списка, которые суммируют до заданного входного значения, или ничего без совпадения. Я удалил
var
s в функции; REPL.it вылетает без них, но Chrome Dev Console прекрасно справляется с этим ...Попробуйте онлайн!
источник
y=x+1
заботится об этом.a=>b=>...
чтобы сохранить байтfor(y=x;++y<b.length;){
. Кроме того, вы можете удалить все наборы скобок, кроме самой внешней, и вы можете удалить пробел послеreturn
Clojure, 77 байт
Возвращает первую такую пару или
nil
.источник
Haskell, 62 байта
Я до сих пор не знаю, что разрешено вызовом, а что нет. Я собираюсь для функции, которая печатает пару чисел и возвращает 0, если есть решение и ничего не печатает и возвращает 1, если нет решения. Поскольку печать - это ввод-вывод, я должен поднять возвращаемые значения в IO-Monad (через
return
), и фактический тип функцииNum a => IO a
.Пример использования (с возвращаемым значением, напечатанным repl):
Попробуйте онлайн!,
Если поднятие исключений разрешено,
fail
будет сохранено несколько байтов (всего 51):источник
Желе , 9 байт
У Jelly нет способа установить для кода выхода произвольные значения, поэтому это вызывает ошибку TypeError для ввода без допустимого решения, которое приведет к завершению родительского интерпретатора с кодом выхода 1. .
Попробуйте онлайн!
Как это устроено
источник
Нова , 101 байт
Хорошая вещь в Code Golf состоит в том, что она помогает мне находить ошибки на моем языке. например, пространство, необходимое между
return
и[y,x-y]
.Как только я добавлю функции push / pop в Array.nova и исправлю возвращаемый результат, будет 96 байтов:
Использование:
Изменить: Кроме того, есть этот путь на 73 байта (69 с использованием pop), также:
firstOrThrow сгенерирует исключение, которое будет необработанным и, следовательно, в конечном итоге выйдет из программы с кодом выхода 1.;)
Этот способ кажется более читабельным.
источник
Pyth, 12 байт
объяснение
источник
PHP, 88 байт
принимает входные данные из аргументов командной строки, сумма в первую очередь. Беги с
-nr
.К счастью,
die
/exit
выходит,0
когда вы задаете ему строку в качестве параметра.Я пытался объединить петли в одну; но это требует более длительной инициализации и тестирования на этот раз.
источник
for($i=1;$a=$argv[$k=++$i];)for(;$b=$argv[++$k];)$a+$b!=$argv[1]?:die(!0);
и вы должны взглянуть на этот codegolf.stackexchange.com/questions/120803/…Mathematica, 76 байт
Довольно просто:
#~Subsets~{2}
получает все 2-элементные подмножества списка, затемCases[...,x_/;Tr@x==#2]
выбирает только те, чья сумма равна желаемому числу. Если нет ни одного из них,If[l=={}, Message@f::e,First@l]
печатается сообщение об ошибкеf::e : 1
которое мы определили ранее (поскольку я понятия не имею, что еще может означать «выход из состояния 1» для Mathematica); в противном случае он возвращает первую запись в списке пар, которые суммируются с правильным значением.Если нам разрешено возвращать значение Falsey вместо этого странного состояния выхода, следующий код имеет 58 байтов:
источник
Scala,
5541 байтВозвращает список двух чисел, если они существуют, в противном случае выдает ошибку. Uncaught, эта ошибка приведет к состоянию выхода 1.
источник
Рубин,
5348 байтВходные данные: a - список, s - ожидаемая сумма.
Если 2 числа найдены, выведите их и верните 0, в противном случае верните 1, как в спецификации.
источник
TI-Basic, 59 байт
Объяснение:
Если программа не завершилась корректно, она вызовет ошибку, если в списке недостаточно элементов для продолжения.
источник
CJam, 23 байта
Вход есть
sum numbers
. Например:6 [3 2 3]
. Оставляет положительное число для truey и пустую строку или 0 для falsey.Объяснение:
источник