Viết hàm cho bạn biết dòng nào đã bị xóa


28

Viết hàm chứa năm dòng.

Nếu bạn chạy chức năng như hiện tại, nó sẽ trả về 0.

Nếu bạn loại bỏ bất kỳ một trong năm dòng và chạy chức năng, nó sẽ cho bạn biết dòng nào đã bị xóa (ví dụ: nếu bạn loại bỏ dòng cuối cùng, nó sẽ trả về 5).

Brevity, mới lạ, và thanh lịch đều xứng đáng được xem xét. Giải pháp nâng cao nhất (sau một khoảng thời gian hợp lý) sẽ thắng.


4
Hàm có thể lấy tham số không?
jeremy

6
Khai báo hàm có được tính là một trong những dòng nếu chúng ta muốn sử dụng loại ngôn ngữ đó không, hay chỉ là phần thân được tính?
meiamsome

1
Ngoài ra, các dòng của chúng tôi cần được đánh số 1, 2, 3, 4, 5 hay là bất kỳ sơ đồ đánh số nào được phép?
meiamsome

@Jeremy, vâng, điều đó tốt.
jawns317

@meiamsome, chỉ có số lượng cơ thể và các dòng nên được đánh số 1, 2, 3, 4, 5 cho mục đích trả về giá trị.
jawns317

Câu trả lời:


18

Hồng ngọc

Eschewing số ma thuật vì nó không mã golf.

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

Mỗi dòng dải số riêng của nó ra 1^2^3^4^5. Đó là Ruby, vì vậy dòng cuối cùng xác định giá trị trả về.


13

JavaScript ( 134   77   69   65   60 ký tự)

→ bản demo trực tiếp ←

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

gọi hàm này với n = 10.

  • Nếu không có dòng nào bị thiếu, dòng 5 trả về n == 0.
  • Nếu dòng 1 bị thiếu, dòng 5 trả về n == 1.
  • Nếu dòng 2 bị thiếu, dòng 5 trả về n == 2.
  • Nếu dòng 3 bị thiếu, dòng 5 trả về n == 3.
  • Nếu dòng 4 bị thiếu, dòng 5 trả về n == 4.
  • Nếu dòng 5 bị thiếu, var "a" trở thành toàn cục và dòng 4 phát hiện ra rằng để trả về "5".
  • Nếu có dòng 5, công cụ JS thực hiện "cẩu biến", "a" trở thành var cục bộ và dòng 4 không trả về "5".



Những phiên bản trước:

65 ký tự

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

(phải được gọi với n = 15)

69 ký tự

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

(phải được gọi với n = 15)

77 ký tự

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 ký tự

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
}

không chơi gôn

  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;
  }

Chính xác thì var asau khi returnlàm gì? Về lý thuyết, nó không nên đạt được.
Braden hay nhất

@ B1KMusic, trên thực tế, nó đã "đạt" do một thứ gọi là JavaScript biến. Khi JS được "biên dịch", tất cả các khai báo "var" hầu như được đặt ở đầu các hàm mà chúng đang ở.
xem

Hmm, thật lạ. Có một ứng dụng thực tế cho điều này trong ngôn ngữ, hay đây hoàn toàn là một sân golf / khai thác? Tôi không nhớ đã đọc bất cứ điều gì về cẩu nâng trong tài liệu của Mozilla.
Braden hay nhất

đó là một tính năng JS. Được mô tả ở đây: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
Kẻ

Ah, vậy đó là một cách khai thác để chơi gôn.
Braden hay nhất

6

Con trăn

Nếu các tham số được cho phép, thì điều này sẽ hoạt động:

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
}

Hàm sử dụng các "hằng" tích hợp và gán một giá trị khác cho mỗi chúng. Nếu tất cả các biến này bằng với giá trị mới, hàm sẽ trả về 0. Các giá trị logic được chuyển đổi thành số do các toán tử toán học. Các dấu ngoặc đơn xung quanh dòng thứ 4 cho phép trả về kết quả của nó một cách rõ ràng (nếu đó là lệnh cuối cùng).


3

Lua 5.2+

55 ký tự trong cơ thể chức năng không bao gồm dòng mới. Tôi không thể đưa ra bất cứ điều gì tốt hơn nhưng điều này:

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

Hy vọng nhận được thêm điểm cho lạm dụng ý kiến: P

Lý do nó không hoạt động trong 5.1 là do lồng nhau [[]]đã bị xóa và trong 5.1 nó đưa ra lỗi biên dịch thay vì bỏ qua nó như 5.2.

  • Nếu không có dòng nào bị xóa, phần thân hàm có hiệu lực với return 7-2-5
  • Nếu dòng đầu tiên bị xóa, return 1
  • Nếu thứ hai, return 7-5
  • Nếu thứ ba, return 7-2-2
  • Nếu thứ tư, return 7-2-1
  • Nếu thứ năm, return 7-2

2

Hồng ngọc

Tôi đã thử thực hiện nó với các thao tác bitwise và sau đó tôi nhận ra có một giải pháp đơn giản hơn nhiều bằng cách sử dụng danh sách! Thử thách này được phục vụ tốt nhất bởi một ngôn ngữ lập trình tự động trả về giá trị cuối cùng mà nó nhìn thấy, chẳng hạn như 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 không có chức năng rõ ràng, nhưng đây là những gì tôi gọi là chức năng trong Befunge:

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

Các dòng đầu tiên và cuối cùng là bắt đầu chức năng và kết thúc chức năng. Nó thực hiện điều gần nhất để "trở về", nghĩa là, nó đẩy giá trị chính xác lên ngăn xếp.


1

Câu trả lời mới

Tôi tìm thấy một giải pháp khác. Điều đó thật tệ, tôi rất thích môn toán. Giải pháp này sử dụng đệ quy và biến toàn cục (yuck!) Để cho biết mọi dòng đã được chạy hay chưa. Tôi muốn làm một cái gì đó khác với các giải pháp khác, vì vậy điều này không phải là thanh lịch, nhưng nó hoạt động đúng :)

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;
}

Tôi thực sự rất thích thử thách này, cảm ơn bạn! :)


Câu trả lời cũ

Tôi đã giải nó bằng toán học. Nếu mỗi biến được xem là một ẩn số và chúng ta thực hiện một khai báo trên mỗi dòng, thì có năm ẩn số và năm dòng mã: điều này dẫn chúng ta đến hệ thống 5x5 sau:

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.

Khi tôi tìm thấy các giá trị, tôi đã mã hóa chúng và thêm một số nội dung cơ bản.

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;
}

Lưu ý: Câu trả lời cũ sẽ không hoạt động nếu còn nguyên trạng.


Tôi thích hệ thống các ý tưởng phương trình tuyến tính.
ML

1

sáp ong , 86 byte

Dùng thử esolang đầu tiên của tôi. Sau khi nhầm lẫn ban đầu tôi thấy rằng giải pháp rất đơn giản.

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

Giải trình:

chương trình sáp ong hoạt động trên lưới lục giác 2D. Các chương trình được lưu trữ trong một định dạng hình chữ nhật.

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

được lưu trữ dưới dạng

abcd
efgh
ijkl

Các hướng dẫn để di chuyển theo các hướng nhất định là:

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

Giải thích ngắn

_1 p Tạo IP, thêm 1, sau đó chuyển hướng IP sang dòng 2

_^v>~2+p Tạo một IP khác, chỉ trong trường hợp dòng 1 bị thiếu, làm chậm IP để đảm bảo IP từ dòng một ở phía trước, sau đó thêm 2, sau đó chuyển hướng đến dòng 3

> >~3+p Thêm 3, sau đó chuyển hướng đến dòng 4

> >~4+X@7~8+~@$^^{; Thêm 4, sau đó đặt giá trị lstack thứ 2 thành 15, sau đó XOR lstack top và giá trị thứ 2, làm chậm IP (để đảm bảo IP ở dòng 5 ở phía trước, nếu dòng 5 tồn tại) và xuất kết quả, sau đó kết thúc chương trình.

> >~5+@7~8+~@${; Thêm 5, sau đó làm tương tự như trong dòng 4, ngoại trừ việc làm chậm.

Về cơ bản chương trình chỉ tính tổng xor 15

  • Chương trình nguyên vẹn: (1 + 2 + 3 + 4 + 5) xor 15 = 0
  • Thiếu dòng 1: (2 + 3 + 4 + 5) xor 15 = 1
  • Thiếu dòng 2: (1 + 3 + 4 + 5) xor 15 = 2
  • Thiếu dòng 3: (1 + 2 + 4 + 5) xor 15 = 3
  • Thiếu dòng 4: (1 + 2 + 3 + 5) xor 15 = 4
  • Thiếu dòng 5: (1 + 2 + 3 + 4) xor 15 = 5

Việc bổ sung >trong các dòng 3 đến 5 chỉ đảm bảo rằng nếu thiếu một trong các dòng 2 đến 4, IP vẫn được chuyển hướng đúng cách và không rời khỏi chương trình.

Bạn có thể sao chép trình thông dịch sáp ong của tôi, được viết bằng Julia, từ kho GitHub của tôi

Các readme trên GitHub được cập nhật hơn và có cấu trúc tốt hơn trang esolangs.



0

LISP thường gặp:

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

Lưu ý: Việc kết thúc dấu ngoặc đơn trên dòng riêng của nó được coi là kiểu xấu, nhưng vì các ngôn ngữ khác có end}tôi cho rằng nó được cho phép.


0

Bash, 131 ký tự

#!/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 $?

Tất cả đều đơn giản cho đến dòng 5. Sau đó, nó cần phát hiện nếu dòng cuối cùng đã biến mất. Điều này tận dụng các tham số chức năng được phép bằng cách gọi chính nó một cách đệ quy, một lần, để kiểm tra giá trị thành công của chính nó khi nó được thông báo là không thành công trên dòng 5 và nếu dòng 5 bị xóa, 5thay vào đó , dòng 4 sẽ trả về .

(Lưu ý: giảm xuống tối thiểu 131 ký tự nếu tước hết mọi thứ trừ chức năng, bỏ khoảng trắng và thay đổi / bin / bash thành / 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)+"*");
};
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.