Напишите программу, которая пишет функцию НО на другом языке!

30

Напишите самую короткую программу, которая берет один вход (n) из STDIN (или эквивалентный) и выводит простую инкрементную функцию с одним аргументом (x), которая возвращает x + n, но функция должна быть на другом языке. Довольно просто!

Это код-гольф, применяются нормальные правила, выигрывает самая короткая программа.

Пример:> <> в Python (Ungolfed)

!v"def i(x):"a"    return x+"ir!
 >l?!;o

Входные данные:

3

Выход:

def i(x):
    return x+3

РЕДАКТИРОВАТЬ: анонимные функции и лямбда-выражения допускаются!

Блейк Локли
источник
Насколько большой может быть вход? Насколько я могу судить, ваш пример работает только с однозначными числами для> <> его половины.
Sp3000
Теоретически, у меня должна быть возможность использовать любой (разумный) ввод, но ответы, в которых используется только ввод, который может содержать 1 цифру, полностью приемлемы, я подумал переделать пример, чтобы исправить это перед публикацией, но я решил оставить его для простоты. ,
Блейк Локли
4
Я не вижу никакого определения для того, function BUTчто мы должны написать .. -_-
Оптимизатор
1
Когда функция возвращает другую функцию, она называется замыканием . Я не знаю, если это применимо кросс-языка, хотя ...
ETHproductions
@ETHproductions Я предполагаю, что цель не в том, чтобы вернуть объект функции, а в исходном коде функции на этом другом языке.
Paŭlo Ebermann

Ответы:

23

GS2 → K, 2 байта

•+

Это печатает молчаливую, монадическую функцию. Исходный код использует кодировку CP437 . Попробуйте онлайн!

Тестовый забег

$ xxd -c 2 -g 1 sum-func.gs2
00000000: 07 2b  .+
$ printf 42 | gs2 sum-func.gs2
42+
$ kona
K Console - Enter \ for help

  (42+) 69
111
  f : 42+
42+
  f 69
111

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

GS2

  • GS2 автоматически читает из STDIN и помещает данные в стек.

  • указывает, что следующий байт является строковым литералом-одиночкой.

  • Перед выходом GS2 печатает все элементы стека.

К

Каррирование левого аргумента в K. происходит автоматически

Здесь, n+превращает двоичную функцию +в монадическую функцию, устанавливая ее левый аргумент в n.

Деннис
источник
1
Какую кодировку вы используете?
Конор О'Брайен
2
@ CᴏɴᴏʀO'Bʀɪᴇɴ "Исходный код использует кодировку CP437 ."
ETHproductions
16

ShapeScript → J, 4 байта

"&+"

Это печатает молчаливый, монадический глагол. Попробуйте онлайн: ShapeScript , J

Тестовый забег

$ cat sum-func.shape; echo
"&+"
$ printf 42 | shapescript sum-func.shape; echo
42&+
$ j64-804/jconsole.sh 
   42&+ 69
111
   f =: 42&+
   f 69
111

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

ShapeScript

  • ShapeScript автоматически читает из STDIN и помещает ввод в стек.

  • "&+" толкает эту строку в стеке.

  • Перед выходом ShapeScript печатает все элементы стека.

J

& выполняет аргумент карри.

Здесь, n&+превращает двоичный глагол +в монадический глагол, устанавливая его левый аргумент в n.

Деннис
источник
Я почти уверен, что есть язык, где вам не нужно закрывать цитаты.
lirtosiast
Есть большая вероятность, что вы правы, но я не могу вспомнить ни одного с неявным вводом и неявным выводом.
Деннис
13

GolfScript → CJam, 4 байта

{+}+

Это печатает блок кода (анонимная функция). Попробуйте онлайн: GolfScript , CJam

Тестовый забег

$ cat sum-func.gs; echo
{+}+
$ printf 42 | golfscript sum-func.gs
{42 +}
$ cjam
> 69 {42 +} ~
111
> {42 +}:F; 69F    
111

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

GolfScript

  • GolfScript автоматически считывает данные из STDIN и помещает данные в стек.

  • {+} толкает этот блок в стеке.

  • + выполняет конкатенацию, которая успешно объединяет строку и блок.

  • Перед выходом GolfScript печатает все элементы стека.

CJam

{n +}это блок кода, который при выполнении сначала помещает nв стек, а затем выполняет +, который извлекает два целых числа из стека и помещает их сумму.

Деннис
источник
2
Я просто собирался опубликовать это!
Loovjo
Вау, это впечатляет. {n +}толкает 42, затем выполняет +. (Наверное должно быть {42 +}или "толкает n")
Джастин
@ Justin Действительно. Благодарность!
Денис
12

BrainF *** для JavaScript ES6, 57 байт

----[-->+++<]>--.[-->+<]>+.+.--[->++<]>.[--->+<]>+++.[,.]

(Предполагается, что вход состоит из цифровых символов)

Скажите 1337, ваш вклад. Затем это будет компилироваться в:

x=>x+1337
Конор О'Брайен
источник
10

Ротор до К, 2 байта

'+

С таким же успехом можно прыгнуть на подножку К.

спагетто
источник
10

От 0 до 5 байт

я '++ о

Благодаря @ kirbyfan64sos

Другая версия, использующая функции, добавленные после создания конкурса.

я '+
  • Получает ввод, толкает в стек
  • Толкает '+' как строку
  • Выводит содержимое стека
фаза
источник
K имеет автоматическое карри, так что вы можете просто сделать i'++p.
kirbyfan64sos
Расстояние между K и O равно 4. Вам нужно сократить его на один байт.
mbomb007
@ mbomb007 Вт. Код длиной 5 байтов
фаза
2
Письма. В алфавите. Возьми?
mbomb007
1
@ mbomb007, это было слишком сложно для меня
фаза
9

R до Юлии, 19 байт

cat("x->x+",scan())

Это читает целое число из STDIN, используя scan()и записывает безымянную функцию Джулии в STDOUT, используя cat(). Функция Джулия просто x->x+n, откуда nисходит от программы R.

Алекс А.
источник
9

Malbolge для JavaScript ES6, 71 байт

('&%@9]!~}43Wyxwvutsr)Mon+HGi4~fBBdR->=_]:[875t4rT}0/Pf,d*((II%GEE!Y}Az

Всегда интересно генерировать код Malbolge.

Конор О'Брайен
источник
8

Minecraft 1.8.7 к K, 7 6 + 33 + 27 + 62 = 129 128 байт

Это использует эту версию подсчета байтов .

система

Командные блоки (идущие слева направо):

Табло целей добавить К манекен
Табло игроков установило JK <input>
Tellraw @a {счет: {имя: "J", цель: "K"}, дополнительно: [{text: "+"}]}

Скорее всего, это немного сложнее, но это довольно просто: сгенерируйте переменную Jс целью Kи установите ее значение для этой цели на входе (нет STDIN - я подумал, что это было достаточно близко). Затем, после отметки, выведите оценку переменной Jдля цели, Kза которой следует a +. Очень просто.

Аддисон Крамп
источник
Обратите внимание, что .dat bytecounting не подходит для этой системы, так как указанная версия Minecraft не поддерживает файлы структуры.
Эддисон Крамп
Во-вторых, не могли бы вы удалить extra, поместить JSON партитуры в массив и поместить строку после? tellraw @a [{score:{name:"J",objective:"K"}},"+"]
Программы
@RedwolfPrograms Не на момент представления, четыре года назад.
Эддисон Крамп
8

Серьезно для Python, 15 байт

,"lambda n:n+"+

Ожидается, что ввод будет в строковой форме, т.е. "3"

Объяснение:

,: read value from input
"lambda n:n+": push this literal string
+: concatenate top two values on stack

Попробуйте онлайн (вам нужно будет вручную ввести ввод, потому что постоянные ссылки не любят кавычки)

Mego
источник
Эй, кто-то действительно прошел с серьёзно! : D
ETHпродукция
2
Шутки в сторону? Вы закончили серьезно до Симплекс? D:
Конор О'Брайен
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Он еще не полностью закончен (см. Систему отслеживания проблем), но он работает достаточно хорошо, чтобы использовать его в некоторых играх.
Мего
7

Mathematica для C #, 22 байта

"x=>x+"<>InputString[]

Выводит C # Func<int, int>формы

x=>x+n
LegionMammal978
источник
1
Вывод является действительным Javascript (ES6 / 7), а также.
Исмаэль Мигель
6

Pyth to APL, 7 5 байт

+z"--

Код Pyth просто объединяет input ( z) со строкой "--". Это создает неназванный монадический поезд в APL с формойn-- , откуда nприбывает Pyth. При вызове его в APL (n--)xдля некоторого аргумента xвычисляетn--x = n-(-x) = n+x .

Пытаться: Pyth , APL

Сохранено 2 байта благодаря Денису!

Алекс А.
источник
5

> <> в Python, 25 + 3 = 28 байт

"v+x:x adbmal
o/?(3l
;>~n

Вводит через -vфлаг, например

py -3 fish.py add.fish -v 27

и выводит лямбду Python, например lambda x:x+27 .

Для бонуса вот версия ввода STDIN для 30 байтов:

i:0(?v
x+"r~/"lambda x:
o;!?l<
Sp3000
источник
5

Мышь Руби, 19 байт

?N:"->x{x+"N.!"}"$

Ungolfed:

? N:       ~ Read an integer from STDIN, store in N
"->x{x+"   ~ Write that string to STOUT
N. !       ~ Write N
"}"$       ~ Close bracket, end of program

Это создает безымянную функцию Рубиновых форм , ->x{x+n}где nпроисходит от мыши.

Алекс А.
источник
Хорошая работа, мне нравится этот пост.
этап
5

Haskell to Mathematica, 14 байтов

(++"+#&").show
alephalpha
источник
5

Brainfuck to Java, 273

+ [-----> +++++ +++++ ++++++ [----> ++++ + [-....> ++++ .- [- > +++ -.----- [-...> +++ +++++ ++++++ [----> ++++ .- [---> ++ -. [-----> ++ -. [-..> +++ --------- .------------- [---> + --- + --- ---- .- [-...> +++++ -.- [---> ++ -.. [-----> +++, [. ,] + [---------> +++ .- [---> +++.

Результаты метода , как int d(int i){return i+42;}(что не выглядеть как метод Java, но ... Java!)

фаза
источник
1
Вы знаете, потому что Java.
Конор О'Брайен
1
Что значит, это не похоже на метод Java? Как еще должен выглядеть такой метод?
Paŭlo Ebermann
@ PaŭloEbermannpublic static int method(int argument){return argument+42;}
фаза
1
Хм, хорошо. (Хотя, если вы программируете только на public staticязыке Java, вы на самом деле не занимаетесь Java. argumentЛучше бы его тоже назвали summand;-) )
Paŭlo Ebermann
@ PaŭloEbermann Я просто моделировалpublic static void main(String[] arguments){}
фаза
4

PHP → JavaScript (ES6), 20 24 байта

Чтение из STDIN всегда дорого в PHP. Это выглядит немного странно:

x=>x+<?fgets(STDIN);

Он печатает x=>x+и ждет пользовательского ввода для завершения строки, завершается полной анонимной функцией JavaScript, например x=>x+2.

Первая версия (24 байта )

<?='x=>x+'.fgets(STDIN);
insertusernamehere
источник
Почему не просто x=>x+<?=$x;? Это действительный PHP4.1, и вы можете передавать значения через POST, GET, SESSION, COOKIE, ... и он будет работать без нареканий. Или на PHP5.3 с register_globals=on(в вашем php.iniфайле).
Исмаэль Мигель
@IsmaelMiguel В требованиях к заданию сказано, что для этого требуется число STDIN. Каждый раз я игнорировал то, что критиковали. Поэтому сейчас я серьезно отношусь к требованиям. :)
insertusername здесь
Ну, я думаю, что GETэто прошло STDIN. Я могу проверить это через некоторое время.
Исмаэль Мигель
1
serverfault.com/questions/187025/… <- доказательства по моей претензии. Просто используйте код, который я предоставил, шлепните по этой ссылке, и никто не может пожаловаться
Исмаэль Мигель
1
Хо, понял! Это действительно умно!
Blackhole
4

Питон 2 до CJam, 18 20 байт

Спасибо LegionMammal978 за исправление функциональности.

print"{%f+}"%input()

Python делает основной формат строки. %fэто код для float, и поскольку я не потерял ни одного байта для обработки float, я пошел вперед и сделал это.

CJam во многом совпадает с ответом Golfscript-> CJam. Это выглядит примерно так:

{7.4+}

или:

{23+}

Это блок, который снимает верхнее значение со стека, выталкивает специальное число и добавляет их.

bkul
источник
@ LegionMammal978 В конце вопроса говорится, что разрешены анонимные функции и лямбда-выражения. Тем не менее, я отредактирую свой ответ с помощью альтернативной полной программы.
bkul
1
OP означает, что выход может быть функцией.
LegionMammal978
3

POSIX оболочка для Haskell, 19 байт

read n;echo "($n+)"

Разрешенные анонимные функции, Haskell - хороший выбор вывода с разделами оператора.

Арджанен
источник
3

Retina to Pip , 4 байта

Использует один файл для каждой из этих строк + 1 штрафной байт; или поместите обе строки в один файл и используйте -sфлаг.

$
+_

Соответствует концу ввода с $и помещает +_туда. Это приводит к чему-то в форме 3+_, которая является анонимной функцией в Pip.

DLosc
источник
3

Bash → C / C ++ / C # / Java, 33 байта

и, возможно, другие

echo "int f(int a){return a+$1;}"
Zereges
источник
3

Витси к К, 5 байт

\ o / K будет использоваться очень скоро, если он сможет это сделать.

N '+' Z

или, может быть...

N '+' О

Если входные данные взяты в виде строки (только для ввода 0-9) ...

я '+' Z

Все это для ввода 2 будет выводить:

2+
Аддисон Крамп
источник
3

Крошечный Лисп на Цейлон , 68 61

(d u(q((n)(c(q(Integer x))(c(q =>)(c(c(q x+)(c n()))()))))))

Крошечный Лисп не имеет реального ввода и вывода - он просто имеет оценку выражения. Этот код выше создает функцию и связывает ее сu . Затем вы можете вызвать uс аргументом, nподобным следующему:, (u 7)который оценивает это значение Tiny Lisp:

((Integer x) => (x+ 7))

Это допустимое выражение Цейлона для анонимной функции, которая добавляет 7 к произвольному целому числу.

Спасибо DLosc за улучшение 7 байтов.

Пауло Эберманн
источник
Отличная работа с очень ограниченными выходными возможностями!
DLosc
3

JavaScript для лямбда-исчисления , 39 байт

(Это использует связанный документ в качестве основы.)

alert((x=>`λa(${x}(add a))`)(prompt()))

Скажи вход есть 5. Тогда это становится:

"λa(5(add a))"
Конор О'Брайен
источник
1
Где переводчик для лямбда-исчисления?
Feersum
@feersum Проверьте ссылку. Я не уверен, существует ли реальный переводчик, но мне сказали, что я мог представить на этом языке.
Конор О'Брайен
1
Что вы имеете в виду "вам сказали"? Ответы, которые не запускаются ни в одной языковой реализации, являются недействительными.
Feersum
1
Лямбда-исчисление довольно хорошо известно, я предполагаю, что где-то должен быть действительный интерпретатор. Дело в том, что вам нужно идентифицировать такого интерпретатора и написать код в формате, принятом этим интерпретатором.
Feersum
2

GNU sed для C, 46 байт

sed -r 's/^([0-9]+)$/f(int x){return x+\1;}/'
user2064000
источник
2

Цейлон к Малому Лиспу , 76

shared void run(){print("(q((x)(s ``process.readLine()else""``(s 0 x))))");}

Это производит (после прочтения строки ввода) вывод, подобный (q((x)(s 5(s 0 x)))), который оценивает в Tiny Lisp ((x) (s 5 (s 0 x)))функцию, которая принимает аргумент x, вычитает его из 0 и вычитает результат из 5. (Да, это то, как вы добавляете в Tiny Lisp , есть только встроенная функция вычитания. Конечно, сначала можно определить функцию сложения, но это будет дольше.)

Вы можете использовать это как анонимную функцию:

((q((x)(s 5(s 0 x)))) 7)

(Это оценит до 12.)

Или вы можете дать ему имя:

(d p5 (q((x)(s 5(s 0 x)))))
(p5 7)

Исправления и советы по игре в гольф от DLosc, автора Tiny Lisp.

Paŭlo Ebermann
источник
2

Javascript (ES6)> PHP / Javascript, 38 48 47 байт

Этот код является анонимной функцией, которая создает VALID PHP и вызываемую функцию Javascript anonymous.

P=prompt;P(Function('$x',`return $x+${P()};`));

На момент написания этого кода только Firefox реализовал ES6 изначально (без флагов и тому подобного).

Этот код использует prompt()функцию для запроса ввода и для вывода. Firefox поддерживает копирование вывода prompt(), что делает этот метод легитимным для Javascript.


Соображения:

  • В ;конце требуется для PHP
  • return $xТребуется пространство в Javascript
    • Игнорирование этого скажет, что return$xне определено
  • Название функции автоматическое: у меня нет выбора
  • Выбор только PHP или только Javascript уменьшит код только на 1 байт и уменьшит веселье на половину
  • Может работать с другими языками

Старый ответ (48 байт):

alert(Function('$x',`return $x+${prompt()};`));

Старый неверный ответ:

y=>''+Function('$x',`return $x+${y};`)
Исмаэль Мигель
источник
@ LegionMammal978 Готово. Починил это.
Исмаэль Мигель