どの行が削除されたかを知らせる関数を作成します


19

、私の前のコードの挑戦、私はその行のどれが削除されたかを示します関数を記述することができ尋ねました。

手順は次のとおりです。

5行を含む関数を作成します。

関数をそのまま実行すると、0が返されます。

5行のいずれかを削除して関数を実行すると、削除された行がわかります(たとえば、最後の行を削除すると5が返されます)。

さて、少し難しいものを試してみましょう。

上記と同じ規則に従いますが、今回は、どのTWO行が削除されたかを伝える配列を関数が返す必要があります。

たとえば、1行目と5行目を削除すると、戻り値は[1,5]になり、3行目と4行目を削除すると、戻り値は[3,4]になります。

繰り返しますが、行が削除されない場合、関数は0を返す必要があります。1行削除されたケースも処理できる場合はボーナスポイントになりますが、必ずしもそうする必要はありません。

ヘルパー関数を利用できますか?はい、ただし必要な場合のみ。これを実現する単一の自己完結型関数が理想的です。

最後の課題と同様に、最も高い投票されたソリューションが勝ちます。1週間以内に勝者を選びます。24時間以内に新しい提出物が届かない場合はすぐに選びます。


2
何の行が削除されていない、またはそれがない場合は空のリストのOKを返して持っ数0であることを?
イルマリカロネン

1
関数の戻り行は削除可能な行の1つですか?
le_vine

11
明日、バージョン「3行」が掲載されることを期待できますか?
ハワード

関数は文字通り配列を返す必要がありますか、それともグローバルスコープなどの変数を編集できますか?私はこれが5行で可能だとは思いませんが、実際には戻ってくるので、すべての行が戻る必要があるので、戻りが削除された場合に戻る必要があります。私が知らない自動復帰関数のようないくつかの言語の癖がない限り。
ジョージリース

興味があり、見たことがない人については、前の質問へのリンクも提供すべきだと思います。
DroidDev

回答:


17

Perl

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行以上に簡単に拡張できます。ヘルパー関数は使用されず、1行につき1つのステートメントのみを使用します。明示的なreturnステートメントがない場合、Perl関数の戻り値はその中の最後のステートメントの値であるという事実に依存しています。

(リストコンテキストで)行が削除されていない場合、このコードは0ではなく空のリストを返すことに注意してください。これは修正できますが(たとえば@a ? @a : 0;、最後の行に" "を追加することにより)、コードが見苦しくなります。いずれにせよ、スカラーコンテキストで、削除された行の数を返します。行が削除されていない場合は、0になります。;-)


9

ルビー

Perlバージョンに似ていますが、Rubyにあります。要求どおりに行が削除されない場合は0を返しますが、コードがcodeくなり、戻り値としては意味をなさないことに同意します。

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

JavaScript、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 rareturn 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削除されたarrayが実際にあります。2行目で、a既に定義されている場合、要素を削除します2。それ以外の場合は、要素を2削除して新しい配列を作成します。3行目でも同じことを行います。4行目では、配列が既に作成されていることが確認できるため、elementを削除するだけ4です。5行目では、最初にelementを削除し5aそれが空の配列である場合、を返し0ます。そうでなければ、を返しaます。


3

Python

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

行が削除されない場合は0を返し、それ以外の場合は削除された行を返します。0〜6行目を除く1〜5行を削除できます;-)。


2

JavaScript、自己完結型、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

JavaScript:

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

Javascript

(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-至るまで削除された行の配列が返されますすべてなした場合または0を。


それが助けになるかどうかはわかりませんが、他の人がそれをやっていることに気付きました。
logic8

コードゴルフではないので、空白を削除する必要はありません。
ティムテック

1
「戻り」行は関数内にあるため、実際には関数には6行のコードが含まれており、チャレンジのルールに違反しています。
jawns317

@ jawns317、「ライン」がどのように定義されているかわかりません。誰かが明確な定義を提供してもらえますか?
logic8

@ logic8 Remove function(){および}(およびすべてのヘルパー関数)。行数を数えます。
ドアノブ

1

Common Lisp

(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行の削除に使用できます。すべての行を削除すると、何も削除しない場合と同じ結果が返されます。

NB:それ自身の行に終了括弧があることは悪いスタイルと見なされますが、他の言語が持っているのでend}私はそれが許されると思います。


1

Python

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

これはすべての行で機能します-ただし、2つが削除されている場合のみ 1行のみが削除されると、削除された行と5行目が印刷されます。削除される行が多すぎると、何も印刷されません。

delキーワードは;を含む行では使用できないため、これはヘルパー関数を使用します(私の知る限り)

基本的に、各行は、コンストラクターで宣言されている配列内で自分自身を削除し、十分な行が削除された場合、配列が出力されます。

この関数は、次の2つの点で仕様を逃しています。

  1. そのまま実行した場合は0を出力しません(最後の2行がコメントされていると想定し、4、5を出力します
  2. それを想定してprintおりreturn、交換可能です

やってますprint ''けれども、余分な改行文字を生成しませんか?
SimonT

1

既視感

任意の数の行を削除するために機能します(少なくとも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

私は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

JavaScript(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 14年

ヘルパーを使用する回答はどうですか?
ボビーマリノフ14年

ヘルパー関数は明示的に許可されています。ただし、行を削除する関数には5行のコードが含まれている必要があります。
jawns317 14年

0

R

単純なバージョン(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)と、概念的にはjustを返すのと同じように戻ります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}に変更すると、5行すべてでも機能します。また、1行のテストケースを削除することもできます。自動的に、私がしていることは、各行のフラグとして変数のビットを使用することです...


しないfunction6行ではなく、5を持っていますか?
セルスケッグス14年

リターンはその一部ではありません。他の回答も見ることができます。...言語依存性
-zeeshan mughal 14

他のエントリのいずれかで、チャレンジの作者からのこのコメント参照してください。「確かに、これらの言語では簡単ですが、JSでは不可能ではありません。 136文字バージョンには関数内に7行のコードがあり、166文字バージョンには6行があります。開き括弧または閉じ括弧と同じ行にコードがあるという事実は、コードが機能。– jawns317 "
セルスケッグス2014年

今すぐ確認して、あなたの応答を教えてください
-zeeshan mughal 14

Cはそのようには機能しません。コンパイラエラーが発生します。おそらくC ++のことを考えているのでしょう。
セルスケッグス14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.