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


28

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

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

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

簡潔さ、斬新さ、優雅さはすべて考慮に値します。最も高い投票されたソリューション(妥当な時間の後)が勝ちます。


4
関数はパラメーターを取ることができますか?
ジェレミー

6
この種の言語を使用する場合、関数宣言は行の1つとしてカウントされますか、それとも本文のみがカウントされますか?
meiamsome

1
また、回線には1、2、3、4、5の番号を付ける必要がありますか?
13

@ジェレミー、はい、大丈夫です。
jawns317

@meiamsome、本文のみがカウントされ、戻り値のために行に1、2、3、4、5の番号を付ける必要があります。
jawns317

回答:


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がない場合、変数「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 aした後returnですか?理論的には、到達すべきではありません。
ブレーデンベスト

@ B1KMusic、実際には、JavaScript変数ホイストと呼ばれるものが原因で「到達」しています。JSが「コンパイル」されると、すべての「var」宣言は、それらが含まれる関数の先頭に事実上配置されます。
xem 14

うーん、それは奇妙です。言語でこれを実用的に使用していますか、それとも純粋にゴルフ/エクスプロイトですか?Mozillaのドキュメントで、変数の巻き上げについて何も読んだことを覚えていません。
ブレーデンベスト

これはJSの機能です。ここで説明:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
XEM

ああ、それはゴルフのエクスプロイトです。
ブレーデンベスト

6

Python

パラメータが許可されている場合、これは機能します:

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を返します。数学的な演算子のため、論理値は数値に変換されます。4行目の括弧は、結果を目に見える形で返すことを可能にします(最後のコマンドの場合)。


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
  • 2番目の場合、 return 7-5
  • 3番目の場合、 return 7-2-2
  • 4番目の場合、 return 7-2-1
  • 5番目の場合、 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;
}

このチャレンジは本当に楽しかったです、ありがとう!:)


古い答え

数学を使って解決しました。各変数が不明と見なされ、1行に1つの宣言を行う場合、5つの不明と5行のコードがあります。これにより、次の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

1

蜜蝋、86バイト

私が最初に発明したエソランを試してみる。最初の混乱の後、私は解決策が非常に簡単であることがわかりました。

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

説明:

蜜蝋プログラムは、2D六角形グリッドで動作します。プログラムは長方形の形式で保存されます。

    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 行1が欠落している場合に備えて別のIPを作成し、IPを減速して行1からのIPが先にあることを確認し、2を追加してから行3にリダイレクトします

> >~3+p 3を追加し、4行目にリダイレクトします

> >~4+X@7~8+~@$^^{; 4を追加してから、2番目のlstack値を15に設定し、lstack topと2番目の値をXORし、IPを遅くし(5行目が存在する場合は5行目のIPが先になるようにします)、結果を出力し、プログラムを終了します。

> >~5+@7~8+~@${; 5を追加してから、4行目と同じ操作を行いますが、速度が低下します。

基本的に、プログラムは合計xor 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で書かれた私の蜜蝋インタプリタのクローンを作成できます

GitHubのreadmeは、esolangsページよりも最新であり、構造が優れています。



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

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


0

バッシュ、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行目まではすべて簡単です。その後、最終行がなくなったかどうかを検出する必要があります。これは、許可された関数パラメーターを利用して、1回再帰的に呼び出して、5行目で失敗するように指示されたときに独自の成功値をテストし、5行目が削除されると4行目が戻ります5

(注:関数以外をすべて削除し、空白を削除し、/ bin / bashを/ bin / shに変更する場合、最小で131文字になります)


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)+"*");
};
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.