Плюс или минус полиглоты!


14

Ваша заявка должна содержать список чисел (в любом формате списка, который поддерживает ваш язык, или с использованием нескольких параметров функции / командной строки) или строку чисел, разделенных любым символом, который не является 0123456789. На одном языке он должен сложить их все и вывести сумму. На другом языке он должен выводить их вычитать друг от друга по порядку. Пример:

12
5
7
2

На одном языке он должен выводить 26, а на другом - выводить -2. Обратите внимание, что все введенные числа будут положительными целыми числами меньше, чем 100. Никогда не будет предоставлено больше, чем 20числа, поэтому вы никогда не будете выводить больше 2000или меньше чем -1899. Любые вопросы? Комментарий ниже!


Разрешены ли конечные пробелы в выводе?
Деловая кошка

Разрешены ли две разные версии одного и того же языка? См. Python 2/3 Ответ HyperNeutrino
г-н Xcoder

@ Mr.Xcoder это разрешено.
programmer5000

2
@ BetaDecay вы думаете, что это проблема, проверьте код-гольф!
programmer5000

1
@ programmer5000 Вы имеете в виду [code-golf] -[polyglot]?
Эрик Outgolfer

Ответы:


14

Желе / 05AB1E , 3 байта

00000000: c6 71 53                                         .qS

Это hexdump (xxd) представленной программы.

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

Желе: сумма

Jelly использует кодовую страницу Jelly , поэтому видит следующие символы.

İqS

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

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

İqS  Main link. Argument: A (array)

İ    (ignored)
 q   Unrecognized token. This breaks the link; nothing to the left is executed.
  S  Take the sum of A.

05AB1E: разница

05AB1E использует Windows-1252 , поэтому видит следующие символы.

ÆqS

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

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

Æ     Take the difference of the input.
 q    Quit.
  S   (ignored)

22

Python 2/3, 52 байта

lambda l:sum(l[:1]+[x*int(1-(1/2)*4)for x in l[1:]])

int(1-(1/2)*4)возвращается 1в Python 2, потому что 1/2сначала оценивает 0, а затем 0 * 4 = 0.

int(1-(1/2)*4)возвращается -1в Python 3, потому что 1/2сначала оценивает 0.5, а затем int(0.5 * 4) = int(2.0) = 2.


1
Можно ли использовать тот же язык с другими версиями?
мистер Xcoder

3
@ Mr.Xcoder Я не понимаю, почему нет, я видел другие языки, использующие разные версии C, Java, Python и Befunge. Я спрошу о мета или посмотрим, смогу ли я найти связанный мета пост.
HyperNeutrino

Хорошее использование математических уловок из-за изменений версии, все же.
мистер Xcoder

1
@ Mr.Xcoder Спасибо! Я задал вопрос о мета здесь ; Надеюсь, я скоро получу ответ.
HyperNeutrino

1
@ programmer5000 Целочисленное деление.
HyperNeutrino

14

C и C ++ (оба из GCC), 81 75 73 байта

int c;int f(int*a,int l){auto d=.5;c=*a++;for(;--l;a++)c+=*a-4*d**a;c=c;}

Принимает указатель на массив и длину.

Объяснение: по- прежнему используется объяснение @Steadybox ': p В C auto d=.5объявляется целочисленная переменная с классом автоматического хранения (который является значением по умолчанию), который затем инициализируется равным 0, тогда как в C ++ 11 он объявляет double, который инициализируется до 0,5.

C - плюс язык: попробуйте онлайн!

C ++ - минус язык: попробуйте онлайн!


11

05AB1E / Желе , 5 байтов

00000000: 4f71 7f5f 2f                             Oq._/

Попробуйте онлайн! (05AB1E)
Попробуйте онлайн! (Желе)

05AB1E видит :

Oq? _ /
Объяснение:

Oq? _ / 1 неявный аргумент.
O Возьмите сумму первого элемента ввода.
 q Выход.
  ? _ / Не работает.

Желе видит :

Oq
_ /
Объяснение:

_ / Основная ссылка. Аргументы: z
_ / Вычесть элементы z по порядку.

Oq Helper ссылка. Не работает

Использует ли это кодовую страницу Jelly?
programmer5000

@ programmer5000 Это необработанный поток данных, который использует CP-1252 для 05AB1E и JELLY для желе. Отсюда 7f.
Эрик Outgolfer

О, не понял этого!
programmer5000

8

На самом деле / Желе , 4 байта

00000000: e4 81 5f 2f                                      .._/

Это hexdump (xxd) представленной программы. Это не может быть проверено в сыром виде онлайн; TIO не поддерживает кодировку CP437.

На самом деле: сумма

На самом деле использует CP 437 , поэтому он видит следующие символы.

Σü_/

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

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

Σ     Take the sum on the input.
 ü    Print and empty the stack.
  _   Natural logarithm. Ignored since the stack is empty.
   /  Float division. Ignored since the stack is empty.

Желе: разница

Jelly использует кодовую страницу Jelly , поэтому видит следующие символы.

ỵ¹_/

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

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

ỵ¹_/  Main link. Argument: A (array)

ỵ     Unrecognized token. Splits the link.
 ¹    Identity; yield A.
  _/  Reduce (/) A by subtraction (_).

Я прочитал это как actually, Jelly.:)
programmer5000

Вы злоупотребили тем фактом, что неопределенный персонаж действует как :)
Эрик Outgolfer

1
@EriktheOutgolfer Более или менее. Честно говоря, я не совсем уверен, что делают нераспознанные токены.
Деннис

Подумав еще раз, я думаю, что вы просто выбрали Фактически только потому, что он üназначил идеальную функцию> _>
Эрик Outgolfer

@ programmer5000 Это jelly, actually.
Арджун


7

CJam / Jelly , 6 байтов

q~:-
S

CJam

q~    e# Read a list from input
:-    e# Reduce by subtraction
S     e# Push a space
      e# Implicit output

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

Желе

(используя UTF-8, а не кодовую страницу Jelly)

q~:-является вспомогательной ссылкой. Поскольку он не вызывается, на самом деле не имеет значения, что он делает. Sвычисляет сумму массива.

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


5
Джем и желе Имеет смысл использовать две похожие вещи вместе.
mbomb007

1
Это неверно Желе имеет 0x7f для новой строки, это 0x0a для новой строки. В желе это на самом деле так же, как q~:-½S. К сожалению, исправление ( q~:-e#\x7fS) больше. Попробуйте онлайн! (CJam) и попробуйте онлайн! , каждый со своей кодировкой, чтобы проверить себя.
Эрик Outgolfer

2
В качестве альтернативы, вы можете использовать кодировку UTF-8 для Jelly, что делает его действительным, как в настоящее время, но, пожалуйста, укажите это.
Эрик Outgolfer

5

JavaScript / Cubix, 36 байт

//.!v+u;$I^@O<.Iu
a=>eval(a.join`-`)

Попытайся!

Функция JavaScript может быть проверена с помощью фрагмента кода ниже, программа Cubix может быть проверена здесь .

Как это работает?

JavaScript

Первая строка представляет собой строковый комментарий к JavaScript, поскольку он начинается с двух косых черт, поэтому JavaScript видит только нижнюю строку ( a=>eval(a.join`-`)), которая принимает массив в качестве входных данных, соединяет его со знаками минус между ними, а затем запускает его как код, что приводит к вычитание всех элементов в массиве.

let f=
//.!v+u;$I^@O<.Iu
a=>eval(a.join`-`)

console.log(f([1,2,3,4,5]))
console.log(f([3,1,4,1,5]))

Cubix

Cubix видит следующий куб (обратите внимание, что Cubix игнорирует все пробелы):

      / / .
      ! v +
      u ; $
I ^ @ O < . I u a = > e
v a l ( a . j o i n ` -
` ) . . . . . . . . . .
      . . .
      . . .
      . . .

Начало

IP начинается с третьей строки, указывая на восток. Он попадает в 'I'команду, которая берет число из ввода и помещает его в стек. Затем он перенаправляется '^'в цикл суммирования.

Sum-петля

Я удалил все символы, не входящие в цикл суммирования, и заменил их на no-ops ( '.'). IP изначально прибывает во вторую строку, указывая на восток.

      . . .
      ! v +
      u ; $
. . . . . . I u . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

Сначала '!'команда проверяет верхний элемент. Если это так 0(т.е. мы достигли конца ввода), выполняется следующая инструкция ( 'v'), отражающая IP вне цикла. Если мы еще не достигли конца ввода, мы добавляем два верхних элемента вместе ( '+'второй элемент - сумма до этой точки, верхний элемент - новый вход). Затем IP-адрес превращается в другую грань куба, в 'u'символ, который заставляет IP-адрес совершить разворот и выполнить 'I'команду (прочитать другое входное целое число), указывая на север. IP возвращается к верхней грани, пропускает ( '$') инструкцию удаления ( ';') и делает еще один разворот, возвращаясь к точке, с которой мы начали.

Конец

Если IP отображается вне цикла, выполняются следующие символы:

      . . .
      . v .
      . ; .
. . @ O < . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

Эти инструкции удаляют верхний элемент (который равен нулю), а затем выводят верхний элемент (сумму) в виде целого числа. Затем '@'команда достигнута, поэтому программа заканчивается.


4

Python 2 и 3, 33 байта

lambda l,*r:l+sum(r)*(1/2>0 or-1)

Принимает ввод как отдельные параметры.


Python 2.
Python 3.


lambda l,*r:l+sum(r)*(1/2-.5)*2на 31 байт
OVS

@ovs Я целенаправленно избегал возврата поплавка. Если вам разрешено, то *(1/2*4-1)это на байт меньше, чем у вас.
Veedrac

Я думаю , что тип возвращаемого значения не имеет никакого значения, пока значение правильно
овс

4

JS (ES6), CGL (CGL Golfing Language) , 32 26 байтов

 x=>eval(x.join`-`)
//-⨥

JS делает вычитание, а CGL делает сложение.

JS:

x=>eval(x.join`-`)

Анонимная функция, которая вычитает каждый элемент массива, используя Array#reduce.

//-⨥

Комментарий.

ВКТ

 x=>eval(x.join`-`)

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

//-⨥

/ ничего не делают. -Вычитает текущий указатель стека , так что указывает на вход. добавляет текущий стек (вход) вместе, помещает его в следующий стек и увеличивает текущий стек. Это неявно выводится.


1
Вы можете сократить JS-версию x=>eval(x.join`-`), сохранив 5B
Luke


@ Адам, ты прав. Исправлена.
programmer5000

4

JavaScript (ES6) / QBasic, 84 83 байта

'';f=x=>eval(x.join`+`)/*
INPUT a
FOR i=1 TO 2
i=0
INPUT n
a=a-n
PRINT a
NEXT i
'*/

Еще одно решение с комментарием взломать!

JavaScript вычисляет сумму. Он принимает массив, содержащий числа в качестве входных данных. Выходы как функция return. Вы можете вызвать функцию, как alert(f([10,20,30])).

QBasic вычисляет разницу. Неоднократно просит ввода. Как только вы вводите значение, он выводит разницу всех чисел, которые вы ввели, до момента нажатия Enterи снова запрашивает ввод. Продолжает делать то же самое до конца всего.


Как это работает?

В QBasic (язык структурированного семейства BASIC; для него не нужны номера строк), 'отмечает начало комментария, который идет до конца строки. В то время как в JavaScript он отмечает начало строки. Итак, вся первая строка помечена как комментарий в QBasic, но в JavaScript строка выполняется (и эта строка содержит часть JavaScript, которая добавляет числа, а также/* в конце, который начинает комментарий, чтобы скрыть остальные кода QBasic из интерпретатора JavaScript.)

Код от второй строки до второй-последней строки содержит код QBasic для вычисления разности всех входных чисел (код очень понятен).

Последняя строка содержит '*/. 'заставляет интерпретатор QBasic интерпретировать следующий код как комментарий, тогда как в JavaScript он не оказывает никакого влияния, так как является частью комментария (который был запущен в конце первой строки). Следующий код ( */) заставляет JavaScript завершать комментарий, который был начат в первой строке, но он не выполняется в QBasic, потому что QBasic считает, что это часть комментария.


Тестовые случаи

JavaScript (добавляет):

'';f=x=>eval(x.join`+`);/*
INPUT a
FOR i=1 TO 2
i=0
INPUT n
a=a-n
PRINT a
NEXT i
'*/
console.log(f([12,5,7,2]));

QBasic (вычитает):

Перейти на этот сайт . Скопируйте и вставьте следующий код в их текстовый редактор:

1 '';f=x=>eval(x.join`+`);/*
2 INPUT a
3 FOR i=1 TO 2
4 i=0
5 INPUT n
6 a=a-n
7 PRINT a
8 NEXT i
9 '*/

Причина, по которой требуются номера строк, заключается в том, что упомянутый мной веб-сайт поддерживает только неструктурированные языки BASIC. И этот сайт - единственный приличный онлайн-переводчик бейсика, которого я смог найти. Тем не менее, выполнение кода, присутствующего в верхней части поста (код без номеров строк), должно нормально работать в любом хорошем интерпретаторе QBasic, который поддерживает структурированный BASIC, и 'в качестве начального комментария (хотя немногие этого не делают, большинство делают, хотя).


Примечания

  • Это мой первый пост на ! Я надеюсь, что это хорошо!
  • Часть кода QBasic не требует, ENDпотому что интерпретатор никогда не достигнет этого! (Он навсегда застрянет в бесконечном цикле; всегда требует большего ввода.)

3

Brain-Flak / Brain-Flueue , 20 байтов

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

Попробуйте онлайн! (Мозг-зенитчик) (плюс)

Попробуйте онлайн! (Brain-Flueue) (минус)

объяснение

Единственное различие между Brain-Flak и Brain-Flueue заключается в том, что Brain-Flueue заменяет два стека (последний пришел первым, кто вышел), используемых в Brain Flak, двумя очередями (первый пришел первым вышел). Естественно, эта программа использует эту разницу.

Аннотированный код

(                  ) Push the sum of...
 {}                   the first input,
   <            >     zero,
                 {}   the remaining sum (see below)
    ([      ])       Push the of below line
      ({{}})         Pop all the input sans first, push the sum
              {}     Pop (in Brain-Flak, this discards the negative sum,
                            in Brain-Flueue, the positive)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.