洗練されたパーティション


19

整数の配列を考えます:

[1, 0, 9, 1, 3, 8]

このリストを連続したサブリストに分割する方法はたくさんあります。3つあります。

A: [[1, 0, 9], [1, 3, 8]]
B: [[1], [0, 9], [1, 3], [8]]
C: [[1, 0], [9, 1], [3, 8]]

サブリストを結合してYからXを取得できる場合、パーティションYと別のパーティションXの改良版を呼び出します。

B洗練もA同様です。最初の2つのサブリストと最後の2つのサブリストを結合して戻すと、が得られAます。しかしCそれは洗練されたものではありません。それから回復するにはA9とを分割する必要があります。また、どのパーティションもそれ自体が洗練されたものです。1A

サブリストまたは要素をいつでも再配置することは許可されていないことに注意してください。

チャレンジ

2つのパーティション(整数のリストのリスト)Xおよびが与えられYYがの洗練であるかどうかを判断しXます。

あなたは、パーティションのみから整数が含まれていることを仮定してもよい09包括的、。あなたはそれXY同じリストのパーティションであると仮定してはなりません(そうでない場合、互いの改良でもありません)。Xおよび/またはY空であっても、空のサブリストが含まれることはありません。

プログラムまたは関数を作成し、STDIN(または最も近い代替)、コマンドライン引数または関数引数を介して入力を取得し、STDOUT(または最も近い代替)、関数の戻り値または関数(out)パラメーターを介して結果を出力できます。

入力は、任意の便利な文字列またはリスト形式で取得できます。要素は1桁の整数のみであるため、サブリスト内の区切り文字を省略することもできますが、先頭0のsが可能なことを確認してください。あなたは取ることを選んでもよいXし、Y逆の順序で。

出力は、洗練されている場合は真実であり、そうでない場合は偽である必要Yがあります。X

コードは、妥当なデスクトップマシンで1秒以内に以下の各テストケースを解決できる必要があります。(これは、単純なブルートフォースソリューションを回避するための単なる健全性チェックです。)

これはコードゴルフなので、最短の回答(バイト単位)が勝ちです。

テストケース

各テストケースは、と書かれた独自の行にありX Yます。GolfScript / CJamスタイルの配列表記を使用して、水平方向のスペースを節約しています。

真実:

[] []
[[0]] [[0]]
[[1 0 9 1 3 8]] [[1 0 9] [1 3 8]]
[[1 0 9 1 3 8]] [[1 0 9 1 3] [8]]
[[1 0 9 1 3 8]] [[1] [0] [9] [1] [3] [8]]
[[1 0 9] [1 3 8]] [[1 0 9] [1 3 8]]
[[1 0 9] [1 3 8]] [[1] [0 9] [1 3] [8]]
[[9 8 8 5 8 2 7] [5] [1 4] [2 0 0 6 0 8 4 2 6 4 2 3 7 8 7 3 9 5 7 9 8 2 9 5] [3 9 8] [7 1 4 9 7 4 5 9] [3 3 3] [9 0 7 8] [3 9 4 7 2 7 8 0 3 0] [8 2 2 7 3 9 3 2] [2 9 0 8 5 4 1 8 5 5 6 2 0 9 2 7 7 9 2 7] [3 6] [1 2 7 7 4 4 2 9]] [[9 8] [8] [5 8 2] [7] [5] [1 4] [2] [0 0 6] [0] [8 4 2] [6 4] [2] [3] [7 8] [7 3] [9] [5 7 9] [8 2] [9 5] [3] [9 8] [7 1 4] [9 7] [4 5 9] [3 3] [3] [9 0] [7 8] [3] [9] [4] [7 2] [7 8] [0] [3 0] [8 2] [2] [7 3] [9 3] [2] [2] [9] [0] [8 5 4] [1 8] [5 5] [6] [2 0] [9] [2] [7 7 9] [2 7] [3 6] [1 2] [7 7] [4 4 2] [9]]

偽物:

[[0]] []
[[0]] [[1]]
[[1 0 9]] [[1 0 9] [1 3 8]]
[[1 0 9] [1 3 8]] [[1 0 9 1 3 8]]
[[1 0 9] [1 3 8]] [[1 0 9]]
[[1 0 9] [1 3 8]] [[1 0] [9]]
[[1 0 9] [1 3 8]] [[1 0] [9 1] [3 8]]
[[1] [0 9] [1 3] [8]] [[1 0 9] [1 3 8]]
[[9 8 8 5 8 2 7] [5] [1 4] [2 0 0 6 0 8 4 2 6 4 2 3 7 8 7 3 9 5 7 9 8 2 9 5] [3 9 8] [7 1 4 9 7 4 5 9] [3 3 3] [9 0 7 8] [3 9 4 7 2 7 8 0 3 0] [8 2 2 7 3 9 3 2] [2 9 0 8 5 4 1 8 5 5 6 2 0 9 2 7 7 9 2 7] [3 6] [1 2 7 7 4 4 2 9]] [[9 8] [8] [5 8 2] [7] [5 1] [4] [2] [0 0 6] [0] [8 4 2] [6 4] [2] [3] [7 8] [7 3] [9] [5 7 9] [8 2] [9 5] [3] [9 8] [7 1 4] [9 7] [4 5 9] [3 3] [3] [9 0] [7 8] [3] [9] [4] [7 2] [7 8] [0] [3 0] [8 2] [2] [7 3] [9 3] [2] [2] [9] [0] [8 5 4] [1 8] [5 5] [6] [2 0] [9] [2] [7 7 9] [2 7] [3 6] [1 2] [7 7] [4 4 2] [9]]

リーダーボード

これは、通常のリーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットです。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

# Ruby, <s>104</s> <s>101</s> 96 bytes

<script>site = 'meta.codegolf'; postID = 5314; isAnswer = true; QUESTION_ID = 51719</script><script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)</code></pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>

関連する課題


でしょう[[[1 0 9] [1 3 8]] [[1] [0 9] [1 3] [8]]][["109" "138"] ["1" "09" "13" "8"]]許容入力フォーマットになりますか?
デニス

@Dennis入力全体を配列にラップするのは奇妙に思えます。私はそれが標準的な慣行であることを知りませんが、メタ質問に値するかもしれません。これらの外側のブラケットがなければ、間違いなく大丈夫です。
マーティンエンダー

メタ質問を作成してみます。
デニス

回答:


6

CJam、13 10 9バイト

lr.-F-U-!

CJamインタープリターでオンラインで試してください。

@ edc65の独創的な入力形式を提案してくれた@MartinBüttnerに感謝します

@ jimmy23013に感謝します。入力フォーマットを改善し、3バイト追加しました。

I / O

入力

サブリストは、以下によって区切ら;,ます。

1;0;9,1;3;8
1,0;9,1;3,8

出力

1

使い方

lr e# Read line and a whitespace-separated token from STDIN.
.- e# Vectorized difference. Pushes the differences of corresponding code points.
F- e# Remove all occurrences of 15 (';' - ',') from the array.
U- e# Remove all occurrences of 0 from the array.
!  e# Push 1 if the resulting array is empty and 0 if not.

異なる長さの文字列の場合.-、配列に文字を残します。これは、整数0または15と等しくすることはできません。


あなたが使用できる場合は;、セパレータとして... ll.m27m0-!
jimmy23013

@ jimmy23013:なぜそうなのかわかりません。,そして;共通配列構文(それらのいずれもCJamによって使用されない)の両方です。ありがとう!
デニス

9

Pyth、19バイト

&gF_m{.u+NYdYQqFsMQ

オンラインで試す:デモンストレーションまたはテストハーネス

入力としてPythのタプル/リスト形式を使用しています。テストケースのスペースをカンマに置き換えるだけです。

説明:

                     implicit: Q is the evaluated input
    m        Q       map each input list d to:
      .u   dY          reduce with intermediate states over d, initial value = []
        +NY              update initial value N with sum of N and Y (current element of d)
     {                 generate a set
   _                 invert
 gF                  check, if the first element is >= (superset) than the second
&                    and
                sMQ  check, if the joined lists of the input
              qF     are equal

擬似コードはまだ少しわかりにくいので、入力例を使用してアルゴリズムを示します。

Input: [[1,0,9],[1,3,8]],[[1],[0,9],[1,3],[8]]

この.u+NYdY部分は、最初の要素を含むすべての連続サブリストを計算します。

[[1,0,9],[1,3,8]]     => [[], [1,0,9], [1,0,9,1,3,8]]
[[1],[0,9],[1,3],[8]] => [[], [1], [1,0,9], [1,0,9,1,3], [1,0,9,1,3,8]]

Bは、のA各サブリストAも連続サブリストである場合B(の例外が1つしかない場合)の改良です。

したがって、の連続サブリストのAセットがBgF_m.u+NYdYQ)の連続サブリストのセットのサブセットであるかどうかを確認するだけです。

唯一の例外は、最初の入力リストに含まれる要素が2番目の入力リストよりも少ない場合です。例えば<Fm.u+YdYQ返すTrue入力のために[[1]],[[1],[2]]

したがって、結合リストも等しいかどうかもチェックします&...qFsMQ


7

JavaScript(ES6)、67 70

3バイト保存されたthx @apsillersを編集

Firefoxで以下のスニペットを実行してテストします

f=(a,b)=>a+''==b // same values in the lists ?
&![...a.join(' ')].some((c,p)=>c<','&b.join(c)[p]>c) // splits in a are present in b?

// TEST

out=x=>O.innerHTML += x+'\n';

OK=[
[[],[]],
[[[0]],[[0]]],
[[[1,0,9,1,3,8]],[[1,0,9],[1,3,8]]],
[[[1,0,9,1,3,8]],[[1,0,9,1,3],[8]]],
[[[1,0,9,1,3,8]],[[1],[0],[9],[1],[3],[8]]],
[[[1,0,9],[1,3,8]],[[1,0,9],[1,3,8]]],
[[[1,0,9],[1,3,8]],[[1],[0,9],[1,3],[8]]],
[[[9,8,8,5,8,2,7],[5],[1,4],[2,0,0,6,0,8,4,2,6,4,2,3,7,8,7,3,9,5,7,9,8,2,9,5],[3,9,8],[7,1,4,9,7,4,5,9],[3,3,3],[9,0,7,8],[3,9,4,7,2,7,8,0,3,0],[8,2,2,7,3,9,3,2],[2,9,0,8,5,4,1,8,5,5,6,2,0,9,2,7,7,9,2,7],[3,6],[1,2,7,7,4,4,2,9]],[[9,8],[8],[5,8,2],[7],[5],[1,4],[2],[0,0,6],[0],[8,4,2],[6,4],[2],[3],[7,8],[7,3],[9],[5,7,9],[8,2],[9,5],[3],[9,8],[7,1,4],[9,7],[4,5,9],[3,3],[3],[9,0],[7,8],[3],[9],[4],[7,2],[7,8],[0],[3,0],[8,2],[2],[7,3],[9,3],[2],[2],[9],[0],[8,5,4],[1,8],[5,5],[6],[2,0],[9],[2],[7,7,9],[2,7],[3,6],[1,2],[7,7],[4,4,2],[9]]]
];

KO=[
[[[0]],[]],
[[[0]],[[1]]],
[[[1,0,9]],[[1,0,9],[1,3,8]]],
[[[1,0,9],[1,3,8]],[[1,0,9,1,3,8]]],
[[[1,0,9],[1,3,8]],[[1,0,9]]],
[[[1,0,9],[1,3,8]],[[1,0],[9]]],
[[[1,0,9],[1,3,8]],[[1,0],[9,1],[3,8]]],
[[[1],[0,9],[1,3],[8]],[[1,0,9],[1,3,8]]],
[[[9,8,8,5,8,2,7],[5],[1,4],[2,0,0,6,0,8,4,2,6,4,2,3,7,8,7,3,9,5,7,9,8,2,9,5],[3,9,8],[7,1,4,9,7,4,5,9],[3,3,3],[9,0,7,8],[3,9,4,7,2,7,8,0,3,0],[8,2,2,7,3,9,3,2],[2,9,0,8,5,4,1,8,5,5,6,2,0,9,2,7,7,9,2,7],[3,6],[1,2,7,7,4,4,2,9]],[[9,8],[8],[5,8,2],[7],[5,1],[4],[2],[0,0,6],[0],[8,4,2],[6,4],[2],[3],[7,8],[7,3],[9],[5,7,9],[8,2],[9,5],[3],[9,8],[7,1,4],[9,7],[4,5,9],[3,3],[3],[9,0],[7,8],[3],[9],[4],[7,2],[7,8],[0],[3,0],[8,2],[2],[7,3],[9,3],[2],[2],[9],[0],[8,5,4],[1,8],[5,5],[6],[2,0],[9],[2],[7,7,9],[2,7],[3,6],[1,2],[7,7],[4,4,2],[9]]]
];

dump=l=>l.map(x=>'['+x+']').join(',');

out('YES');
OK.forEach(l=>out(f(l[0],l[1])+' a['+dump(l[0])+'] b['+dump(l[1])+']'));
out('NO');
KO.forEach(l=>out(f(l[0],l[1])+' a['+dump(l[0])+'] b['+dump(l[1])+']'));
<pre id=O></pre>


最近では、Firefoxをダウンロードして、すばらしいソリューションが実際に動作することを確認する必要があります。:)
アレックスA.

@AlexA。どうしてそれなしで生きることができますか
edc65

D:使用repl.itは、私がサポートES6と思います
マーク・K・コーワン

変数OKKO
rr-

7

C、69 75

0または1を返す2つの文字列パラメーターを持つ関数。

パラメータ形式:スペース( '')で区切られたサブリスト、コンマで区切られたリスト要素。

例: "1,0,9 1,3,8" "1,0 9,1,3,8"

f(char*a,char*b){for(;*a-44?*a&&*b==*a:*b<48;a++)b++;return!(*b|*a);}

少ないゴルフ

int f(char *a, char *b)
{
    // expected in a,b: digit,separator,digit... with separator being ' ' or ','
    for(; *a; a++,b++)
       // ' ' or digit in a must be the same in b
       // comma in a must be comma or space in b
       if (*a != ',' ? *b != *a : *b > *a) return 0;
    return !*b; // must have a null in *b too
}

試験 Ideone(古いです)


1
入力形式の賢い選択。Haskellの別の回答のために借りました。
nimi

私は私のJSの答えを入力するためにあなたのアイデアを食い物にし、それが1バイトであることが判明長く、私がいることを期待しているだろうES6 ... ...にそれをアップグレードするまで、あなたのCのバージョンよりも
マーク・K・コーワン

6

Haskell、76バイト

[]#[]=1<2
[x]#[y]=x==y
x@(a:b)#(c:d:e)|a==c=b#(d:e)|1<2=x#((c++d):e)
_#_=2<1

Trueまたはを返しますFalse。使用例:[[1,0,9],[1,3,8]] # [[1,0],[9]]-> False

単純な再帰的アプローチ:最初の要素が一致する場合は末尾に進み、そうでない場合は最初からやり直しますが、2番目のリストの先頭にある2つの要素を連結します。基本ケースは次のとおりです。両方のリストが空-> True; 1つの要素を持つ両方のリスト->それらを比較します。空のリストは1つだけ-> False


6

CJam、19バイト

q~]{_,,\f>:sS.+}/-!

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

I / O

入力

[[1 0 9] [1 3 8]] [[1] [0 9] [1 3] [8]]

出力

1

アイディア

次の2つのプロパティを観察することにより、各パーティションを一意に識別できます。

  • すべてのサブリストを連結して形成されたリスト。

  • リストの極値を含む「カッティングポイント」。

各カッティングポイントをカッティングポイントからリストの最後までの要素のサブリストで置き換えることにより、両方の基準を1つにまとめることができます。

特定のパーティションが別のパーティションよりも細かいことを確認するには、上記の粗いパーティションが細かいパーティションのサブセットであり、両方のパーティションの最大リストが一致するかどうかを確認するだけです。

コード

q~]   e# Read from STDIN and evaluate.
{     e# For each array P from the input:
  _,, e#   Push [0 ... L], where L == length(P) - 1.
  \f> e#   Push [P[0:] ... P[L]].
  :s  e#   Stringify each P[k:] (flattens).
  S.+ e#   Vectorized concatenation. This appends a space to the first element.
}/    e#
-!    e# Push the logical NOT of the difference A-B to check if A is a subset of B.

I / Oの例の入力の場合、スタックは

["109138 " "138"] ["109138 " "09138" "138" "8"]

実行する前に-!

各配列の最初の要素には末尾スペースがあることに注意してください。これにより、最初の入力の完全なリストと2番目の入力の完全なリストを比較できます。


5

CJam、24バイト

l~L\{+_a2$1<={;1>L}&}/+!

アルゴリズム

ここでは、欲張りアルゴリズムを使用して、最初に N、2番目のリストのサブリストをマージして、最初のリストの最初のサブリストを形成できるます。N見つかったらN、2番目のリストから最初のサブリストを削除し、最初のリストから最初のサブリストを削除して、プロセスを繰り返します。

理想的には、2番目のリストが最初のリストを改良したものである場合、2つの空のリストがスタックに残されます。確認して印刷するだけです1そうであれば。他の組み合わせでは、2番目のリストのサブリストを完全に繰り返した後、2つの空のリストになりません。したがって、このよう0な場合にはa が印刷されます。

コード拡張

l~L\{+_a2$1<={;1>L}&}/+!
l~L\                       e# Read the line, evaluate the two lists and put an empty list
                           e# between them
    {               }/     e# Iterate over all sub-lists of the second list
     +                     e# Append the current sub-list to whatever is on stack. Originally
                           e# an empty array, but eventually the sum of first N sub-lists
      _a                   e# Copy this and wrap it in an array
        2$                 e# Copy the first list on top of stack
          1<               e# Get only its first element wrapped in an array. This approach
                           e# is exception safe in case the array was already 0 length
            ={    }&       e# If we have a match, remove both first sub-lists
              ;            e# Remove the first N sub-lists array
               1>          e# Remove the first element from the first array
                 L         e# Put an empty array on stack to repeat the process
                      +!   e# If we are left with two empty arrays, sum them and do logical
                           e# not to get 1. If any of the arrays is non-empty, logical not
                           e# gives 0

ここでオンラインで試す、ここで完全なテストスイートを実行してください


3

C、120 114バイト

#define C(x),x+=(*x/93)*(1+!!x[1])|1
o;R(char*s,char*t){for(o=1;*s;o&=*s==t[2*(*t==93&&93>*s)]C(s)C(t));return o;}

私は最近あまりゴルフをしていないので、これを試してみると思いました。

私たちは、関数定義R(char* s, char* t)を返す1場合tの洗練されたパーティションですがs、そして0それ以外の場合は。sそして、それぞれが別の1桁の要素tである形式であることが期待されます。[DDDD...][DDDD...]...D

テストコード:

#include "stdio.h"

int main(int argc, char** argv) {
    char* str1, *str2;
    str1 = "[109][138]";
    str2 = "[1][09][13][8]";
    printf("Input: %s, %s --> %d\n", str1, str2, R(str1, str2));

    str1 = "[109][138]";
    str2 = "[1][19][13][8]";
    printf("Input: %s, %s --> %d\n", str1, str2, R(str1, str2));

    str1 = "[109][138]";
    str2 = "[10][91][3][8]";
    printf("Input: %s, %s --> %d\n", str1, str2, R(str1, str2));
}

上記は次を印刷します:

Input: [109][138], [1][09][13][8] --> 1
Input: [109][138], [1][19][13][8] --> 0
Input: [109][138], [10][91][3][8] --> 0

少なくともうまくいくようです。


3

Haskell、52 50 53バイト

x#y=and$zipWith(\a b->a==b||a==',')(x++"..")(y++"..")

私の他のソリューションとはまったく異なります@ edc65のanswerと同じ巧妙な入力形式を使用します。つまり、要素はで区切られ,、リストはます。

使用例: "1,0,9,1,3,8" # "1,0,9 1,3,8" -> True

2番目のパラメーターは、すべての位置に等しい要素があるか、最初のパラメーターがである場合、最初のパラメーターを改良したものです,..両方のパラメーターに一意の終了トークン(-> )を追加する必要があります。これはzipWith、より長いパラメーターが切り捨てられるためです。"1,2,3" # "1,2"True


1
(\a b->a==b||a>b)ただ(>=)です。
alephalpha

単に仕事の"."代わりに追加しませ".."んか?
誇りに思ってhaskeller

"2"#"1"関数は値がより大きいか等しくないかどうかだけをチェックするため、これは失敗します
誇りに思ってhaskeller

@alephalpha:あぁ、それを見落とすなんて馬鹿だ。とにかく間違っています。他のコメントを参照してください。
nimi

@proudhaskeller:ギリギリの編集。はい、これはバグです。それを修正しました。見つけてくれてありがとう。ところで、単一のドットは、"."それがために偽陽性与えるので、動作しません "2,1" # "2"最初に展開することになる"2,1." # "2."と、それまでに切り捨てられるzipWithのを"2," # "2."。最初の文字列のコンマはすべてに一致します。
nimi

2

Mathematica、65バイト

f@__=1<0;{}~f~{}=1>0;{a_,b___}~f~{c__,d___}/;a==Join@c:={b}~f~{d}

1
いい解決策。参考までに、再帰(または複数の定義)を使用しない59バイトのソリューションがあります。
マーティンエンダー

2

正規表現を使用した数学は楽しいです!

ES6 Javascript、53文字

(a,b)=>RegExp('^'+a.replace(/,/g,'[ ,]')+'$').test(b)

ビンテージJavascript、70文字

function f(a,b){return RegExp('^'+a.replace(/,/g,'[ ,]')+'$').test(b)

edc65のanswerと同じ入力形式を使用します

すべてのテストケースを含む完全なデモはこちら。


賢い!このタスクの正規表現について考えたことはありません。
edc65

バックトラッキング正規表現を使用して素因数を見つける再帰関数を使用して整数を因数分解するperlプログラムを作成しました。
マークKコーワン

また、言語仕様を正規表現に変換するパーサージェネレーターを作成し、その正規表現を使用して、指定された言語の式を解析できます。基本的に、人間が読める言語仕様を「実行可能な」正規表現に「コンパイル」します。 github.com/battlesnake/d-slap AngularJS内包表記を解析するために生成された正規表現は、約400〜500文字の長さです...
Mark K Cowan

2

Mathematica、55バイト

Equal@@Join@@@#&&SubsetQ@@(Accumulate[Length/@#]&)/@##&

これは、名前のない関数を定義し、2つのパーティションを1つのリストに逆順で(つまり、Y最初に、X 2番目)ます。

説明

Equal@@Join@@@#

これは、両方のパーティションが実際に同じリストのパーティションであることを確認します。

SubsetQ@@(Accumulate[Length/@#]&)/@##

これは、この課題を引き起こしたMathematica.SEに関するこの質問に対する私のアプローチのゴルフ形式です。基本的に、パーティションは、分割が挿入されるインデックスの数として定義され、サブリストの長さを累積することにより、すべての分割位置Xも表示さYれることを確認します。


2

Python 2、68 51バイト

バイトを大幅に節約してくれたxnorに感謝します!

フォームの2つの文字列"1,0,9 1,3,8"edc65のCの回答から取得)を受け取りTrueまたはを返す無名関数Falsemap(None)Python 3では動作しなくなった新しいバージョン。

lambda a,b:all(i in[j,","]for i,j in map(None,a,b))

テストスイート:

>>> def runTests(f):
    assert f("1,0,9 1,3,8","1 0,9 1,3 8")
    assert not f("1,0,9 1,3,8","1,0 9,1 3,8")
    assert f("1 0,9 1,3 8","1 0,9 1,3 8")
    assert not f("1 0,9 1,3 8","1,0,9 1,3,8")
    assert not f("1 0,9 1,3 8","1 0,9 1,3")
    assert not f("1 0,9 1,3,8","1 0,9 1,3")
    print("All tests pass.")


>>> runTests(lambda a,b:all(i in[j,","]for i,j in map(None,a,b)))
All tests pass.

次のように入力を受け取る以前の92バイトのソリューション"109 138"

def R(a,b):
 r=1
 for i in b.split():r&=a.find(i)==0;a=a[len(i):].strip()
 return r and""==a

Noneマッピングすることで、明示的な長さのチェックを回避できると思います。あるリストが別のリストよりも長い場合、1つのリストにはあるNoneが他のインデックスには番号があるため、i==j or"0">i>j保持できないため拒否されます。
xnor

私が何かを見逃していない限り、2番目のテストはになりますi==','。これはあなたのようにテストを組み合わせることができますi in[',',j](私たちが行うことができないi in ','+jので)jかもしれませんNone
xnor

@xnorうわー、ありがとう。#3は、私がPython 3で考えるのにかなり慣れているので、私には起こりませんでした。「bその場所に数字があるとしたら?」という理由で#2が発生しませんでした。...この入力形式では不可能であることを忘れています。
DLosc
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.