数字の空欄を埋める


8

次の形式の、正の整数の2タプルのリストが表示されます。

a1 b1, a2 b2, ..., an bn

つまり、2つのタプルはカンマで区切られ、各タプル内の整数はスペースで区切られます。すべてのa数値は、bs と同様に、厳密に昇順です。あなたの目標は「ギャップを埋める」ことです。これは、次のことを意味しています。

  • a i +1 == a i + 1の場合、何もしません。
  • そうでない場合、a i +1 <a i + 1の場合、次のようにタプルをシーケンスに挿入します:a i b i、a i +1 b i + 1、a i +2 b i + 1、...、a i + 1 -1 b i + 1、a i + 1 b i + 1

つまり、a iに「ギャップ」がある場合は、bsが挿入されたリストにさらに挿入し、b i + 1(ギャップの終わり)にします。

入力: 6 125, 7 170, 10 185

出力: 6 125, 7 170, 8 185, 9 185, 10 185

スコアリング:提出のスコアは、プログラムを構築するために必要なバイト数であり、上記のように文字列が与えられた場合、同じ形式でタプルの「満たされた」リストを出力します。

最低スコアが勝ちます!


少なくとも2つのタプルがあると想定できますか?
デニス

@デニスはい、できます。
Ryan

したがって、一般的に3つのタプルa1 b1, a2 b2, a3 b3の入力の場合、挿入をトリガーする唯一のペアはa1 b1, a3 b3の挿入をa2 b3必要としますが、どこに挿入する必要がありますか?
Peter Taylor

私の解釈では、aはa(min)からa(max)までカウントし、aの次に高いまたは等しい値に対してbを出力します。したがって、a = 8とa = 9がないため、どちらもa = 10のb値を使用します。
Hand-E-Food

1
出力は、スペースで区切られた括弧なしの同じ形式である必要がありますか?
Maltysen、2015

回答:


2

Pyth、31 30バイト

Jsrz7Pjds,R+ehfghTdcJ2\,}hJePJ

ジャクベのおかげで1バイト。

高レベルでは、aの範囲内の数値ごとに、その数値より大きいaがリストでフィルタリングされ、最初のタプルのbがbとして使用されます。

デモンストレーション。



4

Pythonの2、192 180の 171バイト

残念ながら、入力を解析して出力をフォーマットするには、1トンのバイトが必要です。また、私の脳をギアに蹴り入れてくれたSp3000に感謝します:)

n=[map(int,x.split())for x in input().split(',')]
for i in range(len(n)-1):j=0;exec'print n[i][0]+j,`n[i+(j>0)][1]`+",",;j+=1;'*(n[i+1][0]-n[i][0])
print n[-1][0],n[-1][1]

4

Python 3.5.0b1 +、123バイト

L=map(eval,(input()+",").split())
o=""
while L:
 *L,a,b=L;x=a-1
 while[x,b,*L][-2]<a:o=", %d %d"%(a,*b)+o;a-=1
print(o[2:])

入力の解析は面倒だったので、無視してそのまま解析しました。この意味は

6 125, 7 170, 10 185

として解析されます

[6, (125,), 7, (170,), 10, (185,)]

したがって、文字列フォーマットのスプラット。


バージョンについてなぜそれほど具体的ですか?
ベータ崩壊2015

@BetaDecayは、以前のリリースにはなかった、3.5.0ベータ1で導入された機能におそらく依存しています。
Alex A.

@BetaDecay Alexの発言、具体的にはPEP448-追加のアンパックの一般化。それ以外の場合は、代わりにまたは(a,*b)を実行する((a,)+b)必要があり(a,b[0])ます。古いバージョンのPythonではSyntaxError
Sp3000

3

JavaScriptの(ES6)、97 103

質問の文言が理解しづらいので、この例に基づいて作業を行いました。

最初の試みとして、1つの分割だけを使用した短い方法が考えられます。置換を使用して単一のパスで入力文字列をスキャンします。

f=l=>
  l.replace(/\d+/g,b=>{
    for(i=p||a-1;a&&i++<a;p=a)o+=`, ${i} `+b;
    a=a?0:b
  },p=a=o='')
&&o.slice(2)

// TEST

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

test=v=>out(v+'\n->'+f(v))

test('6 125, 7 170, 10 185')
<pre id=O></pre>
<input id=I><button onclick='test(I.value)'>-></button>


2

Haskell、152バイト

p(x,y)=", "++show x++' ':show y
(a:b:c)%x|a<x=c%x|0<1=(x,b)
g a=p.(a%)=<<[0+head a..last$init a]
main=interact$drop 2.g.(map(read.fst).lex=<<).words

使い方

p 単純な文字列フォーマットヘルパー関数です。

>>> p (6, 125)
", 6 125"

(%) 空白を埋めるための「ルックアップ」関数です。

>>> let nums = [6, 125, 7, 135, 10, 185]
>>> nums % 8
(8,185)

[head a..last$init a]使用する数値の範囲です。最初に解析された整数から2番目から最後までの整数が解析されます。(0+は、タイプチェッカーがプログラム全体がNum値を処理することを推測するのに役立ちます。それ以外の場合readは、何を解析するのかわかりません。)次に、範囲内で以前の関数concatMap(または=<<)を使用して、1つの大きな文字列を取得します。それが何をするかgです:

>>> g nums
", 6 125, 7 135, 8 185, 9 185, 10 185"

最後に、がありmainます。これはの形式なinteract$sので、私たちが気にするのは、stdinstdoutに変換する関数s :: String -> Stringだけです。

まず、入力を読み取るために、単語に分割します。

>>> (words) "6 125, 7 170, 10 185"
["6","125,","7","170,","10","185"]

次にconcatMapmap(read.fst).lexこのリストに対する関数です。一言で言えば、これは次のことを行います。

>>> (map(read.fst).lex) "125," :: [Int]
[125]

したがって、単語のリストの場合、がconcat [[6], [125], [7], ...] == [6, 125, 7...]渡されるリストであるを取得しgます。最後に、文字列からdropのリーディングによって得られます。", "g



2

Perl、67バイト

(66文字のコード+ 1文字のコマンドラインオプション)

s/(\b\d+ \d+)(?=, (?!(??{$k=$1+1}) ).+( \d+))/"$1, ".$k.$2/e&&redo

実行例:

perl -pe 's/(\b\d+ \d+)(?=, (?!(??{$k=$1+1}) ).+( \d+))/"$1, ".$k.$2/e&&redo' <<< "6 125, 7 170, 10 185"

説明: 一般的なアプローチは、次のトークンを先読みして1増加するかどうかを判断できる正規表現を作成することです(正規表現は算術でゴミなので、Perl実行を追加して追加を行い、それを探します)。一致しない場合は、この一致を元のテキストと、インデックスが増加した新しいトークンで置き換えます。次に、これが変更されなくなるまで、入力に対してこれを複数回繰り返します。

以下の説明では、「セクション」はコンマ区切りの値であり、「トークン」はこの中のスペース区切りの値です。

 s/     
   (\b\d+ \d+)             # Matches the first two numbers in a section
   (?=,                 # Look ahead to the next section
     (?!(??{$k=$1+1}) ) # Make sure the first token in the next section is not increased by one, store this value in $k. Happily, although our $1 contains TWO space separated numbers, it increases the first number and ignores the second - strange behaviour in Perl.
     .+                 # Ignore the actual value of first token of the next section (i.e. the index)
     ( \d+)             # Create a backreference on the second (i.e. the value)
   )   
 /                      # Start the replacement string...
   "$1, "               # Put the first section back into the result
   .$k                  # Append the increased index
   .$2                  # Append the value of the next token
 /e                     # Modifier - allows us to execute Perl inside the RegEx
 &&redo              # Repeat until it no longer changes the string

1

C#、174バイト

明確にするためにインデント:

class P{
    static void Main(string[]z){
        int a=0,b,i=-1;
        while(++i<z.Length){
            b=int.Parse(z[i++]);
            while(a<b)
                System.Console.Write((a==0?"":", ")+(a+=a==0?b:1)+" "+z[i].Trim(','));
        }
    }
}

1

Bash + coreutils、87

tr , \\n|while read a b
do for((p=p?p:a-1;p++<a;c=1)){
echo -n ${c+, }$p $b
}
p=$a
done

テスト出力:

$ echo "6 125, 7 170, 10 185" | ./fillblanks.sh 
6 125, 7 170, 8 185, 9 185, 10 185

1

Python 3、232バイト

それほど短くはありません、すでに投稿されているPythonソリューションとは異なる方法を使用しています

l=list(map(int,[y for x in input().split(',')for y in x.split(' ')]))
f=[];x=1
while x:
 x=0
 for i in range(0,len(l)-2,2):
  if l[i+2]-l[i]>1:l[:i+2]+=l[i]+1,;l[:i+3]+=l[i+4],;x+=1
for n in range(len(l)):print(l[n],end=','if n%2 else' ')

0

Java、229バイト

これをできる限り削ったと思います。Javaの答えを短くするより良いアプローチがあるかどうかを知りたいです:

String f(String s){String r="",g=" ",x[]=s.split(",\\s"),z[];int i=0,p=0,l=x.length,a,b;while(i<l){z=x[i].split(g);a=new Integer(z[0]);b=new Integer(z[1]);if(i++>0)while(a>++p)r+=p+g+b+", ";r+=a+g+b+(i==l?"":", ");p=a;}return r;}

フォーマット済み:

String f(String s) {
    String r = "", g = " ", x[] = s.split(",\\s"), z[];
    int i = 0, p = 0, l = x.length, a, b;
    while (i < l) {
        z = x[i].split(g);
        a = new Integer(z[0]);
        b = new Integer(z[1]);
        if (i++ > 0)
            while (a > ++p)
                r += p + g + b + ", ";
        r += a + g + b + (i == l ? "" : ", ");
        p = a;
    }
    return r;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.