编写一个告诉您哪些行已删除的函数


28

编写一个包含五行的函数。

如果按原样运行该函数,则应返回0。

如果您删除了五行中的任何一行并运行该函数,它应该告诉您哪些行已被删除(例如,如果您删除最后一行,则应返回5)。

简洁,新颖和优雅都值得考虑。最高投票赞成的解决方案(经过合理的时间)获胜。


4
函数可以接受参数吗?
杰里米

6
如果我们要使用那种语言,函数声明是否算作其中一行,还是仅计算主体?
meiamsome

1
另外,我们的行需要编号1、2、3、4、5还是允许任何编号方案?
meiamsome

@Jeremy,是的,很好。
颌骨

@meiamsome,仅身体计数,并且为了返回值,行应编号为1、2、3、4、5。
颚ns317 2013年

Answers:


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行,则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 areturn怎么办?从理论上讲,不应达到此目标。
Braden Best 2014年

@ B1KMusic,实际上由于某种称为JavaScript变量提升的原因而被“到达”。当“编译” JS时,所有“ var”声明实际上都放在它们所在的函数的开头。
xem 2014年

嗯,很奇怪。语言是否有实际用途,还是纯粹是打高尔夫球/剥削?我不记得在Mozilla的文档中读过任何有关变量提升的内容。
Braden Best


嗯,所以它更像是打高尔夫球的一项功绩。
Braden Best

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

[R

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

该函数使用内置的“常量”,并为每个常量分配另一个值。如果所有这些变量都等于新值,则该函数返回0。由于数学运算符,逻辑值转换为数字值。第四行左右的括号允许明显返回其结果(如果是最后一条命令)。


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 2015年

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速度以确保第1行的IP在前面,然后添加2,然后重定向到第3行

> >~3+p 添加3,然后重定向到第4行

> >~4+X@7~8+~@$^^{; 加4,然后将第二个lstack值设置为15,然后将Xstack的top和2nd值进行XOR,减慢IP(以确保第5行的IP位于前面,如果第5行存在)并输出结果,然后终止程序。

> >~5+@7~8+~@${; 添加5,然后执行与第4行相同的操作,但放慢速度。

基本上,程序只计算总和x 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存储库中克隆用Julia编写的我的蜂蜡解释器

与esolangs页面相比,GitHub上的自述文件是最新的,结构也更好。



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

注意:在自己的行上end加上结尾括号被认为是不好的风格,但是由于其他语言也有,}我认为允许这样做。


0

Bash,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

(注意:如果删除除函数之外的所有内容,删除空格并将/ bin / bash更改为/ bin / sh,则该字符数最少为131个字符)


0

Java脚本

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)+"*");
};
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.