禁止されているビルトイン


52

では、標準の抜け穴、以下をさ禁じ

答えが「MyOwnLanguage」で書かれていると主張する場合、コマンドxは「一連の数字を読み取り、3つのグループに分割し、2番目の数字が最初の数字よりも小さいグループの最後の数字を出力する」ことを意味します

ここでは、まったく同じことを行います。

仕事

長さが3で割り切れる正の整数のシーケンスが与えられた場合、それらを3つのグループに分割し、2番目の数値が最初の数値よりも小さいグループの最後の数値を出力します。

テストケース

Input               Output
[]                  []
[1,2,3,4,5,6,7,8,9] []
[2,1,3,5,4,6,8,7,9] [3,6,9]
[3,1,4,1,5,9,2,6,5] [4]
[100,99,123]        [123]
[123,123,456]       []
[456,123,789]       [789]

得点

これはです。バイト単位の最短回答が優先されます。

標準の抜け穴が適用されるため、xこのタスクを実行する組み込みコマンドを使用しないでください。


31
うーん...今、私は本当にコマンドを作成MyOwnLanguageして追加したいと思いxます...:P
DJMcMayhem

6
*ビルトインを持たないことを覚えておいてください*‽まあ、すでに持っているなら、それを使うことができますよね?
アダム

2
@Adám標準の抜け穴によれば、xその機能を実行する組み込みの言語を使用することはできません。
リーキー修道女

34
@LeakyNunはい、できます。チャレンジのためにそのような言語を作ることはできません。あなたの言語が課題よりも前のものであれば、それは受け入れられます。
アダム

9
builtinを呼び出すと、p使用できますか?
マインドウィン

回答:



13

ゼリー9 8バイト

>Ḋm3T×3ị

オンラインでお試しください!

使い方

>Ḋm3T×3ị  Main link. Argument: A (array)

 Ḋ        Dequeue; yield A without its first element.
>         Compare the elements of A with the elements of the result.
  m3      Select each third element, starting with the first.
    T     Truth; get all indices of truthy elements.
     ×3   Multiply those indices by 3.
       ị  Unindex; retrieve the elements at the redulting indices.

12

Haskell、30 29バイト

x(a:b:c:l)=[c|b<a]++x l
x d=d

Haskellでゴルフをするのは初めてでした。

@JulianWolfのおかげで-1バイト


4
素敵な答え!関連するヒントについては、codegolf.stackexchange.com / a / 60884/66904を参照してください。特に、1つx d=dのバイトを節約できるように、2つの定義を交換し、2番目の(今は最初の)を書く
Julian Wolf

賢い!私は事前にその答えを閲覧しましたが、定義が変数を再利用した部分を見逃していたはずです

11

Mathematica、37バイト

これが仕様を満たしていると仮定すると、ngenisisはこのアプローチが1バイトの節約につながることを称賛しています!

BlockMap[If[#>#2,Print@#3]&@@#&,#,3]&

純粋な機能。BlockMap[...,#,3]&入力リストを長さ3のサブリストに分割し、関数で各サブリストを操作しますIf[#>#2,Print@#3]&@@#&。その結果、適格な最後の各番号が出力されます。この関数は値(つまりNull、入力リストと同じ長さのsa 3番目のリスト)も返しますが、これは許可されている動作のようです。

Mathematica、42 38バイト

4バイトを節約してくれたMartin Enderに感謝します!

Cases[#~Partition~3,{a__,b_}/;a>0:>b]&

純粋な機能。#~Partition~3あなたが思うことをします。pattern Cases[X,P:>Q]X一致するすべての要素を選択し、各インスタンスに適用されPた変換ルールの結果を返し:>Qます。ここで、一致するパターンは{a__,b_}/;a>0b_リストの最後の要素とa__他のすべての要素(この場合は最初の2つ)に一致します。それらyを呼び出して、z今のところ。a>0その後、sneaky はに展開されますy>z>0。これは、適用するテストです(仕様ではすべてが正の整数になると言われているため有効です)。そして、変換ルールは:>b、一致する各順序付きトリプルをその最後の要素に単純に置き換えます。

元の提出:

Last/@Select[#~Partition~3,#.{1,-1,0}>0&]&

純粋な機能; #.{1,-1,0}3要素の各サブリストの最初の要素と2番目の要素の差を計算する以外は、かなり単純な実装です。


3
ドット積はきれいですが、#>#2&@@#&短いです。しかし、全体的にはだ、まだ使用して短いCasesの代わりにSelectCases[#~Partition~3,{a__,b_}/;a>0:>b]&
マーティン・エンダー

a>0:>それには2種類の魔法があります!
グレッグマーティン

BlockMapここで興味をそそられています。
-ngenisis

BlockMap[If[#>#2,#3,Nothing]&@@#&,#,3]&動作し、わずか39バイトです...数バイト節約できますか?
グレッグマーティン

1
BlockMap[If[#>#2,Print@#3]&@@#&,#,3]&間違いなく仕様を満たしている
-ngenisis

8

Pyth、10バイト

eMf>FPTcQ3

テストスイート

eMf>FPTcQ3
       cQ3    Chop the input into groups of size 3
  f           Filter on
     PT       All but the last element
   >F         Apply the greater than function
eM            Map to the last element


5

Brachylog(2)、14バイト

~c{Ṫ}ᵐ{k>₁&t}ˢ

オンラインでお試しください!

Brachylogは、この種の問題にかなり苦労しています。このプログラムは、入力を3つのグループ(「グループに分割」ビルトインを持たない)に強引に分割するので、計算が非常に複雑です。4つのグループではすばやく実行されますが、5つのグループでは非常に遅くなります。

説明

~c{Ṫ}ᵐ{k>₁&t}ˢ
~c              Split into groups
  { }ᵐ          such that each group
   Ṫ            has three elements
      {     }ˢ  then on each element, skipping that element on error:
       k          with the list minus its last element
        >₁        assert that it's strictly decreasing
          &       and with the original list
           t      keep only its last element

それl÷₃;?ḍ₍はより速い代替案であることに言及する価値があるかもしれません。
リーキー修道女

私はそれを以前の試みで使用しました(使用し/ません÷;それらはここでは同等です)が、それは1バイト長いので、ゴルフをしている間にそれを捨てました。

4

J、14バイト

_3&(>`[/\#]/\)

これは、単項動詞に評価されます。 オンラインでお試しください!

説明

_3&(>`[/\#]/\)  Input is y.
_3&(    \    )  For each non-overlapping 3-element chunk of y,
    >`[/        check if first element is greater than second.
                Call the resulting array x.
_3&(        \)  For each non-overlapping 3-element chunk of y,
          ]/    take the last element.
         #      Keep those where the corresponding element of x is 1.

4

アリス12 11バイト

1バイトを節約してくれたLeoに感謝します。

I.h%I-rI~$O

オンラインでお試しください!

文字列のコードポイントを入力リストとして使用し、保持する必要がある出力に対応する文字を出力します。

説明

I      Read x. Pushes -1 on EOF.
.h%    Compute x%(x+1). This terminates the program due to division by zero at EOF,
       but does nothing for non-negative x.
I      Read y.
-      Compute x-y. We only want to output z is this is positive.
r      Range. Pushes 0 1 ... n for positive n, and -n ... 1 0 for negative n
       (and simply 0 for n = 0). So this results in a positive number on top
       of the stack iff x-y is positive.
I      Read z.
~      Swap it with x-y > 0.
$O     Output z iff x-y > 0.
       Then the IP wraps to the beginning of the program to process the next triplet.

r代わりにを使用して1バイトをゴルフできexます。TIO-
レオ

@Leoそれは素晴らしいです、ありがとう!
マーティンエンダー


3

dc、30バイト

[???sAz1[[lAps.]s.<.dx]s.<.]dx

I / O:行ごとに1つの番号。



3

CJam、15バイト

{3/{)\:>{;}|}%}

スタック上の引数を期待し、結果をスタックに残す匿名ブロック。

オンラインでお試しください!(すべてのテストケースを実行)

説明

3/             e# Split the list into length-3 chunks.
  {            e# For each chunk:
   )           e#  Remove the last element.
    \:>        e#  Reduce the first 2 elements by greater than.
       {;}|    e#  If the first is not larger than the second, delete the third.
           }%  e# (end for)

3

Brain-Flak、82バイト

{([({}[{}()]<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}{{}((<({}<>)<>>))}{}{}}<>

オンラインでお試しください!

# Until the stack is empty (input is guaranteed to not contain 0)
{

  # Push 1 for greater than or equal to 0
  ([({}[{}()]<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}
  #  ^------^  This part is Top - (Second + 1)

  # If the second number was less than the first...
  {{}

     # Get ready to push 2 zeros
     ((<

       # Move the next number to the other stack
       ({}<>)<>

     # Push those 2 zeros
     >))}

     # Pop 2 values.
     # This is either 2 zeros, or a 0 and a "last number" that shouldn't be printed
     {}{}

# End loop
}

# Switch to the stack where we stored the numbers to be printed
<>

3

ゼリー、10バイト

s3µṪWx>/µ€

オンラインでお試しください!

または

テストケースを検証する

@LeakyNunのおかげで-3バイト

説明

s3µṪWx>/µ€
s3         - split into groups of three
  µ     µ€ - on each group, do:
   ṪW      - return the third element as the only element of a list
     x     - repeat each element in that list the number of times
      >/   - corresponding to 1 if the second element of the group is greater than the first; 0 otherwise.



3

R、37バイト

scan()好きではないバージョンですが、短くなります。

x=scan();x[(i<--1:1)>0][x[!i]<x[i<0]]

function()テストしやすいバージョン(41バイト)

f=function(x)x[(i<--1:1)>0][x[!i]<x[i<0]]

@Giuseppeに感謝します!インデックスのリサイクルを使用することをお勧めします。

テスト:

f(c())
f(c(1,2,3,4,5,6,7,8,9))
f(c(2,1,3,5,4,6,8,7,9))
f(c(3,1,4,1,5,9,2,6,5))
f(c(100,99,123))
f(c(123,123,456))
f(c(456,123,789))

出力:

> f(c())
NULL
> f(c(1,2,3,4,5,6,7,8,9))
numeric(0)
> f(c(2,1,3,5,4,6,8,7,9))
[1] 3 6 9
> f(c(3,1,4,1,5,9,2,6,5))
[1] 4
> f(c(100,99,123))
[1] 123
> f(c(123,123,456))
numeric(0)
> f(c(456,123,789))
[1] 789

あなたが読んでx使用して標準入力からでx=scan()始まるの代わりに、関数を定義する時、あなたは、単に設定することができますi=c(1,2,0)論理的インデックスはすなわちリサイクルを取得するので、x=scan();i=c(1,2,0);x[!i][x[i>1]<x[i==1]]
ジュゼッペ・


ありがとう@Giuseppe!x=scan()入力が非常に面倒になるため、私はこのアプローチが好きではありません。そして、私はそれを再現可能にすることはできません。
-djhurio

2
正しいですが、目標は可能な限り短いコードを生成することです。残念なことに、他の誰かがより良い解決策を見つけました!
ジュゼッペ

ねえ、私も使用する考えを持っていたmatrix()が、どういうわけか私はそれがそんなに短くすることが可能であると信じていなかった。
-djhurio

3

JavaScript(ES6)、46 44 42 41 39バイト

a=>a.filter((_,y)=>y%3>1&a[y-1]<a[y-2])
  • Neilのおかげで2バイト節約できました。

それを試してみてください

スペースなしで、コンマで区切られた数字のリストを入力します。

f=
a=>a.filter((_,y)=>y%3>1&a[y-1]<a[y-2])
i.oninput=_=>o.innerText=JSON.stringify(f(i.value.split`,`.map(eval)))
console.log(JSON.stringify(f([])))                  // []
console.log(JSON.stringify(f([1,2,3,4,5,6,7,8,9]))) // []
console.log(JSON.stringify(f([2,1,3,5,4,6,8,7,9]))) // [3,6,9]
console.log(JSON.stringify(f([3,1,4,1,5,9,2,6,5]))) // [4]
console.log(JSON.stringify(f([100,99,123])))        // [123]
console.log(JSON.stringify(f([123,123,456])))       // []
console.log(JSON.stringify(f([456,123,789])))       // [789]
<input id=i><pre id=o>


説明

a=>              :Anonymous function taking the input array as an argument via parameter a
a.filter((_,y)=> :Filter the array by executing a callback function on each element,
                  with the index of the current element passed through parameter y.
                  If the function returns 0 for any element, remove it from the array.
y%3>1            :Check if the modulo of the current index is greater than 1.
                  (JS uses 0 indexing, therefore the index of the 3rd element is 2; 2%3=2)
&                :Bitwise AND.
a[y-1]<a[y-2]    :Check if the element at index y-1 in array a
                  is less than the element at index y-2
)                :End filtering method

1
DOESのy%3>1&a[y-1]<a[y-2]作品?
ニール

取り消し線44はまだ44
ローマングラフ

@RomanGräf、どういう意味ですか?
シャギー


「Arial」、「Helvetica Neue」、Helvetica、sans-serif」のバグ
@Romanを

3

、8バイト

ṁΓȯΓ↑<C3

オンラインでお試しください!

説明

このプログラムは少し複雑ですので、ご容赦ください。

ṁΓȯΓ↑<C3  Implicit input (list of integers).
      C3  Split into slices of length 3.
ṁ         Map over slices and concatenate results
 ΓȯΓ↑<    of this function, explained below.

この関数ΓȯΓ↑<は、長さ3のリストを取りますx = [a,b,c]。最初のものはand にΓ分割xされa[b,c]それらを関数への引数として送りますȯΓ↑<。これは、と等価である必要があり((Γ↑)<)ますが、通訳のバグ/機能のために、それは実際に同等だ(Γ(↑<))の組成物として解釈され、Γそして↑<。今、a部分的アプリケーションを使用して、後者の機能に供給され、結果として得られる関数は↑<aに与えられるΓ解体れ、[b,c]中にb及び[c]。次にbに渡され↑<ab<aリストから最初の要素を取得する関数が作成されます。この関数は最終的にに適用され[c]ます; 結果は[c]if a>bであり、[]そうでなければ。これらのリストは連結されて最終結果を形成し、暗黙的に印刷されます。

「機能」がなければ、9バイトになります。

ṁΓoΓo↑<C3


2

MATL、10バイト

IeI&Y)d0<)

結果は、スペースで区切られた数字として表示されます。

オンラインでお試しください!

または、すべてのテストケースを確認します。これにより、出力の文字列表現が表示されるため、空の配列は実際にはとして表示され[]ます。MATLでは、数値はシングルトン配列と同じであるため、[4]と表示されることに注意してください4

説明

Ie    % Implicit input. Reshape as a 3-row matrix (column-major order)
I&Y)  % Split into the third row and a submatrix with the other two rows
d     % Consecutive difference along each column of the submatrix
0<    % True for negative values
)     % Use as logical index into the original third row. Implicitly display

2

ローダ、15バイト

{[_3]if[_2<_1]}

ローダはゴルフ言語とほぼ同じくらい短い...

これは、ストリームから3つの値を取得し_3、2番目(_2)が1番目()より小さい場合、3番目()をプッシュバックし_1ます。

アンダースコアはforループの構文シュガーであるため、プログラムは{{[a]if[b<c]}for a,b,c}またはとして記述することもできます{[a]for a,b,c if[b<c]}

何らかの理由でTIOで動作しないため、TIOリンクはありません(ただし、チャレンジより前のRödaの最新バージョンで動作します)。


2

Java 7、86 85バイト

void c(int[]a){for(int i=-1;++i<a.length;)if(a[i++]>a[i++])System.out.println(a[i]);}

@ PunPun1000のおかげで-1バイト

説明:

ここで試してみてください。

void c(int[]a){                  // Method with integer-array parameter and no return
  for(int i=-1;++i<a.length;)    //  Loop over the array in steps of three at a time
    if(a[i++]>a[i++])            //   If the value of the current index is larger than the next:
      System.out.println(a[i]);  //    Print the value on the third index
                                 //  End of loop (implicit / single-line body)
}                                // End of method

@ PunPun1000これで、反復は3ではなく2だけ増加したため、誤った結果が得られました(3,9テストケースの1,2,3,4,5,6,7,8,9ように3,6,9)。
ケビンCruijssen

1
@Kevin_Cruijssenおっとあなたは正しい。ただし、インクリメント演算子を使用してバイトを保存することもできます。-1から始める必要があります。オンラインで試してください!
PunPun1000

@ PunPun1000ああ、あなたは正しい、いいキャッチ。ありがとう!
ケビンCruijssen

2

C#、126バイト

using System.Linq;i=>Enumerable.Range(0,i.Length/3).Select(u=>3*u).Where(u=>i[u]>i[u+1]).Select(u=>i[u+2]);

メソッドを含むプログラム全体が必要な場合は、175バイトになります。

using System.Linq;namespace S{class P{static System.Collections.IEnumerable X(int[]i)=>Enumerable.Range(0,i.Length/3).Select(u=>3*u).Where(u=>i[u]>i[u+1]).Select(u=>i[u+2]);}}

TheLethalCoderの助けを借りて7バイトを保存


あなただけ...それらを印刷することができます
漏れ修道女

@LeakyNunもちろんできます-でもどうしてですか?私はそれが必要であるかどうかを尋ねました、それはそうではありません、そして、それは私が推測するより多くのバイトでしょう。
メタコロン

(int[]i)iタイプが不要になるだけです。
TheLethalCoder

@TheLethalCoderが更新しました。
メタコロン

@MetaColon中括弧も必要ありません(i)
TheLethalCoder


1

CJam、16バイト

q~3/{~@@>S{;}?}%

出力は、スペースで区切られた数値として表示されます。

オンラインでお試しください!

説明

q~               e# Read input list
  3/             e# List of sublists of length 3
   {         }%  e# Apply this to each sublist
    ~            e# Push sublist contents: 3 numbers
     @@          e# Rotate twice. This moves first two numbers to top
       >         e# Greater than?
        S{;}?    e# If so: push space (used as separator). Else: pop the third number
                 e# Implicitly display


1

JavaScriptの、108の 107 108バイト

これは有効なJS匿名(ラムダ)関数です。x=最初に追加して、のように呼び出しx([5,4,9,10,5,13])ます。functionとして出力しますreturn

a=>(y=[],a.map((c,i)=>(i+1)%3?0:y.push(a.slice(i-2,i+1))),y.map(v=>v[1]<v[0]?v[2]:null).filter(c=>c|c==0))

スニペットは、入力をコンマ区切りの整数のリストとして受け取ります。

x=a=>(y=[],a.map((c,i)=>(i+1)%3?0:y.push(a.slice(i-2,i+1))),y.map(v=>v[1]<v[0]?v[2]:null).filter(c=>c|c==0))
martin.oninput = e => { dennis.innerHTML = x(martin.value.split`,`.map(c=>parseInt(c,10))) }
<input type=text id=martin><pre id=dennis>


長いソリューションを掲示し、使用してのポイントは何であるmartindennisidとは?
リーキー修道女

@LeakyNun Shaggyは私の作業中に彼のソリューションを投稿しました。しかし、ソリューションを投稿しない理由はありません。名前をIDとして使用することに関しては、面白いと思いました。
アルジュン

これは機能しません[5,4,9,10,5,13]
シャギー

@Shaggyこれは、テストケーススニペットの実装に関する問題でした。ソリューションに問題はありません。実際、入力要素の値は常に文字列です。したがって、文字列を分割する,と、数字ではなく文字列の配列になります!解決策はまったく問題ありません。テストケーススニペットのみが間違っていました。今、それを修正しました。それを指摘してくれてありがとう!:)
アルジュン

ああ、そう、それが問題を説明しています!ありがとう、あなたを、@Arjunを。
シャギー

1

Perl5.8.9、73の 60バイト

while(@F){@b=splice@F,0,3;$b[1]<$b[0]&&print$b[2]}print"-"

(ファイル全体を読み取るための 'n'フラグと自動分割を行う場合は58 + 2)。入力はスペースで区切られた数字の行であると仮定します

ダダのおかげで削減。可視性のために最後に印刷を含めると、そうでなければ8バイト節約されます。


良いですね!+1にふさわしい!
アルジュン

出力形式は非常に柔軟であるため、実際print"\n"に最後に配置する必要はありません。また、$b[1]<$b[0]&&print"$b[2] "while@b=splice@a,0,37バイトを節約することもできます。最後に、実行する-a代わりにflag を使用できます@a=split(同じことを自動的に行い、結果をの@F代わりに保存し@aます)。Perl 5.8.9では、-na最近のPerlでは-a十分です。これで47〜48バイトになります。
ダダ

ああ、私は-aについて知らなかった。私はまだ出力がそうでなければ、かなりincomprehensbileで、私が入力1行に1つの出力ラインをやるべきだと思う
トム・タナー


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