この文字列をいくつまでカットできますか?


45

実際の行で前後に折り畳まれた文字列(「ロープ」のように、「文字の束」のようにではない)を考えてください。文字列の形状を、通過するポイントのリストで(順番に)記述できます。簡単にするために、これらのポイントはすべて整数であると仮定します。

例として[-1, 3, 1, -2, 5, 2, 3, 4]考えます(各エントリがフォールドを意味するわけではないことに注意してください):

ここに画像の説明を入力してください

垂直方向に沿って延びる文字列は、視覚化のみを目的としています。文字列がすべて実際の線上に平らになっていると想像してください。

ここで問題があります:この文字列は、1つのカット(上記の写真では垂直でなければなりません)でカットできるピースの最大数です。この場合、答えは6で、2との間にカットがあり3ます:

ここに画像の説明を入力してください

あいまいさを避けるため、切り取り非整数位置で実行する必要があります。

挑戦

文字列が折り返される整数位置のリストが与えられた場合、非整数位置での単一カットで文字列を切り取ることができるピースの最大数を決定します。

完全なプログラムまたは関数を作成できます。STDIN、コマンドライン引数、プロンプトまたは関数パラメーターを介して入力を受け取ることができます。出力をSTDOUTに書き込んだり、ダイアログボックスに表示したり、関数から返すことができます。

リストは便利なリスト形式または文字列形式であると想定できます。

リストには、少なくとも2から100までのエントリが含まれます。エントリは整数、範囲内の各あろう-2 31 ≤P I <2 31。2つの連続したエントリが同一ではないと想定できます。

コードは、合理的なデスクトップPCで10秒未満でそのような入力(以下のテストケースを含む)を処理する必要があります。

テストケース

すべてのテストケースは、単に入力の後に出力が続きます。

[0, 1]
2

[2147483647, -2147483648]
2

[0, 1, -1]
3

[1, 0, -1]
2

[-1, 3, 1, -2, 5, 2, 3, 4]
6

[-1122432493, -1297520062, 1893305528, 1165360246, -1888929223, 385040723, -80352673, 1372936505, 2115121074, -1856246962, 1501350808, -183583125, 2134014610, 720827868,  -1915801069, -829434432, 444418495, -207928085, -764106377, -180766255, 429579526,  -1887092002, -1139248992, -1967220622, -541417291, -1617463896, 517511661, -1781260846,  -804604982, 834431625, 1800360467, 603678316, 557395424, -763031007, -1336769888,  -1871888929, 1594598244, 1789292665, 962604079, -1185224024, 199953143, -1078097556, 1286821852, -1441858782, -1050367058, 956106641, -1792710927, -417329507, 1298074488,  -2081642949, -1142130252, 2069006433, -889029611, 2083629927, 1621142867, -1340561463,  676558478, 78265900, -1317128172, 1763225513, 1783160195, 483383997, -1548533202,  2122113423, -1197641704, 319428736, -116274800, -888049925, -798148170, 1768740405,  473572890, -1931167061, -298056529, 1602950715, -412370479, -2044658831, -1165885212,  -865307089, -969908936, 203868919, 278855174, -729662598, -1950547957, 679003141,  1423171080, 1870799802, 1978532600, 107162612, -1482878754, -1512232885, 1595639326,  1848766908, -321446009, -1491438272, 1619109855, 351277170, 1034981600, 421097157,  1072577364, -538901064]
53

[-2142140080, -2066313811, -2015945568, -2013211927, -1988504811, -1884073403, -1860777718,  -1852780618, -1829202121, -1754543670, -1589422902, -1557970039, -1507704627, -1410033893,  -1313864752, -1191655050, -1183729403, -1155076106, -1150685547, -1148162179, -1143013543,  -1012615847, -914543424, -898063429, -831941836, -808337369, -807593292, -775755312, -682786953, -679343381, -657346098, -616936747, -545017823, -522339238, -501194053,  -473081322, -376141541, -350526016, -344380659, -341195356, -303406389, -285611307, -282860017, -156809093, -127312384, -24161190, -420036, 50190256, 74000721, 84358785,  102958758, 124538981, 131053395, 280688418, 281444103, 303002802, 309255004, 360083648,  400920491, 429956579, 478710051, 500159683, 518335017, 559645553, 560041153, 638459051,  640161676, 643850364, 671996492, 733068514, 743285502, 1027514169, 1142193844, 1145750868,  1187862077, 1219366484, 1347996225, 1357239296, 1384342636, 1387532909, 1408330157,  1490584236, 1496234950, 1515355210, 1567464831, 1790076258, 1829519996, 1889752281,  1903484827, 1904323014, 1912488777, 1939200260, 2061174784, 2074677533, 2080731335, 2111876929, 2115658011, 2118089950, 2127342676, 2145430585]
2

カットの最大数を保証する場所でカットを行いたいと思いますか?
DavidC

2
「ピースの数を決定する」のではなく、「ピースの最大数を決定する」と言うでしょう。
DavidC

1
a reasonable desktop PCむしろ曖昧ではないですか?
Globby

3
@globbyランタイムが勝利基準の一部ではない場合に使用するかなり一般的なフレーズです(ただし、ソリューションがブルートフォースを使用していないことを確認するためにのみ使用されます)。ほとんどの場合、制限は100%厳密ではありません。お使いのマシンで15秒かかる場合(そして、スーパーコンピューターを使用していない場合)、ここの誰かが10秒で完了するデスクトップPCを持っている可能性があります。しかし、マシン上で1分かかる場合、その可能性は低いので、別のアプローチを検討する必要があります。また、制限は、効率的なアルゴリズムが10秒未満で簡単に完了するように選択されます。
マーティンエンダー

回答:


16

APL、16 14バイト

1+⌈/+/2≠/∘.≤⍨⎕

2バイトを保存してくれた@ngnに感謝します。

これは実際にはボックス文字であり、フォントの欠落エラーではありません。tryapl.orgでプログラムを試すことができますが、そこでは完全にサポートされていないため、入力値で置き換える必要があります。

    1+⌈/+/2≠/∘.≤⍨ ¯1 3 1 ¯2 5 2 3 4
6

説明

プログラムはs = ¯1 3 1 ¯2 5 2 3 4STDINから取得した入力例で最も説明されます。最初に、を使用してそれ自体の-outer積を計算s∘.≤⍨ます。これにより、i次の行がどの要素sが以下であるかを示すブール行列が生成されs[i]ます。

1 1 1 0 1 1 1 1
0 1 0 0 1 0 1 1
0 1 1 0 1 1 1 1
1 1 1 1 1 1 1 1
0 0 0 0 1 0 0 0
0 1 0 0 1 1 1 1
0 1 0 0 1 0 1 1
0 0 0 0 1 0 0 1

発生0 1及び1 0行上のi文字列が点上を通過するマークの場所s[i] + 0.52≠/「2サブリストを減らす」を使用して、すべての行でこれらを照合します

0 0 1 1 0 0 0
1 1 0 1 1 1 0
1 0 1 1 0 0 0
0 0 0 0 0 0 0
0 0 0 1 1 0 0
1 1 0 1 0 0 0
1 1 0 1 1 1 0
0 0 0 1 1 0 1

残っているのは、行の合計を取得することです +/

2 5 3 0 2 3 5 3

そして、これらの最大値に1を加えたもの1+⌈/

6

結果は、ほとんどのAPL実装でSTDOUTに自動的に出力されます。


@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳私の悪い-期待される結果は、それを生成する場所ではなく、ピースの数です。
J ...

技術的には、16文字、28バイトです。ユニコードはあなたにそれを行います= P
KChaloux

1
@KChalouxは、utf8バイトでカウントする場合にのみ、これはAPLには使用しません。APLが使用する文字セット全体を含むシングルバイトコードページがあるため、カウントに使用するのは公正です。
マーティンエンダー

@MartinBüttner信頼できるソースリンクがあれば素晴らしいと思います。そうしないと、誰かが任意の言語で使用される文字セットのみで任意のWebページを作成し、バイトカウントを減らすことができます。
-agweber

1
@GuillaumeLethuillier APLは、少なくともこのような簡単なゴルフの答えを書くことができる程度まで、実際に学ぶのは本当に簡単です。×乗算などの覚えやすい名前と非常に単純な構文規則を持つ関数が数十あります。優れたガイドについては、Googleの「Dyalog APLをマスターする」。
ズガルブ

16

Python、88 75 73バイト

lambda x:max(sum((a+.5-m)*(a+.5-n)<0for m,n in zip(x,x[1:]))for a in x)+1

単純なラムダ


別のアプローチを示すためだけに:

Pyth、28 27バイト

heSmsmq@S+k(d)1dC,QtQm+b.5Q

これはだいたい同等です

lambda x:max(sum(a+.5==sorted(n+(a+.5,))[1]for n in zip(x,x[1:]))for a in x)+1

STDINからの入力リストに適用されます。オンライン通訳で試してみてください。


同じ量の文字で関数を保存することもできます:def f(x):max(sum((a+.5-m)*(a+.5-n)<0for m,n in zip(x,x[1:]))for a in x)+1
クリスチャンゾンネ

4
@ChristianSonne関数は何も返しません。
ジャクベ

シュート、あなたは正しいです@ジャクベ
クリスチャンゾンネ

これがどのように機能するかは完全にはわかりませんが、+.5sを削除していくつかのキャラクターを保存できると思います。私は彼らが私の中で無意味であることに気づきました。
KSFT

@KSFT文字列を間隔に分割し、すべてa = point + .5を繰り返し、厳密にを含む間隔の数をカウントしaます。なしでは.5[1, 0, -1]例のようなケースで問題が発生します。
Sp3000

16

Pyth31 30 29 28 24 23キャラクター(Python 68文字)

heSmsm&<hSkdgeSkdC,tQQQ

ここで試してください:Pyth Compiler / Executor

入力として整数のリストが必要です [-1, 3, 1, -2, 5, 2, 3, 4]

それは私のPythonプログラムの簡単な翻訳です:

lambda s:1+max(sum(min(a)<i<=max(a)for a in zip(s,s[1:]))for i in s)

古い解決策:Pyth 28 char

アーカイブのためだけです。

heSmsm<*-dhk-dek0C,tQQm+b.5Q

対応するPythonコードは次のとおりです。

f=lambda x:1+max(sum((i-a)*(i-b)<0for a,b in zip(x,x[1:]))for i in [j+.5 for j in x])

,QtQ[QtQ)
-FryAmTheEggmanの

i交差線でi - 0.5はありません。したがって、1 (実際には1 - 0.5 = 0.5)内部にあり(-1, 1)ます。はとmin(a)<i<=max(a)同等min(a) < i - 0.5 < max(a)であり、Pythで解決されますmin(a) < i < max(a)+1hinに注意heSk)。
寂部

ここにいると思います。あるいは、少なくとも私は...このロジックが失敗した任意のケースを見つけることができません
オプティマイザ

あなたは使って文字を保存することができますgしている、>=あなたが交換した場合、<dheSkgeSkd
isaacg

2
ありがとう@isaacg。しかし、私が本当に幸せで自信があるのに、なぜあなたはいつも一緒に来て私のソリューションを破壊するのですか?;-)
ジャクベ

10

CJam、36 34 33 30バイト

q~[__(+]zW<f{f{1$+$#1=}1b}$W=)

世の中にはもっと良いアルゴリズムがあると信じています。それでも、これはすべてのテストケースに必要な制限の下で機能します(オンラインコンパイラでも)

入力は

[-2142140080 -2066313811 -2015945568 -2013211927 -1988504811 -1884073403 -1860777718  -1852780618 -1829202121 -1754543670 -1589422902 -1557970039 -1507704627 -1410033893  -1313864752 -1191655050 -1183729403 -1155076106 -1150685547 -1148162179 -1143013543  -1012615847 -914543424 -898063429 -831941836 -808337369 -807593292 -775755312 -682786953 -679343381 -657346098 -616936747 -545017823 -522339238 -501194053  -473081322 -376141541 -350526016 -344380659 -341195356 -303406389 -285611307 -282860017 -156809093 -127312384 -24161190 -420036 50190256 74000721 84358785  102958758 124538981 131053395 280688418 281444103 303002802 309255004 360083648  400920491 429956579 478710051 500159683 518335017 559645553 560041153 638459051  640161676 643850364 671996492 733068514 743285502 1027514169 1142193844 1145750868  1187862077 1219366484 1347996225 1357239296 1384342636 1387532909 1408330157  1490584236 1496234950 1515355210 1567464831 1790076258 1829519996 1889752281  1903484827 1904323014 1912488777 1939200260 2061174784 2074677533 2080731335 2111876929 2115658011 2118089950 2127342676 2145430585]

出力(上記の場合)は

2

使い方

q~[__(+]zW<f{f{1$+$#1=}1b}$W=)
q~                                "Evaluate input string as array";
  [__                             "Put two copies of it in an array";
     (+]                          "Shift first element of second copy to its end";
        z                         "Zip together the two arrays. This creates";
                                  "pair of adjacent elements of the input.";
         W<                       "Remove the last pair";
           f{            }        "For each element of input array, take the zipped";
                                  "array and run the code block";
             f{       }           "For each element of the zipped array along with";
                                  "the current element from input array, run this block";
               1$+                "Copy the current number and add it to the pair";
                  $#              "Sort the pair and find index of current number";;
                    1=            "check if index == 1 for a < I <= b check";
                       1b         "Get how many pairs have this number inside of them";
                          $W=)    "Get the maximum parts the rope can be cut into";

入力配列が[-1 3 1 -2 5 2 3 4]であると仮定すると、zip圧縮手順は次のようになります。

[-1 3 1 -2 5 2 3 4] [[-1 3 1 -2 5 2 3 4] [-1 3 1 -2 5 2 3 4]
[-1 3 1 -2 5 2 3 4] [[-1 3 1 -2 5 2 3 4] [3 1 -2 5 2 3 4 -1]
[-1 3 1 -2 5 2 3 4] [[-1 3] [3 1] [1 -2] [-2 5] [5 2] [2 3] [3 4]]]

最後の行の2番目の配列は、文字列の折り畳みです。

次に[-1 3 1 -2 5 2 3 4]、各セットが含まれるセットの数を繰り返し計算します。その数から最大値を取得し、それをインクリメントして、答えを導き出します。

こちらからオンラインでお試しください


10

Matlab (123)(97)(85)

いや、最後にXNORの使用=)もっとゴルフができると確信しています。

しかし、正直なところ、MatLabが私が最もよく知っている言語になりつつあることに少し恥ずかしい= /

おおよそのランタイムはO(n^2)です。

EDIT2:

a=input();v=2:nnz(a);disp(max(arrayfun(@(e)sum(~xor(a(v-1)<e,e<a(v))),sort(a)-.5))+1)

編集:新しいゴルフバージョン(@DennisJaheruddinからのヒントを含む、ありがとう!)

a=input();c=sort(a)-.5;n=0;v=2:nnz(c);for e=c;n=[n,sum(~xor(a(v-1)<e,e<a(v)))];end;disp(max(n)+1)

旧版:

a=input();
c=conv(sort(a),[.5,.5],'valid');' %find all cutting positions by taking the mean of two successive points
k=numel(c);
for e=1:k %iterate over all 'cuts'
    n(e)=sum(~xor(a(1:k)<c(e),c(e)<a(2:k+1)));%find the number of threads the cut cuts
end
disp(max(n)+1) %output the max

@MartinBüttner:寝る直前の素敵な小さなチャレンジを本当に楽しんでいます!


10
妻がXNORingに耐えられない
ニブラー

9
@xnorがメモを取る時間=)
flawr

折り目は常に整数であるため、切断点を見つけるのにいくらか節約できると思います:c=sort(a)-.5もちろん最初の点は範囲外ですが、確かにそれを扱うのは簡単です。最悪の場合、あなたはできるc(1)=[];。-また、あなただけの何かがstdoutにそれを書き込みます計算、DISPコマンドを取り除くことができます。 -最後に、この場合numelに置き換えることができますnnz
デニスJaheruddin

しかし、私は自分のconvアプローチをとても誇りに思っていました... = D。私はいつも忘れてしまいましたnnz、ありがとうございます!
flawr

その方法をさらに短くする方法はかなりあります!dispあなたが提案した方法で、他の文字(varまたはの名前ans)もstdoutに書き込まれると誰かが批判したので、私は使用しています
...-flawr

9

Mathematica 134133 104

コードのサイズにもかかわらず、解決するのは楽しい。さらに、ゴルフはまだのアイデア交換することによって達成することができるIntervalMemberQ[Interval[a,b],n]としa<n<b

n_~f~i_:=Count[IntervalMemberQ[#,n]&/@i,1>0];
g@l_:=Max[f[#,Interval/@Partition[l,2,1]]&/@(Union@l+.5)]+1

g[{-1, 3, 1, -2, 5, 2, 3, 4}]

6


説明

list1与えられたポイントのリスト list2は、折り目にない数値を削除する短縮リストです。それらは無関係です。これを行う必要はありませんが、より明確で効率的なソリューションにつながります。

list1 = {-1, 3, 1, -2, 5, 2, 3, 4};
list2 = {-1, 3, 1, -2, 5,2, 3, 4} //. {beg___, a_, b_, c_, end___} /; (a <= b <= c) 
 \[Or] (a >= b >= c) :> {beg, a, c, end}

list1およびの間隔は、list2以下のプロットに示されています。

NumberLinePlot[Interval /@ Partition[list1, 2, 1]]
NumberLinePlot[intervalsArrangedVertically = Interval /@ Partition[list2, 2, 1]]

間隔


フォールドポイントによって決定される各間隔で単一のラインをテストするだけです。テストラインは、プロットの垂直の破線です。

delimitersLeftToRight = Union[list2]
testLines = delimitersLeftToRight + .5
NumberLinePlot[
 intervalsArrangedVertically = Interval /@ Partition[list2, 2, 1], 
 GridLines -> {testLines, {}}, 
 GridLinesStyle -> Directive[Gray, Dashed]]

テストライン


f各テストラインのカットまたは交差の数を見つけます。x = 2.5の線は5回の交差を行います。5 + 1個の文字列が残ります。

f[num_, ints_] := Count[IntervalMemberQ[#, num] & /@ ints, True]
f[#, intervalsArrangedVertically] & /@ testLines
Max[%] + 1

{2、3、5、3、2、0}
6


8

Pyth、21バイト

heSmsmq1xS+dSkdC,tQQQ

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

Pythonスタイルのリストとして入力を与えます。例えば [-1, 3, 1, -2, 5, 2, 3, 4]

@jakubeのプログラムに基づいていますが、中央アルゴリズムが改善されています。>チェックとチェックを行う代わりに、3つの数値を組み合わせ>=てaを実行.index()し、インデックスが1であることを確認します。これは、インデックスが最小値より大きく、最大値以下であることを意味します。


7

R、86 83

これを経て、オプティマイザーや疑わしい他のソリューションと本質的に同じソリューションを思いついたことに気付きました。

とにかくここでは、ベクトルを取る関数として

f=function(l)max(colSums(mapply(function(n)c(l[-1],NA,l)<=n&c(l,l[-1],NA)>=n,l),T))

OK、だから私は偏見があり、ちょうど好きRです。FWIWあなたが使用して3つの文字を救うことができるT「TRUE」のために
カール・Witthoft

@CarlWitthoftヒントをありがとう
-MickyT

4

GolfScript(43バイト)

~[.(;]zip);{$}%:x{0=:y;x{{y>}%2,=},,}%$-1=)

効率の点では、比較にO(1)時間かかると仮定すると、これはO(n ^ 2)です。入力をラインセグメントに分割し、各開始点について、入力を交差する半分開いたラインセグメントをカウントします。

オンラインデモ


4

パイソン-161

これはおそらくもっとゴルフできるでしょう。ニブラーはこのゴルフを大いに助けました。

l=input()
d={}
for i in zip(l,l[1:]):d[sum(i)/2.]=0
for i,k in zip(l,l[1:]):
 for j in[m for m in d.keys()if min(i,k)<m<max(i,k)]:d[j]+=1
print max(d.values())+1

1
@MartinBüttner/ Jakube修正しました。10秒以内にすべてのテストケースで動作するようになりました。
KSFT

なぜこれに2つの下票があるのですか?
KSFT

3

ルビー、63

概念のPythonソリューションに似ています。

->a{a.map{|x|a.each_cons(2).count{|v|v.min<x&&x<=v.max}}.max+1}

f=名前付き関数が必要な場合など、コードの前に2文字を追加します。MarkReedへのThx


裸のprocは、変数に割り当てることなく受け入れられる答えのようです。2文字を保存します。
マークリード

3

C#、73 65バイト

N=>1+N.Max(i=>N.Zip(N.Skip(1),(f,s)=>f<i+.5==i+.5<s).Count(b=>b))

ルールを読んで、C#ラムダがかなりうまくいくと思いました。

編集:見つかったばかりのCountフィルタリングに便利なオーバーロードがあります!

これをテストするには、適切なdelegateタイプを定義します。

delegate int solver(int[] l);

その後

var l = new int[] { -1, 3, 1, -2, 5, 2, 3, 4 };
solver s = N=>1+N.Max(i=>N.Zip(N.Skip(1),(f,s)=>f<i+.5==i+.5<s).Count(b=>b));

Console.WriteLine(s(l));

3

Matlab(63 43)

入力は、関数に渡される行ベクトルとして与えられますf。したがって、たとえばをf([-1, 3, 1, -2, 5, 2, 3, 4])返します6

f=@(x)max(sum(diff(bsxfun(@le,2*x',x(1:end-1)+x(2:end)))~=0))+1

短いバージョン:

f=@(x)max(sum(diff(bsxfun(@lt,x',x))~=0))+1

オクターブ(31)

Octaveではbsxfun、自動ブロードキャストのおかげで削除できます。

f=@(x)max(sum(diff(x'<x)~=0))+1

2

JavaScript(ES6)80 82

コメントを参照してください-バイトカウントにはFへの割り当ては含まれていません(テストにはまだ必要です)

F=l=>Math.max(...l.map(v=>l.map(t=>(n+=t>u?v<t&v>=u:v>=t&v<u,u=t),n=1,u=l[0])&&n))

FireFox / FireBugコンソールで テストする

;[
 F([0, 1])
,F([2147483647, -2147483648])
,F([0, 1, -1])
,F([1, 0, -1])
,F([-1, 3, 1, -2, 5, 2, 3, 4])  
,F([-1122432493, -1297520062, 1893305528, 1165360246, -1888929223, 385040723, -80352673, 1372936505, 2115121074, -1856246962, 1501350808, -183583125, 2134014610, 720827868, -1915801069, -829434432, 444418495, -207928085, -764106377, -180766255, 429579526, -1887092002, -1139248992, -1967220622, -541417291, -1617463896, 517511661, -1781260846, -804604982, 834431625, 1800360467, 603678316, 557395424, -763031007, -1336769888, -1871888929, 1594598244, 1789292665, 962604079, -1185224024, 199953143, -1078097556, 1286821852, -1441858782, -1050367058, 956106641, -1792710927, -417329507, 1298074488, -2081642949, -1142130252, 2069006433, -889029611, 2083629927, 1621142867, -1340561463, 676558478, 78265900, -1317128172, 1763225513, 1783160195, 483383997, -1548533202, 2122113423, -1197641704, 319428736, -116274800, -888049925, -798148170, 1768740405,  473572890, -1931167061, -298056529, 1602950715, -412370479, -2044658831, -1165885212, -865307089, -969908936, 203868919, 278855174, -729662598, -1950547957, 679003141,  1423171080, 1870799802, 1978532600, 107162612, -1482878754, -1512232885, 1595639326, 1848766908, -321446009, -1491438272, 1619109855, 351277170, 1034981600, 421097157, 1072577364, -538901064])
,F([-2142140080, -2066313811, -2015945568, -2013211927, -1988504811, -1884073403, -1860777718, -1852780618, -1829202121, -1754543670, -1589422902, -1557970039, -1507704627, -1410033893,  -1313864752, -1191655050, -1183729403, -1155076106, -1150685547, -1148162179, -1143013543,  -1012615847, -914543424, -898063429, -831941836, -808337369, -807593292, -775755312, -682786953, -679343381, -657346098, -616936747, -545017823, -522339238, -501194053,  -473081322, -376141541, -350526016, -344380659, -341195356, -303406389, -285611307, -282860017, -156809093, -127312384, -24161190, -420036, 50190256, 74000721, 84358785,  102958758, 124538981, 131053395, 280688418, 281444103, 303002802, 309255004, 360083648,  400920491, 429956579, 478710051, 500159683, 518335017, 559645553, 560041153, 638459051,  640161676, 643850364, 671996492, 733068514, 743285502, 1027514169, 1142193844, 1145750868,  1187862077, 1219366484, 1347996225, 1357239296, 1384342636, 1387532909, 1408330157,  1490584236, 1496234950, 1515355210, 1567464831, 1790076258, 1829519996, 1889752281,  1903484827, 1904323014, 1912488777, 1939200260, 2061174784, 2074677533, 2080731335, 2111876929, 2115658011, 2118089950, 2127342676, 2145430585])
]

出力

[2、2、3、2、6、53、2]


2
Python lambdaソリューションに基づいて、関数値を実際の変数に割り当てる必要がないため、2つの文字をノックオフできます。
マークリード

1
うん。課題で特に明記されていない限り、名前のない関数はまったく問題ありません。
マーティンエンダー

1

ゼリー、10バイト

>þ`^ƝS$€Ṁ‘

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

使い方

>þ`^ƝS$€Ṁ‘ - Main link. 1 argument        e.g.   [1, 0, -1]
>þ`        - Greater than outer product          [[0, 0, 0], [1, 0, 0], [1, 1, 0]]
      $€   - Over each sublist:           e.g.   [1, 1, 0]
    Ɲ      -   Over each overlapping pair e.g.   [1, 0]
   ^       -     Perform XOR                     1
     S     -   Take the sums                     [0, 1, 1]
        Ṁ  - Take the maximum                    1
         ‘ - Increment                           2



0

Add ++、27バイト

D,w,@@,VbUG€<ÑBxs
L~,A€wM1+

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

APLの回答についてZgarbに感謝します

この課題の重要な部分は、外部製品コマンドの実装です。残念ながら、Add ++にはそのためのビルトインがなく、他の関数を引数としてとる関数を定義する方法もありません。ただし、それでも一般化された外積関数を作成できます。関数が別の関数内でアクセスされる唯一の方法は、ユーザー定義または組み込みの既存の関数を参照することであるため、そのような関数を参照する「組み込み」を作成する必要があります。

一般化された「テーブル」関数は次のようになります。

D,func,@@,+

D,iter,@@*, VbUG €{func}
D,table,@@, $ bRbU @ €{iter} B]

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

ここfuncで、オペランドを含む二項関数です。w関数の開始時に、元のサブミッションでこの構造のわずかな類似性を見ることができますが、ここでは主にモナド外積関数-両側で同じ引数を取る外積関数が必要です。

一般的なテーブル関数は、各クイック関数が2項関数にどのように近づくかを利用します。スタックが次のように見える場合

 [a b c d e]

とき€{func}に遭遇され、ポップe、そのダイアドに左引数としてバインドし、上の部分的な機能をマッピングa, b, c, d。ただし、リストではなく、スタック全体のクイックマップ。そのため、最初に引数として渡された配列を平坦化する必要があります。

テーブルの機能は次のように全体的に動作します

D,func,@@,+

D,iter,		; Define our helper function iter
		;   This takes an array as its left argument
		;   And a single integer as its right argument
	@@	; Dyadic arguments - take two arguments and push to the stack
	*,	; After execution, return the entire stack, rather then just the top element
		;
		; Example arguments:	[5 6 7 8] 1
		; 
	VbUG	; Unpack the array;	[5 6 7 8 1]
		;
	€{func}	; Map func over the stack
		; As func is dyadic, this pops the right argument
		;   and binds that to a monadic func
		; This then maps the remaining elements, [5 6 7 8]
		;   over the monadic call of func, yielding [6 7 8 9]
		; Now, as the * flag was defined, we return the entire array
		;   rather than just the last element.
		; We'd achieve the same behaviour by removing the flag and appending B]

D,table,	; Define the main table function
		;   This takes two arrays as arguments
		;   Returns a single 2D array representing their outer product with func
	@@,	; Take the two arrays and push to the stack
		; 
		; Example arguments:	[[1 2 3 4] [5 6 7 8]]
		;
	$	; Swap;		STACK = [[5 6 7 8] [1 2 3 4]]
	bR	; Reverse last;	STACK = [[5 6 7 8] [4 3 2 1]]
	bU	; Unpack;	STACK = [[5 6 7 8] 4 3 2 1]
	@	; Reverse;	STACK = [1 2 3 4 [5 6 7 8]]
		; 
		; This allows us to place the stack so that each element of
		;   the first array is iterated over with the second array
		;
	€{iter}	; Map iter;	STACK = [[6 7 8 9] [7 8 9 10] [8 9 10 11] [9 10 11 12]]
		;
	B]	; Return the whole stack;

$table>?>?
O

ただし、外部テーブルをモナドにする必要があるため、渡された引数にのみ適用する必要があるため、これを大幅に短縮できます。このAコマンドは、各引数をスタックに個別にプッシュするため、スタック操作をいじる必要はありません。つまり、引数が配列の場合[a b c d]、スタックを

[a b c d [a b c d]]

もちろん、一番上の値は引数です。一般的な例からわかるようにbUunpackコマンドは、一番上の配列をスタックに配置します。上記の設定を行うために、コードを使用できます

L,bUA

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

ただし、これは1バイト短くすることができます。のエイリアスとしてL,bU~フラグを使用して、事前にスタックへの引数をスプラッティングし、構成例を次のようにします。

L~,A

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

これはプログラムの2行目の始まりです。これでモナド外積を実装しました。残りのアルゴリズムを実装するだけです。結果取得一度テーブルを用いて<(以下)、及び数カウント[0 1][1 0]各行のペア。最後に、これらのカウントの最大値を取得し、インクリメントします。

ステップウォークスルーの完全なステップは

D,w,		; Define a function w
		;   This takes an array and an integer as arguments
		;   First, it produces the outer product with less than
		;   Then reduce overlapping pairs by XOR
		;   Finally, sum the rows
	@@,	; Take two arguments
		;
		; Example arguments:		[[0 1 2 3] 0]
		;
	VbUG€<	; Map < over the array;	STACK = [0 1 1 1]
	ÑBx	; Equals [1 0];		STACK = [1 0 0]
	s	; Sum;			STACK = [1]

L		; Define a lambda function
		;   This takes one argument, an array
	~,	;   Splat the array to the stack before doing anything
		;
		; Example argument:		[0 1 2 3]
		;
	A€w	; Map with w;		STACK = [1 1 1 0]
	M	; Maximum;		STACK = [1]
	1+	; Increment;		STACK = [2]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.