Isi Angka Kosong

8

Anda diberi daftar 2-tupel bilangan bulat positif, dari formulir:

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

Dengan kata lain, 2-tupel dipisahkan oleh koma, dan bilangan bulat di dalam masing-masing tupel dipisahkan oleh ruang. Semua aangka dalam urutan ketat meningkat, serta bs. Tujuan Anda adalah "mengisi kekosongan." Yang dimaksud dengan itu adalah sebagai berikut:

  • Jika i +1 == a i +1 , jangan lakukan apa pun.
  • Jika i a +1 <a i +1 , Anda akan memasukkan tupel ke dalam urutan sebagai berikut: 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 .

Dengan kata lain, jika ada "celah" di a i , maka Anda akan memasukkan lebih banyak ke dalam daftar dengan bs yang dimasukkan menjadi b i + 1 (ujung celah).

Contoh :

Memasukkan: 6 125, 7 170, 10 185

Keluaran: 6 125, 7 170, 8 185, 9 185, 10 185

Penilaian : skor pengiriman adalah jumlah byte yang diperlukan untuk membangun sebuah program, ketika diberi string seperti yang dijelaskan di atas, menampilkan dalam format yang sama dengan daftar tuple "terisi".

Menang skor terendah!

Ryan
sumber
Bisakah kita berasumsi bahwa setidaknya akan ada dua tupel?
Dennis
@ Dennis ya Anda bisa.
Ryan
Jadi secara umum untuk input tiga tuple a1 b1, a2 b2, a3 b3, satu-satunya pasangan yang memicu sebuah insert a1 b1, a3 b3memerlukan insert a2 b3, tetapi di mana harus dimasukkan?
Peter Taylor
Interpretasi saya adalah bahwa a dihitung dari (min) hingga (maks) dan menghasilkan b untuk nilai tertinggi-atau-sama berikutnya dari a. Jadi karena tidak ada a = 8 dan a = 9, keduanya menggunakan nilai b untuk a = 10.
Hand-E-Food
1
apakah output harus dalam format yang sama dengan pemisahan ruang dan tidak ada tanda kurung?
Maltysen

Jawaban:

2

Pyth, 31 30 byte

Jsrz7Pjds,R+ehfghTdcJ2\,}hJePJ

Terima kasih 1 byte untuk Jakube.

Pada level tinggi, untuk setiap angka dalam kisaran a, daftar difilter untuk a lebih besar dari angka itu, maka b dari tupel pertama digunakan sebagai b.

Demonstrasi.

isaacg
sumber
4

CJam, 42 41 39 38 byte

q~,]:T(\-2=),>{IST2/z~\{I<!}#=,',S}fI&

Cobalah online di penerjemah CJam .

Dennis
sumber
4

Python 2, 192 180 171 Bytes

Sayangnya, dibutuhkan satu ton byte untuk mengurai input dan format output. Juga, terima kasih kepada Sp3000 untuk menendang otak saya :)

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]
Kade
sumber
4

Python 3.5.0b1 +, 123 byte

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

Mengurai input itu menyebalkan, jadi saya mengabaikannya dan menguraikannya seperti apa adanya. Ini artinya

6 125, 7 170, 10 185

diurai sebagai

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

karenanya percikan dalam format string.

Sp3000
sumber
Mengapa begitu spesifik untuk versi ini?
Beta Decay
@BetaDecay Mungkin mengandalkan fitur yang diperkenalkan pada 3.5.0 beta 1 yang tidak ada pada rilis sebelumnya.
Alex A.
@BetaDecay Apa yang dikatakan Alex, khususnya PEP448 - Generalisasi Pembongkaran Tambahan . Kalau tidak, alih-alih (a,*b)saya harus melakukan ((a,)+b)atau (a,b[0]). Versi Python yang lebih lama akan memberikan SyntaxError.
Sp3000
3

JavaScript ( ES6 ), 97 103

Menemukan pertanyaan yang sulit dimengerti, saya mendasarkan pekerjaan saya pada contoh.

Coba pertama, mungkin ada cara yang lebih pendek dengan hanya 1 split. Memindai string input dalam satu pass menggunakan penggantian.

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>

.

edc65
sumber
2

Haskell, 152 byte

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

Bagaimana itu bekerja

p adalah fungsi helper pemformatan string sederhana:

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

(%) adalah fungsi "pencarian" untuk mengisi kekosongan:

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

[head a..last$init a]adalah rentang angka yang digunakan: dari bilangan bulat pertama diurai hingga bilangan bulat kedua ke terakhir diurai. (The 0+membantu pemeriksa tipe menyimpulkan bahwa seluruh program berkaitan dengan Numnilai - nilai; jika readtidak, tidak tahu apa yang harus diuraikan.) Kemudian kita concatMap(atau =<<) fungsi kita sebelumnya pada rentang untuk mendapatkan satu string besar. Itu yang gdilakukannya:

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

Akhirnya ada main. Bentuknya seperti itu interact$s, jadi yang kita pedulikan adalah fungsi s :: String -> Stringyang mengubah stdin menjadi stdout .

Pertama, untuk membaca input, kami membaginya menjadi kata-kata:

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

Kemudian kita concatMapfungsi map(read.fst).lexatas daftar ini. Untuk satu kata, ini artinya:

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

Jadi untuk daftar kata, Anda dapatkan concat [[6], [125], [7], ...] == [6, 125, 7...], yang merupakan daftar yang ingin kami sampaikan g. Akhirnya, kita dropyang memimpin ", "dari string gmemberi kita.

Lynn
sumber
2

Perl, 67 byte

(66 karakter kode + 1 opsi baris perintah karakter)

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

Contoh eksekusi:

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

Penjelasan: Pendekatan umum adalah untuk membangun sebuah regex yang mampu melihat ke depan ke token berikutnya untuk menentukan apakah itu bertambah satu (regex adalah sampah di aritmatika, jadi kami menambahkan eksekusi perl untuk melakukan penambahan, kemudian mencari itu). Jika tidak, kami mengganti kecocokan ini dengan teks asli, ditambah token baru dengan peningkatan indeks. Kami kemudian mengulangi ini berkali-kali pada input sampai tidak berubah.

Untuk penjelasan di bawah ini, 'bagian' adalah nilai yang dipisahkan koma, dan 'token' adalah nilai-nilai yang dipisahkan ruang dalam ini.

 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
Jarmex
sumber
1

C #, 174 byte

Diindentasi untuk kejelasan:

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(','));
        }
    }
}
Makanan Tangan
sumber
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

Hasil tes:

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

Python 3, 232 byte

Tidak benar-benar yang singkat, tetapi menggunakan metode yang berbeda untuk solusi Python sudah diposting

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' ')
Peluruhan Beta
sumber
0

Java, 229 byte

Saya pikir saya telah meremehkan ini sebanyak yang saya bisa. Saya akan tertarik untuk melihat apakah ada pendekatan yang lebih baik yang mengarah pada jawaban Java yang lebih pendek:

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;}

Diformat:

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;
}
RCB
sumber