题目链接

Data reformat

题目说明

整理内容格式,用分号把字段隔开。

开始文件

Place
Location
Like VimGolf
Like Supernatural
Date
Rating
Sex
Field type
Format
Size
Latitude
Longitude

Andorra Andorra la Vella Y Y 20200150 B M 2.050 P 50 42.506317 1.521835
Argentina Buenos Aires N Y 20191225 A M 13.020 S 4 -34.603722 -58.381592
Cuba Cayo Coco Y Y 20040512 C F 2.052 G 10 22.509001 -78.406998
Egypt The Pyramids of Giza N N 20101005 A M 13.202 D 4 29.976480 31.131302
France Provins Y Y 19780729 B M 1.052 C 13 48.560149 3.299203
Italy The Colosseum of Rome Y Y 20020922 C F 5.043 L 7 41.890251 12.492373
Haiti Port-au-Prince N N 19990101 A F 6.058 S 4 18.533333 -72.333336
Kenya Mombasa N Y 20000515 C F 2.011 T 60 -4.043740 39.658871
Maldives Athuruga Island N N 20040331 B F 5.060 H 2 3.887260 72.816154
Monaco Monte Carlo Y N 20200431 C M 1.025 S 4 43.740070 7.426644
Namibia Windhoek Public Library N N 20050528 B F 2.079 U 23 -22.563906 17.085548
Panama Panama Canal Y Y 19970814 C M 5.034 F 6 9.080000 -79.680000
Portugal Santa Cruz Y N 20171011 B F 2.077 H 2 32.688656 -16.791765
Russia The Moscow Kremlin N N 20070216 D M 6.041 X 5 55.752121 37.617664
Switzerland Grand Hotel Kempinski N Y 19950830 C M 9.041 K 6 46.210281, 6.151083
Tunisia El Mourouj Y Y 19961124 B F 2.055 L 7 36.713432 10.209552
Ukraine Odesa Y N 20130413 A M 4.064 G 10 46.469391 30.740883
United States Empire State Building N N 19880202 D F 1.044 X 5 40.748817 -73.985428

结束文件

Place;Location;Like VimGolf;Like Supernatural;Date;Rating;Sex;Field type;Format;Size;Latitude;Longitude
Andorra;Andorra la Vella;Y;Y;20200150;B;M;2.050;P;50;42.506317;1.521835
Argentina;Buenos Aires;N;Y;20191225;A;M;13.020;S;4;-34.603722;-58.381592
Cuba;Cayo Coco;Y;Y;20040512;C;F;2.052;G;10;22.509001;-78.406998
Egypt;The Pyramids of Giza;N;N;20101005;A;M;13.202;D;4;29.976480;31.131302
France;Provins;Y;Y;19780729;B;M;1.052;C;13;48.560149;3.299203
Italy;The Colosseum of Rome;Y;Y;20020922;C;F;5.043;L;7;41.890251;12.492373
Haiti;Port-au-Prince;N;N;19990101;A;F;6.058;S;4;18.533333;-72.333336
Kenya;Mombasa;N;Y;20000515;C;F;2.011;T;60;-4.043740;39.658871
Maldives;Athuruga Island;N;N;20040331;B;F;5.060;H;2;3.887260;72.816154
Monaco;Monte Carlo;Y;N;20200431;C;M;1.025;S;4;43.740070;7.426644
Namibia;Windhoek Public Library;N;N;20050528;B;F;2.079;U;23;-22.563906;17.085548
Panama;Panama Canal;Y;Y;19970814;C;M;5.034;F;6;9.080000;-79.680000
Portugal;Santa Cruz;Y;N;20171011;B;F;2.077;H;2;32.688656;-16.791765
Russia;The Moscow Kremlin;N;N;20070216;D;M;6.041;X;5;55.752121;37.617664
Switzerland;Grand Hotel Kempinski;N;Y;19950830;C;M;9.041;K;6;46.210281,;6.151083
Tunisia;El Mourouj;Y;Y;19961124;B;F;2.055;L;7;36.713432;10.209552
Ukraine;Odesa;Y;N;20130413;A;M;4.064;G;10;46.469391;30.740883
United States;Empire State Building;N;N;19880202;D;F;1.044;X;5;40.748817;-73.985428

最佳分数

38

我的分数

55

jqqJr;q9@qJkJ:%s/\v \ze(\w |\d|-)/;/g|%s/ /;<CR>f;r f r;ZZ

第一次尝试

这整个一编程题啊,想了半天,发现各种意外情况,最后总算弄对了,82 分,差了 44 分……

<C-Q>13G$A;<Esc>13J:%s/ /;<CR>:%s/\v (\w\ze |\d|-)/;\1/g<CR>:%s/\v(; | ;)/;/g<CR>f;r f r;ggf;x$xxZZ

第二次尝试

稍微优化一点。

<C-Q>11G$A;<Esc>13J:%s/ /;<CR>:%s/\v (\w\ze |\d|-)/;\1/g<CR>:%s/\v(; | ;)/;/g<CR>f;r f r;ggf;xZZ

79 分,还差 41 分。

第三次尝试

又一通优化,69 分,还差 31 分。

jqqJr;q9@qJkJ:%s/ /;<CR>:%s/\v (\w\ze |\d|-)/;\1/g<CR>:%s/ ;/;/g<CR>f;r f r;ZZ

第四次尝试

又一通优化,56 分,还差 18 分。

jqqJr;q9@qJkJ:%s/ /;<CR>:%s/\v \ze(\w |\d|-)/;/g<CR>f;r f r;ZZ

第五次尝试

稍微优化了一点,55 分,还差 17 分。

jqqJr;q9@qJkJ:%s/\v \ze(\w |\d|-)/;/g|%s/ /;<CR>f;r f r;ZZ

第六次尝试

按上边的思路应该不好优化了。主要问题在中间正则表达式替换那里,太啰嗦了,最后一行的处理也很有问题。参考下别人的吧。

@mcguire

qqJr;q11@qxjqaF r;q9@aqwj$10@aq16@wFEhr;qq-f r;q16@qZZ

54 分,只比我少 1 分。好家伙,全是用宏实现的。这个对数据格式要求太高了,没什么通用性,就不分析它了。麻烦的是,我看不到更低分的操作了。

那看来还得试试怎么优化宏。

第七次尝试

优化了半天宏,结果要 60 多分,果断放弃。然后发现之前的操作有一个优化点。

jqqJr;q9@qJkJ:%s/\v \ze(\w |\d|-)/;/g|%s/ /;<CR>wr f r;ZZ

54 分了。虽然只减了 1 分,好消息是可以看到 43 分的操作了。

@serycjon

qqJr;q11@qreqaF r;quqbj$10@a0,.q17@br ,r;ZZ

43 分,分析下吧。

qqJr;q11@qre 这个是处理第一行,比较普通。

qaF r;qu这个是重点,它是从后往前处理的,好处理多了,而且这里用了一个技巧,录制宏后用 u 把负面的效应恢复回去。

qbj$10@a0,.q 这个宏是用来处理下边每行数据的,先到行尾,然后从后往前替换掉 10 个空格(这些都没有例外情况),然后跳到行首。这个 , 就得理解下了,上次在 a 宏里调用的 F ,从后往前找空格,那 , 就是反过来,从前往后找下一个空格。. 调用的是 a 宏中 r; 操作,这样就把每一列第一个空格改成分号了。

17@b 是对下边所有行都操作一遍。最后一行有特殊情况,需要单独处理,把分号和空格互换就行了。

这虽然不是最佳操作,但能学的东西太多了,把这些融会贯通也绝对不是几天甚至几个月就能做到的。

自己操作一遍,基本消化了。

qaJr;q11@areqbF r;quqcj$10@b0,.q22@cr ,r;ZZ

但这个操作太紧凑了,没找到优化点。继续看其他的吧。

@mullno

qqJr;q11@qxqaF r;quqbj$10@a0,.q17@br ,r;ZZ

42 分。继续分析。这个不用分析了,和上边的基本一样,那为什么要少 1 分呢?因为它是错的!结果都不对。

那这下麻烦了,要想看到分数更低的操作,我也得“作弊”一次,达到 42 分,才可以看。而且作弊不是那么容易,要改程序代码。我再想想吧。

最佳操作

未知。

实用操作

@serycjon

qqJr;q11@qreqaF r;quqbj$10@a0,.q17@br ,r;ZZ

43 分。

对数据特点的把握以及对宏的灵活使用。

文章目录