어떤 두 줄이 제거되었는지 알려주는 함수를 작성하십시오.


19

에서 내 앞의 코드 도전 , 나는 제거 된 그 라인의 어떤을 알려주는 기능을 작성하는 방법을 물었다.

지시 사항은 다음과 같습니다.

다섯 줄을 포함하는 함수를 작성하십시오.

함수를있는 그대로 실행하면 0을 반환해야합니다.

다섯 줄 중 하나를 제거하고 함수를 실행하면 어떤 줄이 제거되었는지 알려야합니다 (예 : 마지막 줄을 제거하면 5를 반환해야 함).

자, 조금 더 어려운 것을 시도해 봅시다.

위와 동일한 규칙을 따르십시오. 그러나 이번에는 함수가 어느 TWO 행이 제거되었는지 알려주는 배열을 반환해야합니다.

예를 들어, 줄 1과 5를 제거하면 반환 값은 [1,5]가되어야하고, 줄 3과 4를 제거하면 반환 값은 [3,4]가되어야합니다.

다시 말하지만, 행이 제거되지 않으면 함수는 0을 리턴해야합니다. 한 행 제거 된 케이스도 처리 할 수있는 경우 보너스 포인트이지만 반드시 그럴 필요는 없습니다.

도우미 기능을 사용할 수 있습니까? 예,하지만 필요한 경우에만 가능합니다. 이것을 없애는 하나의 독립적 인 기능이 이상적입니다.

마지막 도전과 마찬가지로, 가장 높은 평가를받은 솔루션이 승리합니다. 일주일 내에 또는 24 시간 내에 새로운 제출물이 접수되지 않으면 더 빨리 우승자를 선택합니다.


2
더 선은 제거되지 않습니다, 또는 그것을 않는 경우는, 하늘의리스트 확인을 반환 이 숫자 0으로?
— Ilmari Karonen

1
함수의 리턴 라인이 제거 가능한 라인 중 하나입니까?
— le_vine

11
내일 버전 "3 줄"이 게시 될 것으로 기대할 수 있습니까?
— Howard

함수가 문자 그대로 배열을 반환해야합니까 아니면 전역 범위 등에서 변수를 편집 할 수 있습니까? 나는 이것이 5 줄에서 가능하지 않다고 생각하지만 실제로는 반환 할 수없는 경우 모든 줄을 반환해야하기 때문에 미리 볼 수 없기 때문에 실제로 돌아 오는 것으로 생각합니다. 내가 모르는 자동 리턴 기능과 같은 언어 문제가 없다면.
— George Reith

관심이 있고 보지 못한 사람에 대해서도 이전 질문에 대한 링크를 제공해야한다고 생각합니다.
— DroidDev

답변:


17

펄

sub foo {
    @a = (2..5);
    @a = grep $_ != 2, (@a ? @a : (1..5));
    @a = grep $_ != 3, (@a ? @a : (1..5));
    @a = grep $_ != 4, (@a ? @a : (1..5));
    @a = grep $_ != 5, (@a ? @a : (1..5));
}

이것은 실제로 모든 줄 이 아니라면 제거되는 모든 줄에 적용되며 5 줄 이상으로 간단하게 확장 할 수 있습니다. 도우미 함수는 사용되지 않으며 한 줄에 하나의 명령문 만 사용합니다. 그것은 명시 적이없는 경우 사실에 의존합니다.return 명령문 Perl 함수의 리턴 값이 마지막 명령문의 값 합니다.

(목록 컨텍스트에서)이 코드는 행이 삭제되지 않은 경우 숫자 0이 아닌 빈 목록을 반환합니다. 이 문제는 해결 될 수 있지만 (예 : @a ? @a : 0;마지막 줄에 " "를 추가하여 ) 코드가 더 나빠질 수 있습니다. 어떤 경우에 스칼라 문맥는 않습니다 더 선이 제거되어 있지 않은 경우는 0입니다 삭제 된 행의 수를 반환합니다. ;-)


9

루비

Perl 버전과 비슷하지만 Ruby입니다. 요청에 따라 행을 삭제하지 않으면 0을 반환하지만 코드가 더 추악하고 반환 값으로 의미가 없다는 것에 동의합니다.

def which_lines_removed(arr = [*1..5])
  arr -= [1]
  arr -= [2] 
  arr -= [3] 
  arr -= [4] 
 (arr -= [5]).empty? ? 0 : arr
end

행이 삭제되지 않은 경우 빈 배열이 리턴 값으로 허용되는 경우 코드는 다음과 같습니다.

def which_lines_removed(arr = [*1..5])
  arr -= [1]
  arr -= [2] 
  arr -= [3] 
  arr -= [4] 
  arr -= [5]
end

두 방법 모두 0과 5 사이에서 삭제 된 줄 수에 대해 작동합니다.


4

자바 스크립트, 152 자 골프

function t() {
    var fa = (f + '').match(/\d/g)
    var ra = []
    for (var i = 0; i < 5; i++) {
        if (fa.indexOf(i + '') < 0) ra.push(i + 1)
    }
    return ra
}

function f() {
    0; return t()
    1; return t()
    2; return t()
    3; return t()
    4; return t()
}

골프 :

function t(){for(a=[],i=0;++i<5;)if((f+'').indexOf(i)<0)a.push(i+1);return a}function f(){
return t(0)
return t(1)
return t(2)
return t(3)
return t(4)
}

자급 자족 (그러나 추악한) :

function f() {
    0; var ra = []; for (var i = +![]; i < 5; i++) if ((f + '').match(/\d/g).indexOf(i + '') < +![]) ra.push(i); return ra
    1; var ra = []; for (var i = +![]; i < 5; i++) if ((f + '').match(/\d/g).indexOf(i + '') < +![]) ra.push(i); return ra
    2; var ra = []; for (var i = +![]; i < 5; i++) if ((f + '').match(/\d/g).indexOf(i + '') < +![]) ra.push(i); return ra
    3; var ra = []; for (var i = +![]; i < 5; i++) if ((f + '').match(/\d/g).indexOf(i + '') < +![]) ra.push(i); return ra
    4; var ra = []; for (var i = +![]; i < 5; i++) if ((f + '').match(/\d/g).indexOf(i + '') < +![]) ra.push(i); return ra
}

기본적으로 toString각 줄의 번호를 지정하여 기능 을 이용합니다 . 이 때문에 실제로 줄을 제거해야합니다 (주석을 주석 처리하면 작동하지 않습니다).

이것은 실제로 제거 된 줄 수에 대해 작동합니다 ! 제거 된 행의 배열을 반환하거나 제거되지 않은 경우 빈 배열을 반환합니다. (로 대체 return ra하여 0을 반환하도록 쉽게 변경할 수 return ra || 0있지만 실제 환경에서 더 유용하기 때문에 빈 배열 솔루션이 마음에 듭니다.)

예를 들어, 첫 번째 줄을 제거하면을 반환하고 첫 번째 줄 [1]을 제외한 모든 것을 제거하면을 반환합니다 [2,3,4,5]. (물론 모든 줄을 제거하면 작동하지 않습니다 ;-))


3

루비

def f
    a = [ 2, 3, 4, 5 ]
    defined?(a) ? a = a.select { |num|    num != 2 } : a = [ 1, 3, 4, 5 ]
    defined?(a) ? a = a.select { |num|    num != 3 } : a = [ 1, 2, 4, 5 ]
    a = a.select { |num|    num != 4 }
    (a = a.select { |num|    num != 5 }) == [] ? a = 0 : a
end

작동 방식 : 내 생각은 : 배열을 만들고 각 줄에서 특정 값을 제거하십시오. 따라서 첫 번째 줄에는 실제로 [ 1, 2, 3, 4, 5]요소가 1제거 된 배열이 있습니다. 두 번째 줄에서 a이미 정의 된 경우 요소를 제거하십시오 2. 그렇지 않으면 요소가 2제거 된 새 배열을 만듭니다 . 3 행에 대해 동일한 작업을 수행하십시오. 4 행에서 이미 배열이 작성되어 있는지 확인할 수 있으므로 element 만 제거하십시오 4. 라인 (5)에서, 첫 번째 요소를 삭제 5한 경우는 a복귀 후 빈 배열이다 0. 그렇지 않으면를 반환하십시오 a.


3

파이썬

f=lambda:{1,2,3,4,5}-{
1,
2,
3,
4,
5,
} or 0

줄을 제거하지 않으면 0을, 그렇지 않으면 제거 된 줄을 반환합니다. 0 ~ 6 번째 줄 (-)을 제외하고 1 ~ 5 줄을 제거 할 수 있습니다.


2

독립형 자바 스크립트는 0, 1, 2 개, 라인 제거 (작동 607 개  315 186 문자)

→ 라이브 데모 ←

다른 도전과 같이 JS 변수 호이 스팅 및 전역 누출

function(r){
r.shift();
r.splice(r.indexOf(2),1)
r.splice(r.indexOf(3),1);a=b=1;if(this.a&&this.b)return r
var a;r.splice(r.indexOf(4),1);b=1;if(this.b)return r
var b;r.pop();return r[0]?r:0
}

[1,2,3,4,5] 배열을 매개 변수로 사용하여 호출됩니다.

315 자

function(r){
var a;
var b;
var c;a=1;b=2;d=4;e=5;for(i in(z="abde".split("")))if(y=this[z[i]])r.push(y);return r.length?r:0
var d;a=1;b=2;c=3;e=5;for(i in(z="abce".split("")))if(y=this[z[i]])r.push(y);return r.length?r:0
var e;a=1;b=2;c=3;d=4;for(i in(z="abcd".split("")))if(y=this[z[i]])r.push(y);return r.length?r:0
}

빈 배열을 매개 변수로 사용하여 호출됩니다.



골퍼가 아닌 버전

(또한 3 줄과 4 줄을 제거해도 작동합니다) :

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

빈 배열을 매개 변수로 사용하여 호출됩니다.


2

자바 스크립트 :

var f = function(){
    1
    2
    a=[];for(i=0;i++<6;){if((f+'').indexOf(i)<0){a.push(i)}}return a.length?a:0;3
    a=[];for(i=0;i++<6;){if((f+'').indexOf(i)<0){a.push(i)}}return a.length?a:0;4
    a=[];for(i=0;i++<6;){if((f+'').indexOf(i)<0){a.push(i)}}return a.length?a:0;5
}

깡깡이


2

자바 스크립트

(function (i){

i += .1;     // line 1
i += .02;    // line 2
i += .003;   // line 3
i += .0004;  // line 4
i += .00005; // line 5

return (Math.round((.12345-i)*100000)/100000+'').match(/([1-5])/g) || 0 })(0)

당신이 좋아하는 것을 부르십시오, 그러나 나는 그것이 예쁘다고 생각합니다 .

어느 줄이 제거되었는지 (1 개 이상) 알 수 있으며, 줄이 제거되지 않으면 0이됩니다. 5 줄 을 모두 제거 할 수 있습니다.

편집하다:

내 코드가 실제로 6 줄로 구성되어 규칙을 위반할 수 있다는 점에 주목했기 때문에 다음과 같이 조정했습니다.

(Math.round((.12345 - (new (function(){

    this.i = isFinite(this.i) ? this.i + .1 : .1 ;
    this.i = isFinite(this.i) ? this.i + .02 : .02;
    this.i = isFinite(this.i) ? this.i + .003 : .003; 
    this.i = isFinite(this.i) ? this.i + .0004 : .0004;
    this.i = isFinite(this.i) ? this.i + .00005 : .00005; 

})().i || 0) )*100000)/100000+'').match(/([1-5])/g) || 0

동일하게 적용됩니다-1- All 또는 0이 아닌 제거 된 행의 배열을 반환합니다 .


그것이 도움이 될지 확실하지 않지만 다른 사람들이 그렇게하는 것을 알았습니다.
— logic8

코드 골프가 아니기 때문에 공백을 제거 할 필요가 없습니다.
— Timtech

1
"return"행은 함수 내에 있으므로 함수에는 실제로 6 개의 코드 행이 있으며 이는 챌린지 규칙을 위반합니다.
— jawns317

@ jawns317, "줄"이 어떻게 정의되어 있는지 잘 모르겠습니다. 누군가 명확한 정의를 제공해 주시겠습니까?
— logic8

@ logic8 function(){및 }(및 모든 도우미 기능)을 제거하십시오 . 줄 수를 세십시오.
— Doorknob

1

공통 리스프

(defun which-lines-are-removed (&aux (x (list 1 2 3 4 5))) 
  (setq x (remove-if #'(lambda (x) (eql x 1)) x))
  (setq x (remove-if #'(lambda (x) (eql x 2)) x))
  (setq x (remove-if #'(lambda (x) (eql x 3)) x))
  (setq x (remove-if #'(lambda (x) (eql x 4)) x))
  (setq x (remove-if #'(lambda (x) (eql x 5)) x))
)

1-4 줄을 제거하는 데 효과적입니다. 모든 행을 제거하면 아무 것도 제거하지 않은 것과 동일하게 반환됩니다.

주의 : 그 자체가 줄에 괄호를 종료하는 것은 나쁜 스타일로 간주하지만, 다른 언어 때문에이 갖는 end그리고 }나는 그것이 허용되는 가정합니다.


1

파이썬

def function(a = [1,2,3,4,5]):
    delete(a, len(a)-5)#1
    delete(a, len(a)-4)#2
    delete(a, len(a)-3);print a if len(a)==2 else '',#3
    delete(a, len(a)-2);print a if len(a)==2 else '',#4
    delete(a, len(a)-1);print a if len(a)==2 else '',#5

def delete(a, i):
    del a[i]
    return a

모든 줄에서 작동하지만 두 줄이 삭제 된 경우에만 작동합니다. 한 줄만 삭제하면 삭제 된 줄과 5 줄이 인쇄됩니다. 너무 많은 줄이 삭제되면 아무 것도 인쇄되지 않습니다.

del 키워드를; 줄과 함께 사용할 수 없으므로 도우미 기능을 사용합니다.

기본적으로 각 줄은 생성자에서 선언 된 배열에서 자신을 삭제 한 다음 충분한 행이 삭제되면 배열이 인쇄됩니다.

이 함수는 두 가지 방법으로 스펙을 놓칩니다.

  1. 그대로 실행되면 0을 인쇄하지 않습니다 (마지막 두 줄이 주석 처리 된 것으로 가정하고 4, 5를 인쇄합니다
  2. 그것은 것으로 가정 print하고 return교환 할 수있다

일 것이다 print ''하지만 여분의 개행 문자를 생성하지?
— SimonT

1

데자뷰

하나 이상의 줄을 남기지 않는 한 여러 줄을 제거하는 데 사용됩니다.

local line n:
    try:
        dup
    catch stack-empty:
        dup set{ 1 2 3 4 5 }
    delete-from swap n

func which-gone:
    line 1
    line 2
    line 3
    line 4
    line 5

0

아르 자형

R에 다른 버전이 있다고 생각합니다.하지만 도우미 기능을 사용합니다.

trick <- function(sym, value) {
  assign(sym, value, envir=parent.frame())
  values <- unlist(as.list(parent.frame()))
  if(length(values)==5) 0 else which(!1:5 %in% values)
}

reportRemovedLines <- function(){
  trick("a", 1)
  trick("b", 2)
  trick("c", 3)
  trick("d", 4)
  trick("e", 5)
}

또는 헬퍼 함수를 ​​기본 인수로 정의하여 헬퍼 함수 사용을 피할 수 있습니다 (동일하게 작동하지만 읽기 쉽지는 않지만 "별도로 정의 된"헬퍼 함수를 ​​사용하지 않습니다).

funnyVersion <- function(trick = function(sym, value) {
  assign(sym, value, envir=parent.frame())
  values <- unlist(as.list(parent.frame()))
  if(length(values)==5) 0 else which(!1:5 %in% values)
}){
  trick("a", 1)
  trick("b", 2)
  trick("c", 3)
  trick("d", 4)
  trick("e", 5)
}

모두 reportRemovedLines()와 funnyVersion()라인의 수와 작업 제거 - 모든 라인을 제거하는 경우 (이 경우, 그들은 반환을 제외하고 NULL). 그들은 실제로 돌아온다 는 인쇄하지 않고 줄 번호를 합니다. R에서와 같이 함수 내에서 평가 된 마지막 표현식의 값이 자동으로 반환됩니다.

어떻게 작동합니까? 트릭은 trick"상위 환경"(즉, 호출하는 함수의 환경)에서 모든 객체를 가져 와서 벡터에 값을 넣고 1에서 5까지의 값을 나타내지 않는 함수에 있습니다.


0

자바 스크립트 (136/166 자)

처음에 일부 값이 선언 된 더 작은 버전 :

function(){b=[1,2,3,4,5],i=0
    b.splice(0,1);i++
    b.splice(1-i,1);i++
    b.splice(2-i,1);i++
    b.splice(3-i,1);i++
    b.splice(4-i,1);i++
return b}

자체 포함 된 버전 (아무것도 전달할 필요가 없습니다-b 인수가 있으므로 b가로 정의되어 있는지 확인할 수 있습니다 ||)

function(b){
    b=[2,3,4,5],i=1
    b=b||[1,2,3,4,5],i=i||0,b.splice(1-i,1);i++
    b=b||[1,2,3,4,5],i=i||0,b.splice(2-i,1);i++
    b.splice(3-i,1);i++
    b.splice(4-i,1);i++
return b}

예, 둘 다 return진술이 있지만 암묵적으로 귀국하는 언어와 경쟁하는 경우에만 공평합니다.


사실, 해당 언어에서는 더 쉽지만 JS에서는 불가능하지 않습니다. 136 문자 버전은 함수 내에 7 줄의 코드가 있고 166- 문자 버전은 6 개이기 때문에이 중 하나가 도전의 제약 조건을 충족한다고 생각하지 않습니다. 여는 괄호와 닫는 괄호와 같은 줄에 코드가 있다는 사실이 코드가 함수의 일부가 아님을 의미하지는 않습니다.
— jawns317

도우미를 사용하는 답변은 어떻습니까?
— Bobby Marinoff

도우미 기능은 명시 적으로 허용됩니다. 그러나 행을 제거하는 함수에는 5 줄의 코드가 포함되어야합니다.
— jawns317

0

아르 자형

간단한 버전 (5 행을 제거하면 오류가 발생하므로 절대 아닙니다) :

doit <- function() setdiff(1:5, c(
       1,
       2,
       3,
       4,
       5
    ))

그리고 멍청한 버전 :

doit<-function() setdiff(1:5, scan(text="
1
2
3
4
5
"))

여러 줄을 제거하고 (모든 줄을 제거하는 경우 제외) 작동하며 5 줄 이상으로 쉽게 확장 할 수 있습니다. "있는 그대로"실행하면 integer(0)개념적으로 리턴 하는 것과 비슷하게 리턴 0됩니다. 실제 0을 반환하면 추악하고 길어 지지만 복잡하지는 않습니다.

마지막으로, 마술을 사용하는 버전 :

도우미 기능 :

dysfunction <- function(E){
    FUN <- function(){}
    e <- substitute(E)
    e[[1]] <- as.name("list")
    nb <- quote(setdiff(as.list(1:5), x))
    nb[[3]] <- e
    body(FUN) <- nb
    FUN
    }

실제 기능 :

df <- dysfunction({
1
2
3
4
5
})

0

C ++

void function(int & i)
{
        i=i|1;
        i=i|2;
        i=(i|4);
        i=(i|8);
        i=(i|16);
} 


int[] func2(int i)
{
    int arr[]={0,0};
    int k=0,l=1;
    for(int j=1;j<=16;j*=2,l++)
    {
        if((i&j)==0)
        {
             arr[k++]=l;
        }
    }
    return arr;
}

사용 방법 : i로 함수를 호출하고 func2를 사용하여 어떤 함수가 말하는지 이해하십시오.

int arr [] = {0,0} 행을 int arr [] = {0,0,0,0,0} 행으로 변경하면 다섯 줄 모두에 대해 작동하며 한 줄을 한 줄씩 제거하여 테스트 사례를 제거합니다. 자동으로, 내가하고있는 일은 단순히 변수의 비트를 각 줄의 플래그로 사용하는 것입니다.


하지 않습니다 function여섯 줄이 아니라 다섯 있나요?
— Cel Skeggs

반환은 그것의 언어 의존성 .... u는 다른 답변을 볼 수있다, 그것의 일부가 아닌
— zeeshan이 mughal

다른 항목 중 하나에 대한 도전 과제 작성자 의이 의견 을 참조하십시오 . "참으로, 해당 언어에서는 더 쉽지만 JS에서는 불가능하지 않습니다.이 두 가지 중 어느 것도 도전의 제약 조건을 충족한다고 생각하지 않습니다. 136 문자 버전에는 함수 내에 7 줄의 코드가 있고 166- 문자 버전에는 6 줄이 있습니다. 여는 괄호와 닫는 괄호와 같은 줄에 코드가 있다고해서 코드가 포함되지 않는다는 의미는 아닙니다 – jawns317 "
— Cel Skeggs

지금 확인하고 나에게 UR responce 알
— zeeshan이 mughal

C는 그렇게 작동하지 않습니다. 컴파일러 오류가 발생합니다. 아마도 당신은 C ++을 생각하고있을 것입니다.
— Cel Skeggs
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.