Напишіть функцію, яка повідомляє, який з її рядків видалено


28

Напишіть функцію, яка містить п’ять рядків.

Якщо запустити функцію як є, вона повинна повернути 0.

Якщо ви видалите будь-який з п'яти рядків і запустите функцію, він повинен повідомити, який з рядків було видалено (наприклад, якщо ви видалите остаточний рядок, він повинен повернути 5).

Стислість, новизна та елегантність - все це заслуговує на увагу. Виграє найвище рішення (після розумної кількості часу).


4
Чи може функція приймати параметр?
Джеремі

6
Чи вважається декларація функції однією з рядків, якщо ми хочемо використовувати такий тип мови, чи вважається лише тіло?
meiamsome

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

@Jeremy, так, це добре.
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 символів)

→ live demo ←

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 відсутній, var "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
}

не гольф

  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

Ах, так це більше скористання для гольфу.
Бреден Найкращий


4

R

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

Функція використовує вбудовані "константи" і присвоює інше значення кожному з них. Якщо всі ці змінні рівні новому значенню, функція повертає 0. Логічні значення перетворюються на числові через математичні оператори. Дужки навколо четвертого рядка дозволяють помітно повернути його результат (якщо це остання команда).


3

Луа 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 байт

Пробую свій перший винахід езоланг. Після первинної плутанини я виявив, що рішення настільки просте.

_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 верхнього та другого значень, сповільнюйте 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 видалено, 5натомість повертається рядок 4 .

(Примітка. Це зменшення до 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.