Що ви отримуєте, коли множите 6 на 9? (42)


60

Я люблю математику. Але я не можу знайти жодного калькулятора, який би міг правильно множити. Вони, здається, отримують все правильно, окрім 6 * 9 (Це питання до життя, Всесвіту та всього! Як вони могли помилитися ?!). Тож я хочу, щоб ви всі написали для мене функцію, яка може помножити 2 числа правильно (а 6 * 9 дорівнює 42, а не 54. 9 * 6 дорівнює 54 ще).

О, і мені доведеться будувати джерело в Minecraft, щоб ... найменший байт виграв!

Резюме

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

Табло:


1
@JonathanAllan Так, для цього додані правила.
Тезра

73
Випадково ідентифікатор питання має 42в ньому двічі.
Ерік Аутгольфер

1
якщо лише цілі числа до 99 - це дійсні числа, то, наприклад, 9 * 11 - це дійсне підказка, але 10 * 10 - ні, чи не так?
темний мандрівник

14
@EriktheOutgolfer… і 12 означає, що потрібно відняти, якщо введення 6 та 9.
Adám

11
@EriktheOutgolfer Навіть якщо ви читаєте ідентифікатор назад.
Т. Сар - Відновіть Моніку

Відповіді:


65

Математика, 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

Пояснення:

Iff 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 так ... Чому ,на початку?
Ніл А.

Об'єднання двох входів для порівняння лише один раз у списку.
Емінья

Я припускаю, що він 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 байт. У будь-якому випадку, дякую за пропозицію, і скажіть, будь ласка, чи я неправильно зрозумів вашу пораду.
Bashful Beluga

1
@Riker nope, це не працює так, як у Java. Наприклад, фрагмент int a = 5; if (a) do_some_stuff(); else do_other_stuff();дає Type mismatch: cannot convert from int to booleanпомилку компіляції. Вони повинні бути зроблені явно з булевими значеннями; зверніться до SO та ORACLE .
Bashful Beluga

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

1
Просто зауважте, чому 0 неправдивий. Java є безпечним, тому 0 - це ціле число, не булеве, і небезпечне набір клавіш не дозволено, тому ви не можете використовувати хибні значення
Martin Barker

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працювало б, але це не коротше.
Вентеро

@ Вентеро: Я про це не думав. Дякую. a,b==6,9було б добре, але це також не працює.
Ерік Думініл

6

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

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

Спробуйте в Інтернеті!

Пояснення

Цей код досить простий. Робимо копії двох верхніх елементів на стеку, віднімаємо 6 з одного і 9 з іншого. Потім беремо notдва значення. Ми, andці значення, множимо результат на 12. Помножимо введення і віднімемо два результати.


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

6

Факторио, 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 і повинен прийматися з верхнього і нижнього децидерів.

Знімок екрана


waaa ... вперше я бачу відповідь на факторио в 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

Факторио, 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
Ви впевнені, що базовий рахунок правильний? 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

Перевірка - це мій новий езоланг. Він використовує комбінацію 2D та 1D семантики.

Введення - це два числа, передані через аргументи командного рядка.

Пояснення

Стек починається з аргументів командного рядка на ньому. Назвемо аргументи aі b.

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

#переходить на 2D семантику і vперенаправляє IP вниз. IP негайно стикається з a #, який знову переходить на 1D семантику.

9-!перевіряє, чи bдорівнює 9 (віднімаючи 9 і приймаючи логічний NOT). \>6-!потім перевіряє, чи aдорівнює 6. Стек тепер містить, a, b, 1, 1якщо і тільки, якщо b==9і a==6. Множення з *приймає логічне І з цих двох значень, що дає , a, b, 1якщо входи були 6і 9, а в a, b, 0іншому випадку.

Після цього IP переходить в a ?. Це перейде в 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, у: 42if 6 == x == y-3else x * y В [2]: f (6,9) Вихід [2]: 42 В [3 ]: f (9,6) Out [3]: 54 @ETHproductions
Мартисти

@Martmists Тоді вам не вистачало місця, оскільки ваш код бувf=lambda x,y:42if6==x==y-3else x*y
ETHproductions

3

APL (Dyalog) , 10 байт

×-12×6 9≡,

Спробуйте в Інтернеті!

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

- мінус

12× дванадцять разів

6 9≡ чи (6,9) тотожне

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


О, о, я щойно це побачив, і моя відповідь J точно така ж, як і ця: / за винятком на один байт більше
Conor O'Brien

@ ConorO'Brien Має сенс. J та мовчазна APL здебільшого еквівалентні, за винятком багатопривабливих примітивів J (і потрібна шапка на останньому верху).
Adám

3

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

function(a,b){

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

}

Я визначаю функцію, аргументи якої є a і b в цьому порядку . Якщо дорівнює 6, а b дорівнює 9, воно повертає 42, інакше - рази b


Ласкаво просимо на сайт! :)
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.

Стара версія виглядала набагато приємніше. : P



@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)

Ви могли просто використати ?, як я. ;)
Ерік Аутгольфер

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

1
Я це міркував.
Ерік Аутгольфер


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

По суті, ми створюємо число "а", яке дорівнює 0 (помилкове), якщо iff j дорівнює 6 і i = 9, то ділимо його на себе, віднімаємо одне і множимо на 12, щоб додати до нашого продукту.

Якщо "a" було 1 після віднімання одного і множення, воно стає неоперативним, проте у випадку, коли a дорівнює 0, 0/0 мовчки видає помилку (яка автоматично магічно потрапляє) a стає 0, а потім стає -1 і ми закінчуємо віднімання 12 з нашого продукту.




@LeakyNun ooh, це розумно.
Rohan Jhunjhunwala

Власне, 0/0стає 0.
Leaky Nun

@LeakyNun Я мав на увазі сказати, що стає 0, а потім зменшився. Закріплення.
Rohan Jhunjhunwala


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.