Что вы получаете, когда умножаете 6 на 9? (42)


60

Я люблю математику. Но я не могу найти ни одного калькулятора, который умножит правильно. Кажется, они понимают все правильно, кроме 6 * 9 (это вопрос жизни, вселенной и всего остального! Как они могли ошибиться ?!). Поэтому я хочу, чтобы вы все написали для меня функцию, которая может правильно умножить 2 числа (и 6 * 9 равно 42 вместо 54. 9 * 6 равно 54 по-прежнему).

О, и я собираюсь создать исходный код в Minecraft, чтобы ... выиграть наименьшее количество байтов!

резюмировать

  • Возьмите 2 числа в качестве ввода (тип не имеет значения, но будут переданы только 2 элемента, и порядок должен быть согласованным. Поэтому потоки и массивы в порядке, если они сохраняют порядок, в котором они были переданы. Т.е. карта выиграна не работает, потому что не сохраняет порядок)
  • Выведите кратное из обоих чисел, кроме случаев, когда они равны 6 и 9, а затем выведите 42 (порядок имеет значение!)
    • PS. Я никогда не был хорош в подсчете, поэтому я думаю, что только целые числа от 0 до 99 являются действительными числами (используемый тип не имеет значения)
  • Побеждает меньшее количество байтов на язык!

Leaderboard:


1
@JonathanAllan Да, добавлены правила для этого.
Тезра

73
По совпадению идентификатор вопроса имеет 42в нем два раза.
Эрик Outgolfer

1
если только целые числа до 99 являются действительными числами, то, например, 9 * 11 является действительным приглашением, а 10 * 10 нет, верно?
Пожалуйста, перестань быть злым

14
@EriktheOutgolfer… и 12 означает, что вычесть, если ввод 6 и 9.
Адам

11
@EriktheOutgolfer Даже если вы читаете ID в обратном направлении.
Т. Сар - Восстановить Монику

Ответы:


65

Mathematica, 15 байт

Число байтов предполагает кодировку Windows ANSI (CP-1252).

6±9=42
±n__:=1n

Определяет бинарный оператор, ±который решает проблему. Мы просто определяем 6±9=42как особый случай, который имеет приоритет, а затем добавляем запасное определение, которое ±равно умножению. Последний использует довольно интересную игру в гольф. Причина, по которой это работает, на самом деле довольно сложна, и нам нужно разобраться в последовательности . Последовательность похожа на то, что в других языках называется сплатом . Это в основном «список» без какой-либо обертки вокруг него. Например, f[1, Sequence[2, 3, 4], 5]это действительно просто f[1, 2, 3, 4, 5]. Другая важная концепция заключается в том, что все операторы являются просто синтаксическим сахаром. В частности, ±может использоваться как унарный или бинарный оператор и представляет собой голову PlusMinus. Так ±xесть PlusMinus[x]и a±bесть PlusMinus[a,b].

Теперь у нас есть определение ±n__. Это сокращение для определения PlusMinus[n__]. Но n__представляет собой произвольную последовательность аргументов. Так что это фактически добавляет определение для двоичного (и n-арного) использования PlusMinus. Значение этого определения 1n. Как это умножить аргументы? Ну, 1nиспользует неявное умножение Mathematica на сопоставление, так что это эквивалентно 1*n. Но *это также просто стенография для Times[1,n]. Теперь, nпоследовательность аргументов. Так что, если мы призываем, a±bтогда это действительно станет Times[1,a,b]. И это только a*b.

Я думаю, что это очень хорошо, как это злоупотребление синтаксисом позволяет нам определять бинарный оператор, используя унарный синтаксис. Теперь мы можем даже делать PlusMinus[2,3,4]вычисления 24(которые также могут быть записаны как ±##&[2,3,4]или, 2±Sequence[3,4]но это просто сходит с ума в этот момент).


Мне особенно нравится, как это в основном патч для моего «калькулятора»: 3 Ради интереса, это тоже работает для *? : 3
Тезра

3
@Tezra хорошо, *это встроенный оператор, так что вам нужно Unprotectдобавить дополнительные определения, но он Unprotect[Times];6*9=42должен работать (хотя сейчас не могу проверить).
Мартин Эндер

1
Делать это с оператором * просто так плохо ... Я люблю это! >: 3
Тезра

1
Как я могу поднять голос, когда точно 42 других?!? Вот мое "будущее +1", которое будет присуждено после того, как кто-то еще сломает его! :-)
The Vee

1
@MartinEnder Aww; Но это самый короткий Mathematica, и мой любимый до сих пор. : 3
Тезра


25

C 32 31 29 28 байт

-2 благодаря Digital Trauma
-1 благодаря musicman523

#define f(a,b)a^6|b^9?a*b:42

Довольно просто Объявляет макрофункцию, fкоторая принимает два аргумента, aи b.
Если aесть 6и bесть 9, вернуть 42. В противном случае верните ax b.

Попробуйте онлайн!


2
Используйте ^вместо ==и немного измените логику: #define f(a,b)a^6||b^9?a*b:42- экономит 2 байта.
Цифровая травма

@DigitalTrauma Приветствия: D
MD XF

1
Я думаю, что вы можете использовать |вместо того, ||чтобы сохранить другой байт, так как он по-прежнему имеет более низкий приоритет, чем^
musicman523

@ musicman523 Спасибо! Редактирование.
MD XF

1
Вы должны обновить свою версию shortC, чтобы принять и эти изменения
musicman523

17

JavaScript (ES6), 20 байт

x=>y=>x-6|y-9?x*y:42

Объяснение:

Если x == 6 и y == 9, x-6|y-9будет 0 (ложь), а 42 будет результатом.

Отрывок:

f=

x=>y=>x-6|y-9?x*y:42

console.log(f(6)(9));
console.log(f(9)(6));


4
Очень красиво сделано; Хотел бы я подумать об этом. +1
Лохматый

14

Python 2 , 30 29 байт

Спасибо Джонатану Аллану за сохранение байта!

lambda x,y:x*[y,7][6==x==y-3]

Попробуйте онлайн!


2
Сохраните байт, используя тот факт, что 6 * 7 равен 42:lambda x,y:x*[y,7][6==x==y-3]
Джонатан Аллан

@JonathanAllan О, это здорово! Спасибо! :)
Аднан

Это решение также работает в Python 3
AMK

Именно то, что я получил! Кажется, я не могу найти способ продвинуть его дальше.
FlipTack

12

05AB1E , 15 11 9 байт

-4 байта благодаря @Emigna

-2 байта благодаря @Adnan

P¹69SQi42

Попробуйте онлайн!

Как это устроено

P          # multiply input
 ¹         # push first number
  69       # the number 69
    S      # split per character
     Q     # equality for both inputs
       i42 # if so, print 42
           # otherwise print product

Вы можете сэкономить 4 байта с‚D96SQi42ëP
Emigna

@ Emigna да ... Почему ,в начале?
Нил А.

Соединение 2 входов для сравнения только один раз в виде списка.
Эминья

Я полагаю, 6Qs9Q*что работал бы так же для того же количества байтов.
Эминья

Изменение формата ввода сохраняет 2 байта:P¹69SQi42
Аднан

10

Java (OpenJDK 8) ,24 22 байта

-2 байта благодаря @ OlivierGrégoire

a->b->a==6&b==9?42:a*b

Попробуйте онлайн!


3
Добро пожаловать в PPCG! Я не знаю много о Java, но не могли бы вы удалить System.out.println()вызов и просто позволить функции вернуть результат?
ETHproductions

2
@ LưuVĩnhPhúc не на Java, потому что мне пришлось бы писать, (a^6|b^9)==0поскольку не существует неявного сравнения «отличается от 0». Полученный фрагмент кода будет иметь длину 27 байт. В любом случае, спасибо за предложение, и, пожалуйста, скажите мне, если я неправильно понял ваш совет.
Застенчивая Белуга

1
@ Riker Нет, это не работает в Java. Например, фрагмент int a = 5; if (a) do_some_stuff(); else do_other_stuff();дает Type mismatch: cannot convert from int to booleanошибку компиляции. Они должны быть сделаны явно с логическими значениями; обратитесь к ТАК и ORACLE .
Застенчивая белуга

3
Вы можете использовать выделки для свободных один байт, и вы можете избавиться от запятой , как это не часть лямбды пощадить другие байты: a->b->a==6&b==9?42:a*b.
Оливье Грегуар

1
Просто обратите внимание, почему 0 не ложно. Java безопасна по типу, поэтому 0 является целым числом, а не логическим, и небезопасное приведение типов не разрешено, поэтому вы не можете использовать ложные значения
Мартин Баркер

6

Рубин, 24 байта

->a,b{a==6&&b==9?42:a*b}

a^6|b^9<1может работать как логическое. Трудно проверить на моем смартфоне.
Эрик

1
@EricDuminil К сожалению, это выражение анализируется как (((a^6)|b)^9), то есть a.^(6).|(b).^(9), поэтому оно не будет работать правильно. a-6|b-9==0будет работать, но это не короче.
Вентеро

@Ventero: я не думал об этом. Благодарю. a,b==6,9было бы хорошо, но это также не работает.
Эрик

6

Brain-Flak , 158 154 148 140 138 126 байт

(({}<>)(((([()()()]<>)){})<({}{}({}))>{(()()()){}(<{}>)}{}))([()]{()(<{}>)}{})(({<{}>{}((<>))}{}){}<{}>{<({}[()])><>({})<>}{})

Попробуйте онлайн!

объяснение

Этот код довольно прост. Мы делаем копии двух верхних элементов в стеке, вычитаем 6 из одного и 9 из другого. Затем мы берем одно notиз двух значений. Мы andэти значения, умножьте результат на 12. Умножьте входные данные и вычтите два результата.


2
Возможно, вы захотите использовать заглавные буквы notи and(или помешать им), прочитав ваше описание, скорее, сбило меня с толку.
MD XF

6

Factorio, 661 байт, 6 комбинаторов с 9 подключениями

Существует один комбинатор констант, настроенный на выход A и B. Измените их, чтобы установить вход.

Строка чертежа (0.15.18):

0eNrNVm2O2jAQvcv8rEKFvSHLRuqPtrfYCkUhGWAkYkfOGDVCOUBv0bP1JLWTLQuB3U0QbfcPYvzxZt68eYr3sNxaLA0phngPlGlVQfxtDxWtVbr1a1yXCDEQYwEBqLTwUY4Z5WgmmS6WpFLWBpoASOX4HWLRBG8C+EScKr6MIJtFAKiYmLCrpw3qRNliicaleK2SAEpduata+fQObiI+zgKo/R+XIyeDWbcrA18IG71NlrhJd+RuuytPmInby1ucyq+uyFScnPHakWHrVg4VdScmnz2fPzQhjnxQlKlpS4zhk7ugLZd2BCTu0NS8IbXusMvalWgVJyuji4SUA4OYjcWmS606nm31wv8YzI+7SS66axbusHxh1zeITGaJ21C4w41XtyeHHCXH9D+o8eVUjYd3qoY47bc86rWPo158/yze2iCqPtxsmHx3r9ry3E6ylU9cTUv0aITDygwPZaaGeFMgUzbM99NBg/aMegPnV+gxRg6oLtFNZFsjfLhiJB+huZn1B87O7Crr/0Pnfz11vug5/9ePn+/E+2Hf++4beNHV8uzgRWWica6ejnDKiraM5oWXwhtC2CcVDo+FxfAWDfwc3Y9jLv4288cj5qG8IXU3Ie2zKj56xgXgZrNqOURhKGfR/GE6nzfNb7OMaxo=

Выходной сигнал является сигналом Z и должен быть взят из верхнего и нижнего решателей.

Скриншот


вааа ... впервые я вижу факториальный ответ в ppcg xD
V. Courtois


6

Желе , 8 7 байт

Vf96SạP

Входные данные представляют собой массив из двух целых чисел: сначала правый операнд, затем левый.

Попробуйте онлайн!

Как это устроено

Vf96SạP  Main link. Argument: [b, a]

V        Cast [b, a] to string, then eval the resulting string.
         For [b, a] = [9, 6], this yields 96.
 f96     Filter with 96, yielding [96] if V returned 96, [] otherwise.
    S    Take the sum, yielding either 96 or 0.
      P  Compute the product of [b, a], yielding ba = ab.
     ạ   Compute the absolute difference of the results to both sides.
         When the sum is 0, this simply yields the product.
         However, when [b, a] = [9, 6], this yields 96 - 54 = 42.

Это имеет как -1 степень свободы. Как эти совпадения происходят с вами?
Lirtosiast

5

Factorio, 581 байт, 3 комбинатора с 4-мя подключениями

Строка чертежа (0.16.36):

0eNqllNtu4jAQht9lLldmldNCFWkvto/RCkUhGWAkYkfOGDVCefeOnV1Km7ACemPJ9vibf04+webgsLWkGfITUGV0B/nrCTra6fLgz7hvEXIgxgYU6LLxO2/HpeZFZZoN6ZKNhUEB6RrfII+HtQLUTEw44sKmL7RrNmjF4AyqsaIa7SVHQWs6eWq0dy+46OcvBT3ki1hc1GSxGi8T5XWwNYdig/vySPJYXvxFFnJXB0znT7dkOy4mYR3JspOTs6DRYoFHtD3vSe98XP/CFZ9xtsqe0mW29KdNW9qgOYffgjCOW3eHk+eR3fai1WkuttY0BWlhQM7W4TC61mPAIYzYLxbry6yS7FKxJFs54rANFdhZRP3VMBnWQk08ZvZ+ChpExqSCyX9bYVLCRfxRwbmabenAaK+03rX0/RnT5z7VJbroQnUH7HkGlq7OsDFtc8WYzWJ8WxbTs4rSEu8bZKpuGoXopkn4gH5vGEKiO/SMO5vbtCgDEjTCjwcm5AWGO4ZgknX16Tq7OhRfHiZXypU91PTRd6ZYdIjo8PnmF3+1AvmfuuBq+bRKYmnWKM2G4R1hAPnz

Нижний левый постоянный комбинатор должен быть настроен на вывод A и B в качестве входа. Выходной сигнал Z из нижнего правого арифметического комбинатора.

введите описание изображения здесь

Top left: 2147483640 A, 2147483637 B
Top right: If everything = 2147483646 output B, input count
Bottom left: (input) A, (input) B
Bottom right: A * B -> Z

5

MATL , 11 байт

[BE]=?42}Gp

Ввод представляет собой массив с двумя числами.

Попробуйте онлайн!

объяснение

[BE]    % Push array [6, 9]
=       % Implicit input: array of two numbers. Compare with [6, 9] element-wise
?       % If the two entries are true
  42    %   Push 42
}       % Else
  G     %   Push input
  p     %   Product of array
        % Implicit end. Implicit display

4

GW-BASIC , 55 байтов

1INPUT A:INPUT B
2IF A=6THEN IF B=9THEN ?"42":END
3?A*B

Выход:

выход

Первая машина на pcjs имеет IBM BASIC, что практически то же самое. Чтобы проверить это, зайдите туда, нажмите Runна машину, нажмите Enter- Enterи введите, BASICAчтобы войти в режим BASIC. Затем введите исходный код (он автоматически печатается для вас), введите RUN, введите два целых числа и готово!


3
Вы уверены, что bytecount правильный? GW-BASIC использует кодировку, в которой некоторые слова, например INPUT, закодированы в меньшем количестве байтов, чем можно предположить из символов, которые их составляют. Таким образом, счет кажется мне высоким.

@ ais523 Ну, я его проверил wcи получил 55 ... Вставил копию в мой эмулятор, и у него было ожидаемое поведение.
MD XF

3
Правильно, моя точка зрения в том, что вы, вероятно, набрали больше баллов, чем нужно. Получите GW-BASIC для сохранения файла, а затем посмотрите на размер полученного файла на диске; это должно быть меньше.

@ ais523 Сохранено как OUT.BAS: i.stack.imgur.com/32eH1.png Bytecount - это среднее значение.
MD XF

Хорошо, я не ожидал этого, но я думаю, что это стирка в этой ситуации. (Или, может быть, существует более одного формата сохранения?)


4

Чек , 34 33 байта

.:+&>#v
#>42#v#9-!\>6-!*?
 d* ##p

Проверьте мой новый esolang. Он использует комбинацию 2D и 1D семантики.

Ввод - это два числа, передаваемых через аргументы командной строки.

объяснение

Стек начинается с аргументов командной строки. Давайте назовем аргументы aи b.

Первая часть, по .:+&сути, дублирует стек, оставляя его как a, b, a, b. >толкает 0 к стеку (это часть числового литерала, завершенного 9).

#переключается на 2D семантику и vперенаправляет IP вниз. IP немедленно наталкивается на a #, который снова переключается на семантику 1D.

9-!проверяет, bравен ли он 9 (вычитая 9 и принимая логическое НЕ). \>6-!затем проверяет, aравен ли 6. Стек теперь содержит a, b, 1, 1тогда и только тогда, когда b==9и a==6. Умножение на *принимает логическое И этих двух значений, давая, a, b, 1если входы были 6и 9, и a, b, 0иначе.

После этого IP сталкивается с ?. Это переключится в режим 2D, если значение верхнего стека отличное от нуля, и в противном случае будет продолжено в режиме 1D.

Если значение верхнего стека было 1, это означает, что другими значениями стека являются 6и 9, поэтому мы помещаем 42 в стек с помощью >42и затем перемещаемся вниз ко второму #в последней строке.

Если значение верхнего стека было 0, то выполнение перемещается вниз на следующую строку. dудаляет 0(как ?не делает), а затем мы умножаем два входа на *. В ##Выключатели и из 2D - режиме, ничего не делая.

Филиалы теперь присоединились снова. Стек либо содержит 6, 9, 1, 42, либо a*b. pпечатает верхнее значение стека, а затем программа завершается, отбрасывая оставшуюся часть стека.


Это выглядит как отличный язык!
Не дерево


3

Python 3 , 36 33 байта

lambda x,y:42if x==6==y-3else x*y

Попробуйте онлайн!


1
Альтернативный вариант, такой же размер: lambda x:x[0]*x[1]if x!=(6,9)else 42. Разница лишь в типе ввода.
musicman523

Nevermind - ваша отредактированная версия короче :)
musicman523

Размещенный вами код на самом деле не работает, поэтому я переключился на рабочую версию TIO, на которую вы ссылались.
ETHproductions

Это работает для меня: в [1]: f = лямбда x, y: 42if 6 == x == y-3else x * y In [2]: f (6,9) Out [2]: 42 In [3 ]: f (9,6) Out [3]: 54 @ETHproductions
Martmists

@Martmists Вы пропустили пробел, потому что ваш код былf=lambda x,y:42if6==x==y-3else x*y
ETHproductions

3

APL (Дьялог) , 10 байт

×-12×6 9≡,

Попробуйте онлайн!

× продукт (аргументов)

- минус

12× двенадцать раз

6 9≡ совпадает ли (6,9) с

, конкатенация (аргументов)


Ого, я только что видел это, и мой ответ J точно такой же, как этот: / за исключением одного байта длиннее
Конор О'Брайен

@ ConorO'Brien Имеет смысл. J и молчаливый APL в основном эквивалентны, за исключением примитивов с несколькими символами J (и нуждаются в Cap для окончательной вершины).
Адам

3

R, 41 Я думаю, я не знаю, как считать байты, я новичок: D

function(a,b){

if(a==6&b==9){42} else {a*b}

}

Я определяю функцию, аргументы которой a и b в этом порядке . Если a равно 6, а b равно 9, возвращается 42, в противном случае a


Добро пожаловать на сайт! :)
DJMcMayhem

Добро пожаловать. Учтите, что переводы строки и пробелы тоже учитываются. В вашем случае, если вы удалите символы новой строки и пробелы (что вы можете), это только 41.
Masclins

1
Вы можете сократить два байта, используяifelse(a==6&b==9,42,a*b)
Masclins

Вы можете сократить все это до 33 байт как function(a,b)`if`(a-6|b-9,a*b,42).
rturnbull

Это всего лишь 41 байт после удаления ненужных пробелов, до тех пор, пока это 47 байт.
Павел

3

SPL , 356 байт

a.Ajax,.Puck,.Act I:.Scene I:.[Enter Ajax and Puck]Ajax:Listen to your heart!Puck:Listen to your heart!Are you as big as the sum of a big big big cat and a cat?If so, am I as big as the sum of a big big cat and a big cat?If so, you are as big as the product of I and the sum of I and a cat.If not, you are as big as the product of you and I.Open your heart

С символами новой строки и пробелами:

a.                       *Title*
Ajax,.                   *Declare variable Ajax*
Puck,.                   *Declare variable Puck*
Act I:.
Scene I:.
[Enter Ajax and Puck]
Ajax: Listen to your heart!                  *Set Puck's value to user input*
Puck: Listen to your heart!                  *Set Ajax's value to user input*
      Are you as big as the sum of a big 
       big big cat and a cat?                *Is Ajax=9?* 
      If so, am I as big as the sum of a 
       big big cat and a big cat?            *Is Puck=6?* 
      If so, you are as big as the product 
       of I and the sum of I and a cat.      *If so, set Ajax=42* 
      If not, you are as big as the product 
       of you and I.                         *If not set Ajax=(Ajax)(Puck)*
      Open your heart                        *Print Ajax's value*


3

Стандартный ML (MLton) , 22 20 байтов

Сохранено 2 байта благодаря @Laikoni!

fun$6 $9=42| $x y=x*y

Попробуйте онлайн!

Это то, для чего предназначен SML, поэтому он лучше, чем shortC и Python.

Старая версия выглядела намного лучше. :П



@Laikoni Ух ты, я понятия не имел, что ты можешь использовать $в качестве идентификатора! Почему это не компилируется, если вы удалите пробел между |и $?
musicman523

SML различает буквенно-цифровые и символические идентификаторы, которые могут быть очень удобны для игры в гольф. |$анализируется как один символический идентификатор, поэтому все ломается. Я планирую вскоре написать вопрос с подсказками для SML и добавить ответ об этих двух типах идентификаторов.
Лайкони



2

Желе , 10 байт

⁼6,9ȧ42ȯ⁸P

Монадическая ссылка, содержащая список из двух чисел.

Попробуйте онлайн!

Как?

⁼6,9ȧ42ȯ⁸P - Link: list of numbers [a,b]
 6,9       - 6 paired with 9, [6,9]
⁼          - equals? (non-vectorising) (1 or 0)
     42    - literal answer, 42
    ȧ      - logical and               (42 or 0)
        ⁸  - link's left argument, [a,b]
       ȯ   - logical or                (42 or [a,b])
         P - product                   (42 or a*b)

Вы могли бы просто использовать ?, как я сделал. ;)
Эрик Outgolfer

Ах, потому что ,особенным является то, что он является частью буквального шаблона регулярных выражений, поэтому 6,9анализируется как один токен, и быстрый $может объединить его с . Вы рассуждали об этом или просто попробовали и заметили, что это сработало?
Джонатан Аллан

1
Я рассуждал об этом.
Эрик Outgolfer


2

SILOS , 81 67 байт

readIO
J=i
readIO
a=(J-6)^2+(i-9)^2
a/a
a-1
a*12
x=J*i+a
printInt x

Попробуйте онлайн!

В некотором смысле дополнение функционирует как интересный NAND-шлюз в SILOS.

-14 байтов благодаря @Leaky Nun

По сути, мы создаем число «a», равное 0 (ложь), если j равно 6 и i = 9, затем мы делим его на одно, вычитаем единицу и умножаем на 12, чтобы добавить к нашему продукту.

Если «a» равнялось 1 после вычитания единицы и умножения, оно становится неактивным, однако в случае, когда a равно 0, 0/0 молча выдает ошибку (которая автоматически фиксируется), a становится 0, а затем становится -1 и в итоге мы вычитаем 12 из нашего продукта.




@ LeakyNun ооо, это умно.
Рохан

На самом деле, 0/0становится 0.
Утренняя монахиня

@ LeakyNun Я хотел сказать, становится 0, а затем уменьшается. Закрепление.
Рохан


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.