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


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.