Напишите функцию, которая скажет вам, какая из ее строк была удалена


28

Напишите функцию, которая содержит пять строк.

Если вы запустите функцию как есть, она должна вернуть 0.

Если вы удалите одну из пяти строк и запустите функцию, она должна сообщить вам, какая из строк была удалена (например, если вы удалите последнюю строку, она должна вернуть 5).

Краткость, новизна и элегантность - все это заслуживает рассмотрения. Решение с наибольшим количеством голосов (после разумного количества времени) выигрывает.


4
Может ли функция принимать параметр?
Джереми

6
Считается ли объявление функции одной из строк, если мы хотим использовать такой язык, или считается только тело?
meiamsome

1
Кроме того, наши линии должны быть пронумерованы 1, 2, 3, 4, 5 или разрешена какая-либо схема нумерации?
meiamsome

@ Джереми, да, все в порядке.
jawns317

@meiamsome, учитывается только тело, а строки должны быть пронумерованы 1, 2, 3, 4, 5 с целью возврата значений.
jawns317

Ответы:


18

Рубин

Избегать магических чисел, потому что это не код гольф.

def f
  r=2^3^4^5
  defined?(r) ? r^=2 : r=1^3^4^5
  r^=3
  r^=4
  r^=5
end

Каждая строка убирает свой номер из 1^2^3^4^5. Это Ruby, поэтому последняя строка определяет возвращаемое значение.


13

JavaScript ( 134   77   69   65   60 символов)

→ живой демо ←

function(n){
a=n-=1
n-=2
+3
+4;if(this.a)return 5
return n;var a
}

вызовите эту функцию с n = 10.

  • Если ни одна строка не пропущена, строка 5 возвращает n == 0.
  • Если строка 1 отсутствует, строка 5 возвращает n == 1.
  • Если строка 2 отсутствует, строка 5 возвращает n == 2.
  • Если строка 3 отсутствует, строка 5 возвращает n == 3.
  • Если строка 4 отсутствует, строка 5 возвращает n == 4.
  • Если строка 5 отсутствует, переменная «a» становится глобальной, а строка 4 обнаруживает, что она возвращает «5».
  • Если присутствует строка 5, механизм JS выполняет «подъем переменной», «a» становится локальной переменной, а строка 4 не возвращает «5».



Предыдущие версии:

65 символов

function(n){
a=n-=1
n-=2
+3
+4;if(this.a)return 5
n-=5;return n;var a
}

(должен вызываться с n = 15)

69 символов

function(n){
n-=1
n-=2
n-=3
a=n-=4;if(this.a)return 5
n-=5;return n;var a
}

(должен вызываться с n = 15)

77 символов

function(){
a=
b=
c=
d=1;if(this.a)return 5
1;var a,b,c,d;return d?c?b?a?0:1:2:3:4
}

134 символа

function w(){
a=1;e=1;if(this.e)return 5
b=1;if(!a)return 1
c=1;if(!b)return 2
d=1;if(!c)return 3
var a,b,c,d,e;return d?0:4
}

без golfed

  function whichlineisremoved(){
    /* 1 */ var a = 1; e = 1; if(window.e) return 5;
    /* 2 */ var b = 1, a; if(!a) return 1;
    /* 3 */ var c = 1, b; if(!b) return 2;
    /* 4 */ var d = 1, c; if(!c) return 3;
    /* 5 */ var e = 1, d; if(!d) return 4; return 0;
  }

Что именно делает var aпосле return? Теоретически это не должно быть достигнуто.
Брэден Бест

@ B1KMusic, на самом деле он «достигнут» из-за того, что называется подъемом переменных JavaScript. Когда JS «компилируется», все объявления «var» фактически помещаются в начало функций, в которых они находятся.
xem

Хм, это странно. Есть ли практическая польза для этого в языке, или это чисто гольф / эксплойт? Я не припоминаю, чтобы читал что-либо о подъеме переменных в документации Mozilla.
Брэден Бест

это особенность JS. Описано здесь: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
xem

Ах, так это скорее подвиг для игры в гольф.
Брэден Бест

6

питон

Если параметры разрешены, то это будет работать:

def f(n=10):
    n -= 1
    n -= 2
    n -= 3
    if n == 4: return 0 if f(7) else 5
    return n - 4 or 4

4

р

f <- function() {
  T <- FALSE
  F <- TRUE
  month.abb <- TRUE
  (pi <- 5)
  T + (!F) * 2 + (!isTRUE(month.abb)) * 3 + (pi != 5) * 4
}

Функция использует встроенные «константы» и присваивает другое значение каждому из них. Если все эти переменные равны новому значению, функция возвращает 0. Логические значения преобразуются в числовые из-за математических операторов. Скобки вокруг 4-й строки позволяют визуально вернуть результат (если это последняя команда).


3

Lua 5.2+

55 символов в теле функции, исключая переводы строки. Я не мог придумать ничего лучшего, кроме этого:

function f()
return 7--[[
return 1--[=[]]-2
--[[
-2--[=[]]
-5--]=]--]]-1
end

Надеясь получить дополнительные баллы за злоупотребления комментариями: P

Причина, по которой он не работает в 5.1, заключается в том, что вложенные [[]]были удалены, а в 5.1 он выдает ошибку компиляции, а не игнорирует ее, как в 5.2.

  • Если ни одна из строк не удалена, тело функции эквивалентно return 7-2-5
  • Если первая строка удалена, return 1
  • Если второе, return 7-5
  • Если третий, return 7-2-2
  • Если четвертый, return 7-2-1
  • Если пятый, return 7-2

2

Рубин

Я попытался сделать это с побитовыми операциями, и затем я понял, что есть намного более простое решение, используя списки! Этот вызов лучше всего подходит для языка программирования, который автоматически возвращает последнее значение, которое он видит, например для Ruby.

def tellMe(x=[1,2,3,4,5])
    x.delete(1)
    x.delete(2)
    x.delete(3)
    x.delete(4);x[0]
    x.delete(5);x==[]?0:x[0]
end

2

У Befunge нет явных функций, но вот что я бы назвал функцией в Befunge:

v^    <
>v
1>v
 2>v
##3>5v
$0v4 >
>>>>>>^

Первая и последняя строки - начало функции и конец функции. Он наиболее близок к «возврату», то есть помещает правильное значение в стек.


1

Новый ответ

Я нашел другое решение. Это так плохо, мне очень понравилась математика. Это решение использует рекурсию и глобальные переменные (yuck!), Чтобы определить, была ли запущена каждая строка или нет. Я хотел сделать что-то отличное от других решений, так что это не очень элегантно, но работает правильно :)

PHP

function LOL($a) {
    if (!$a) { LOL(true); if (!$GLOBALS['b']) return 2; if (!$GLOBALS['c']) return 3; if (!$GLOBALS['d']) return 4; if (!$GLOBALS['e']) return 5; return 0; } 
    if ($a) $GLOBALS['b'] = true; else return 1;
    $GLOBALS['c'] = true;
    $GLOBALS['d'] = true;
    $GLOBALS['e'] = true;
}

Мне очень понравилось это испытание, спасибо! :)


Старый ответ

Я решил это с помощью математики. Если каждая переменная рассматривается как неизвестная, и мы делаем одно объявление на строку, есть пять неизвестных и пять строк кода: это приводит нас к следующей системе 5x5:

b+c+d+e = 1;
a+c+d+e = 2;
a+b+d+e = 3;
a+b+c+e = 4;
a+b+c+d = 5;
//Solutions are displayed in the code below.

Как только я нашел значения, я жестко закодировал их и добавил некоторые базовые вещи.

PHP

function LOL(){
    $a = 2.75;
    $b = 1.75;
    $c = 0.75;
    $d = -0.25; if ($a+$b+$c+$d == 5) return $a+$b+$c+$d;
    $e = -1.25; return $a+$b+$c+$d+$e;
}

Примечание . Старый ответ не будет работать, если оставить его как есть.


Мне нравится идея системы линейных уравнений.
ML

1

пчелиный воск , 86 байт

Опробовать мой первый изобретенный esolang. После первоначальной путаницы я обнаружил, что решение очень простое.

_1 p
_^v>~2+p
   >   >~3+p
       >   >~4+X@7~8+~@$^^{;
           >    >~5+@7~8+~@${;

Объяснение:

Программы на основе пчелиного воска работают на двумерной гексагональной сетке. Программы хранятся в прямоугольном формате.

    a — b — c — d
   / \ / \ / \ /
  e — f — g — h
 / \ / \ / \ /
i — j — k — l

хранится как

abcd
efgh
ijkl

Инструкции для движения в определенных направлениях:

    b — d 
   / \ / \                                  bd
  < —IP — >    or in compact form (β=IP):   <β>
   \ / \ /                                   pq
    p — q

Краткое объяснение

_1 p Создайте IP, добавьте 1, затем перенаправьте IP на строку 2

_^v>~2+p Создайте другой IP, на случай, если строка 1 отсутствует, замедлите IP, чтобы убедиться, что IP из первой строки впереди, затем добавьте 2, затем перенаправьте на строку 3

> >~3+p Добавьте 3, затем перенаправьте на строку 4

> >~4+X@7~8+~@$^^{; Добавьте 4, затем установите значение 2-го lstack равным 15, затем значения XOR lstack top и 2nd, замедлите IP (чтобы убедиться, что IP в строке 5 впереди, если строка 5 существует) и выведите результат, затем завершите программу.

> >~5+@7~8+~@${; Добавьте 5, затем сделайте то же самое, что и в строке 4, за исключением замедления.

В основном программа просто рассчитывает сумму xor 15

  • Программа не повреждена: (1 + 2 + 3 + 4 + 5) xor 15 = 0
  • Отсутствует строка 1: (2 + 3 + 4 + 5) xor 15 = 1
  • Строка 2 отсутствует: (1 + 3 + 4 + 5) xor 15 = 2
  • Строка 3 отсутствует: (1 + 2 + 4 + 5) xor 15 = 3
  • Отсутствует строка 4: (1 + 2 + 3 + 5) xor 15 = 4
  • Отсутствует строка 5: (1 + 2 + 3 + 4) xor 15 = 5

Дополнительные >строки 3–5 просто гарантируют, что если одна из строк 2–4 пропущена, IP-адрес по-прежнему перенаправляется правильно и не покидает программу.

Вы можете клонировать мой интерпретатор пчелиного воска, написанный на Джулии, из моего репозитория GitHub

Файл readme на GitHub более современный и лучше структурированный, чем страница esolangs.



0

Общий LISP:

(defun which-line-is-removed (&aux (x 30)) 
  (decf x 2)
  (decf x 4)
  (decf x 8)
  (decf x 16) 5
  (if (zerop x) 0 (log x 2))
)

NB. Заканчивать круглые скобки на отдельной строке считается плохим стилем, но поскольку другие языки имеют, endи }я предполагаю, что это разрешено


0

Баш, 131 символ

#!/bin/bash

# the function:
function f(){
  a=1;
  b=2;
  c=3;
  d=4;[ ! $1 ]&&f 1&&return 5||true
  [ $1 ]&&return 6;e=5;s=$((a+b+c+d+e));return $((15-$s))
}

# call it:
f
# report the result:
echo Removed line $?

До строки 5 все просто. Затем необходимо определить, не прошла ли последняя строка. Это использует преимущества разрешенных параметров функции, вызывая себя рекурсивно, один раз, чтобы проверить свое собственное значение успеха, когда ему говорят об ошибке в строке 5, и если строка 5 удаляется, строка 4 возвращается 5вместо этого.

(Примечание: минимальное количество символов - 131, если удалить все, кроме функции, пропустить пробелы и изменить / bin / bash на / bin / sh)


0

Javascript

function(){
/*aa*/if(arguments.callee.toString().indexOf("*"+"a".repeat(6)+"*")==-1)return 5;
/*aaa*/if(arguments.callee.toString().indexOf("*"+"a".repeat(5)+"*")==-1)return 4;
/*aaaa*/if(arguments.callee.toString().indexOf("*"+"a".repeat(3)+"*")==-1)return 2;
/*aaaaa*/if(arguments.callee.toString().indexOf("*"+"a".repeat(4)+"*")==-1)return 3;
/*aaaaaa*/return +!~arguments.callee.toString().indexOf("*"+"a".repeat(2)+"*");
};
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.