*覆盖*标签


23

如果您曾经尝试过将标签添加到一个非常密集的图中,那么您将意识到有时标签会相互重叠,从而难以阅读。我们将执行类似的操作,但只是在一维中。

输入将是(label, x-coordinate)成对的序列,输出将是按给定顺序绘制每个点和标签的结果。*代表该点的星号应放在给定的x坐标处,并且标签应紧随其后。任何现有字符都将被覆盖。

例如,如果输入是

Hello  0
World  8
Fizz   3
Buzz   5
PPCG   16
X      9

然后将发生以下情况:

*Hello
*Hello  *World
*He*Fizz*World
*He*F*Buzzorld
*He*F*Buzzorld  *PPCG  
*He*F*Buz*Xrld  *PPCG

然后应输出最后一行。

I / O规则

  • 输入可以包含任意数量的对。每个标签仅包含大写和小写字母,并且标签长度最多为127个字符。每个x坐标在0到127之间(含0和127)。

  • 输入可以采用任何方便的列表或字符串格式,以使输入对明确无误,并且标签/ x坐标在输入中交替出现。例如,类似[("Hello", 0), ("World", 8) ...][0 "Hello" 8 "World" ...]很好的格式。但是,您可能不会假设标签和x坐标是两个单独的列表。

  • 功能和完整程序都可以。

  • 标签未覆盖的任何斑点均应以空格表示。但是,除单个可选的尾随换行符外,可能没有任何多余的前导或尾随空格。

例子

输入:

OneLabel   10

输出:

          *OneLabel

输入:

Heathrow   0
Edinburgh  2
London     4
Liverpool  6
Oxford     8

输出:

*H*E*L*L*Oxfordl

输入:

alpha     20
beta       4
gamma     57
delta      3
epsilon   22
zeta      32
eta       53
theta     27

输出:

   *delta           *a*epsi*thetazeta                *eta*gamma

输入:

abc  5
d    5
abc  10
ABCDEFGHIJKLMNOPQRSTUVWXYZ 127

输出:

     *dbc *abc                                                                                                                 *ABCDEFGHIJKLMNOPQRSTUVWXYZ

请注意,标签和/或x坐标可以重复。


如果x坐标为[0,127]并且字符串为(0,127],则标签可以从行的最右端开始运行还是受到保护?也就是说,“ foo 127”是否以“ *”结尾? “ * foo”?仅检查字符串的结尾应该是软结束还是硬结束
PotatoOmeletteSandwich

3
@PotatoOmeletteSandwich我的意图是使总长度适合255,因此最大输出长度将在x坐标127处有长度127标签时发生。最终输出不应以任何方式截断,除非要删除尾随空白。 。
Sp3000

Answers:


7

CJam,24 23 19字节

l~Sf.*'*f*:.{S^+1=}

这会将输入读取为坐标标签对的CJam数组。

在CJam解释器中尝试这种小提琴或立即验证所有测试用例。

感谢@MartinBüttner帮助我节省了4个字节!

怎么运行的

l~                   Read a line from STDIN and evaluate it.
  Sf                 For each pair, push the pair and " "; then:
    .*                 Perform vectorized repetition.
                         [X "label"] " " .* -> [(X spaces) "label"]
      '*f*           Join each resulting pair, using '*' as separator.
          :.{     }  Reduce by the following vectorized operator:
                       Push two characters (A and B).
             S^        Compute the symmetric difference of B and " ".
                       This pushes "B " for a non-space B and "" otherwise.
                +1=    Append and select the second character (with wrap).
                       This selects B for "AB " and A for "A".

2
我只是添加了一个测试用例,以为我会发表评论说不,这并没有破坏此提交内容-CJam的解释器输出只是自动换行。以防万一有人感到困惑。
Sp3000

4

Pyth,20个字节

V.Tmrj" *"d9Qpe+d-Nd

在线尝试:演示测试套件

说明

V.Tmrj" *"d9Qpe+d-Nd
   m        Q         map each pair d of the input to:
     j" *"d             join d by the string " *"
    r      9            range-length encode 
                        (this gives x-coordinate spaces, a star and the label)
 .T                   transpose this table 
V                     for N in ^:
                 -Nd    remove spaces from N
               +d       add a space at the beginning
              e         take the last character
             p          and print it (without newline)

1
这比我所拥有的要好得多。
isaacg 2015年

4

JavaScript ES6,104个字节

c=>(a=Array(255).fill(" "))&&c.map(([u,v])=>a.splice(u,v.length+1,..."*"+v))&&a.join``.replace(/ +$/,"")

用法示例

输入到兼容的控制台中:

t = [[0,"Hello"],[8,"World"],[3,"Fizz"],[5,"Buzz"],[16,"PPCG"],[9,"X"]];
(c=>(a=Array(255).fill(" "))&&c.map(([u,v])=>a.splice(u,v.length+1,..."*"+v))&&a.join``.replace(/ +$/,""))(t);

最后一条语句的输出:

"*He*F*Buz*Xrld  *PPCG"

说明

这将创建一个匿名函数,从c到三个逻辑与在一起的表达式。前两个语句始终是真实的,并且JS短路规则指出,只要第一个语句是真实的,就应在右侧返回整个值(不强制为布尔值):因此,这在形式上等效于

(function (c) {
    a = Array(255).fill(" ");                    // global variable `a` overwritten
    c.map(function (x) {                         // only side-effects are used here.
       var u = x[0], v = x[1];                   // ES6 destructuring
       a.splice(u, v.length + 1, ..."*" + v));   // main logic
    });
    return a.join("").replace(/ +$/, "");        // postprocessing and trim
})

由于赋值运算符的=优先级比逻辑AND运算符的优先级低,因此第一条语句必须用括号括起来&&

“剩余参数”程序集..."*"+v也是ES6的一部分;它将前导*字符串连接到字符串,然后将其解释为类似于列表的参数,将其拆分为提供给的一堆参数Array.prototype.splice,该参数接受(m, n, ...rest)并修改其数组m以移除n元素,然后插入所有rest参数。要在ES6之前完成此操作,您将使用更麻烦的方法:

[].slice.apply(a, [u, v.length + 1].concat(("*" + v).split("")))

然后,将数组与空字符串连接起来,并删除结尾的空格。


4

Python 2,67个字节

z=''
for a,b in input():z=(z+' '*b)[:b]+'*'+a+z[len(a)-~b:]
print z

像输入一样[('Heathrow', 0), ('Edinburgh', 2), ('London', 4), ('Liverpool', 6), ('Oxford', 8)]并打印结果。

Python不允许修改字符串,并且在列表之间进行转换非常昂贵。因此,这将重新创建z要添加新单词的字符串。我们b将单词前面的字符,如果需要的话用空格填充,然后在新文本上加上星号,然后z在新单词之后的部分。请注意,永远不会添加尾随空格。

reduce版本是3个字符长(70):

lambda I:reduce(lambda z,(a,b):(z+' '*b)[:b]+'*'+a+z[len(a)-~b:],I,"")

3

Ruby,94 81 75字节

打高尔夫球:

s=" "*128;$<.map{|l|w,p=l.split;p=p.to_i;s[p..w.size+p]="*"+w};$><<s.rstrip

这是未完成的代码:

s = " "*128
$<.map{|l|                 # for each line entered via stdin, ctrl+D to stop
  w,p = l.split            # had to move the chomp down here
  p = p.to_i               # there's no 'to_i!'...
  s[p..w.size+p] = "*"+w   # in the range of *foobar, replace the string
}
$><<s.rstrip               # output suggested by w0lf

感谢@ w0lf提供有关映射输入的建议!

感谢@ w0lf和@Not that Charles对于删除变量的想法。


请参阅Ruby高尔夫技巧。在这种情况下,您可以应用$ <。map {| l | ...}短于l = gets; ...; end tip的情况,并可能替换puts $><<(不需要额外的空间)。
Cristian Lupascu 2015年

另外,我认为.chomp可以删除。
克里斯蒂安·卢帕斯库

在这种情况下,既然您提到了它,我认为将其删除很安全,因为它.to_i会引起注意。好主意 谢谢@ w0lf!
PotatoOmeletteSandwich

别客气!这是一个较短的版本,在其中我应用了上面的提示以及其他一些提示:ideone.com/BiOvV5。如果愿意,可以随时将其发布在您的答案中。
克里斯蒂安·卢帕斯库

3
@PotatoOmeletteSandwich升级您的Ruby。1.8.7寿命已尽!此外,您应该可以使用s[int, int]表格而不是s[range]节省1个字符。
并不是查尔斯(Charles)

3

Javascript 121个字符

使用非标准功能,可在Firefox上运行。
x=Array(255).fill(" ");eval(prompt()).map(s=>{s[0].split``.map((n,i)=>x[s[1]+i+1]=n);x[s[1]]="*"});x=x.join``.trimRight()

旧版本: x=Array(255).fill(" ");eval(prompt()).map(s=>{s[0].split``.map((n,i)=>x[s[1]+i+1]=n);x[s[1]]="*"});x=x.join``.replace(/ +$/,"")

x=Array(255).fill(" ");      //Creates an array with spaces
eval(prompt())               //Gets some input, has to look like [["Hello",4],["Hi",14],["Oi",0]]
.map(s=>{s[0].split``.map((n,i)=>x[s[1]+i+1]=n);x[s[1]]="*"}); //Main "logic"
x=x.join``.replace(/ +$/,"") //Gets rid of the trailing spaces

1
/ +/ \s让我感到失望的失望更有意义!您可以使用x=' '.repeat(255);并避免使用字节.join吗?
Dom Hastings

1
@DomHastings:JS字符串是不可变的,因此您必须将.split('')其转换为可变的数据结构,但此时Array(255).fill(' ')较短。在我的版本中,我的大部分节省来自(a)使用“可以给函数或程序指定规则”删除eval(prompt())以换取c=> 和(b)使用Array.prototype.slice带有rest参数的内置方法来缩短逻辑部分。
CR Drost 2015年

1
@ChrisDrost当然是啊...我忘记了它只是一个访问者!羞耻[].map.call(s[0],也没有保存任何东西……
Dom Hastings 2015年

2

Python,85个字节

def g(p):
 z=[' ']*256
 for a,b in p:z[b:b+len(a)+1]='*'+a
 return''.join(z).rstrip()

在线尝试


1
您应该能够做到'z'[2::5](用反引号代替撇号)而不是''.join(z)保存一个字节,而移至z=[' ']*256参数应保存另一个字节。另外,我认为您可以更改returnprint
卡德2015年

我认为您可以通过使用p=input()(Python 2)而不是函数编写程序来节省字符,这可以避免缩进。另外,b+len(a)+1可以是b-~len(a)
xnor 2015年

1
实际上,一个程序可以让您做到for a,b in input():
xnor

2

Perl,66个字节

63个字节的脚本+ 3个字节的 -p

$}||=$"x128;/\s+/,substr$},$',1+length$`,"*$`"}{$_=$};s/\s+$/
/

没什么特别的,利用变量$`$'分别在“比赛之前”和“比赛之后” 的变量,而不是分割字符串。我将a $}用作字符串变量,因为它最初为我节省了一个字节,但是不再有用了!

示例运行:

$perl -p overwritlabels.pl <<< 'Hello  0
World  8
Fizz   3
Buzz   5
PPCG   16
X      9'
*He*F*Buz*Xrld  *PPCG

Perl,65个字节

62个字节的脚本+ 3个字节的 -p

另一版打印每行(少一个字节!)。(是的,我这样做是因为我没有正确阅读问题...)

$}||=$"x128;/\s+/;substr$},$',1+length$`,"*$`";$_=$};s/\s+$/
/

示例运行:

$perl -p overwritlabels.pl <<< 'Hello  0
World  8
Fizz   3
Buzz   5
PPCG   16
X      9'
*Hello
*Hello  *World
*He*Fizz*World
*He*F*Buzzorld
*He*F*Buzzorld  *PPCG
*He*F*Buz*Xrld  *PPCG

2

PHP-84字节

<? foreach(array_chunk(array_slice($argv,1),2) as $p) echo "␣[".($p[1]+1)."G*$p[0]";
                                                            ^ ESC character (\x1b)

使用ANSI转义码定位光标(\x1b[XG,以Escape字符和X为从1开始的坐标),然后是该*行的输入字符串。接受以下格式的命令行中的输入:

php filename.php Heathrow 0 Edinburgh 2 London 4 Liverpool 6 Oxford 8
php filename.php abc 5 d 5 abc 10 ABCDEFGHIJKLMNOPQRSTUVWXYZ 127

如果它们是引号,则接受多词输入,因为它们是命令行参数。


1

C ++ 11,95个字节

为什么不?

作为一个函数,map<int, string>v包含位置和字符串的名称接收输入。

string t(255,' ');for(auto&m:v){int i=m.first;t[i++]='*';for(auto&c:m.second)t[i++]=c;}cout<<t;

用法

#include <iostream>
#include <map>
using namespace std;
int main(){
    map<int,string> v{{0,"Heathrow"},{2,"Edinburgh"},{4,"London"},{6,"Liverpool"},{8,"Oxford"}};
    string t(255,' ');for(auto&m:v){int i=m.first;t[i++]='*';for(auto&c:m.second)t[i++]=c;}cout<<t;
}

检查它在这里运行

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.