* Ghi đè * nhãn


23

Nếu bạn đã từng thử thêm nhãn vào một cốt truyện thực sự dày đặc, thì bạn sẽ nhận ra rằng đôi khi các nhãn sẽ chồng chéo lên nhau, khiến chúng khó đọc. Chúng ta sẽ làm một cái gì đó tương tự nhưng trong 1D.

Đầu vào sẽ là một chuỗi các (label, x-coordinate)cặp và đầu ra sẽ là kết quả của việc vẽ từng điểm và nhãn theo thứ tự đã cho. Một dấu hoa thị *đại diện cho điểm nên được đặt tại tọa độ x đã cho và nhãn phải tuân theo. Bất kỳ nhân vật hiện có sẽ được ghi đè.

Ví dụ, nếu đầu vào là

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

Sau đó, những điều sau đây sẽ xảy ra:

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

Dòng cuối cùng nên được xuất ra.

Quy tắc I / O

  • Đầu vào có thể bao gồm bất kỳ số lượng các cặp. Mỗi nhãn sẽ chỉ bao gồm chữ hoa và chữ thường và độ dài nhãn sẽ nhiều nhất là 127 ký tự. Mỗi tọa độ x sẽ nằm trong khoảng từ 0 đến 127.

  • Đầu vào có thể ở bất kỳ danh sách thuận tiện hoặc định dạng chuỗi sao cho các cặp không rõ ràng và các nhãn / tọa độ x thay thế trong đầu vào. Ví dụ, một định dạng như [("Hello", 0), ("World", 8) ...]hoặc [0 "Hello" 8 "World" ...]là tốt. Tuy nhiên, bạn không được giả sử hai danh sách nhãn và tọa độ x riêng biệt.

  • Chức năng và chương trình đầy đủ đều ổn.

  • Bất kỳ điểm nào không được bao phủ bởi một nhãn phải được thể hiện bằng một khoảng trắng. Tuy nhiên, có thể không có bất kỳ khoảng trắng dẫn đầu hoặc dấu vết ngoại lai nào ngoài một dòng mới tùy chọn duy nhất.

Ví dụ

Đầu vào:

OneLabel   10

Đầu ra:

          *OneLabel

Đầu vào:

Heathrow   0
Edinburgh  2
London     4
Liverpool  6
Oxford     8

Đầu ra:

*H*E*L*L*Oxfordl

Đầu vào:

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

Đầu ra:

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

Đầu vào:

abc  5
d    5
abc  10
ABCDEFGHIJKLMNOPQRSTUVWXYZ 127

Đầu ra:

     *dbc *abc                                                                                                                 *ABCDEFGHIJKLMNOPQRSTUVWXYZ

Lưu ý rằng nhãn và / hoặc tọa độ x có thể được lặp lại.


Nếu các x x là [0,127] và các chuỗi là (0,127], một nhãn có thể chạy ở đầu bên phải của dòng hay nó được bảo vệ? Nghĩa là, "foo 127" kết thúc dòng bằng "*" hay "* foo"? Chỉ cần kiểm tra xem chuỗi nên có kết thúc mềm hay cứng.
PotatoOmeletteSandwich

3
@PotatoOmeletteSandwich Ý định của tôi là tổng chiều dài phù hợp trong phạm vi 255, do đó độ dài đầu ra tối đa sẽ xảy ra khi có một nhãn dài 127 ở tọa độ x 127. Đầu ra cuối cùng không được cắt bớt theo bất kỳ cách nào, ngoại trừ xóa khoảng trắng theo sau .
Sp3000

Câu trả lời:


7

CJam, 24 23 19 byte

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

Cái này đọc đầu vào dưới dạng một mảng CJam của các cặp nhãn tọa độ.

Hãy thử fiddle này trong trình thông dịch CJam hoặc xác minh tất cả các trường hợp thử nghiệm cùng một lúc.

Cảm ơn @ MartinBüttner đã giúp tôi tiết kiệm 4 byte!

Làm thế nào nó hoạt động

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
Tôi vừa thêm một trường hợp thử nghiệm và nghĩ rằng tôi sẽ để lại một bình luận nói rằng không, nó đã không phá vỡ đệ trình này - đầu ra thông dịch viên của CJam chỉ là kết thúc từ. Chỉ trong trường hợp bất cứ ai bị nhầm lẫn.
Sp3000

4

Bình thường, 20 byte

V.Tmrj" *"d9Qpe+d-Nd

Dùng thử trực tuyến: Trình diễn hoặc Test Suite

Giải trình

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
Đây là cách tốt hơn so với những gì tôi đã có.
isaacg

4

JavaScript ES6, 104 byte

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

Cách sử dụng ví dụ

Nhập vào bảng điều khiển tuân thủ:

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

Đầu ra từ câu lệnh cuối cùng:

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

Giải trình

Điều này tạo ra một hàm ẩn danh từ cba biểu thức đã được AND-logic cùng nhau. Hai câu lệnh đầu tiên luôn luôn là sự thật và các quy tắc ngắn mạch của JS nói rằng bất cứ khi nào câu lệnh đầu tiên là sự thật, hãy trả lại toàn bộ giá trị ở phía bên tay phải (không ép buộc với boolean): vì vậy điều này chính thức tương đương với

(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
})

Câu lệnh đầu tiên phải được gói trong ngoặc đơn ở trên vì toán tử gán =có độ ưu tiên thấp hơn toán tử AND-logic&& .

Việc lắp ráp "tham số phần còn lại" ..."*"+vcũng là một phần của ES6; nó nối một *chuỗi dẫn đến chuỗi và sau đó diễn giải nó thành một tham số giống như danh sách, chia nó thành một loạt các đối số được cung cấp Array.prototype.splice, lấy (m, n, ...rest)và sửa đổi mảng của nó tại vị trí mđể loại bỏ ncác phần tử và sau đó chèn tất cả các restđối số. Để thực hiện điều này trước ES6, bạn sẽ sử dụng nhiều thứ cồng kềnh hơn:

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

Mảng sau đó được nối với chuỗi rỗng và khoảng trắng ở cuối bị xóa.


4

Python 2, 67 byte

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

Có đầu vào như [('Heathrow', 0), ('Edinburgh', 2), ('London', 4), ('Liverpool', 6), ('Oxford', 8)] và in kết quả.

Python không cho phép các chuỗi được sửa đổi và chuyển đổi sang và từ một danh sách rất tốn kém. Vì vậy, điều này tạo lại chuỗi zđể thêm vào một từ mới. Chúng tôi lấy các bký tự trước từ, đệm bằng khoảng trắng nếu cần, sau đó văn bản mới có dấu hoa thị, sau đó là phần zsau từ mới. Lưu ý rằng dấu cách không bao giờ được thêm vào.

Các reducephiên bản là 3 ký tự dài hơn (70):

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

3

Ruby, 94 81 75 byte

Chơi gôn

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

Đây là mã không được mã hóa:

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

Cảm ơn @ w0lf về các đề xuất về ánh xạ đầu vào!

Cảm ơn @ w0lf và @ Không biết Charles đã nghĩ đến việc loại bỏ một biến.


Xem các mẹo chơi golf của Ruby . Trong trường hợp này, bạn có thể áp dụng $ <. Map {| l | ...} ngắn hơn trong khi l = got; ...; mẹo kết thúc và có thể thay thế puts bằng $><<(không yêu cầu thêm không gian).
Cristian Lupascu

Ngoài ra, tôi nghĩ rằng .chompcó thể được gỡ bỏ.
Cristian Lupascu

Trong trường hợp này, bây giờ bạn đề cập đến nó, tôi nghĩ rằng nó có thể rất an toàn để loại bỏ, vì .to_isẽ nắm bắt được điều đó. Tư tưởng tốt. Cảm ơn @ w0lf!
PotatoOmeletteSandwich

Không có gì! Đây là một phiên bản ngắn hơn trong đó tôi đã áp dụng các mẹo ở trên và một vài điều nữa: ideone.com/BiOvV5 . Hãy gửi nó trong câu trả lời của bạn nếu bạn thích nó.
Cristian Lupascu

3
@PotatoOmeletteSandwich Nâng cấp Ruby của bạn. 1.8.7 là cuối đời! Ngoài ra, bạn sẽ có thể sử dụng s[int, int]biểu mẫu thay vì s[range]tiết kiệm 1 char.
Không phải Charles

3

Javascript ký tự 121

Sử dụng các tính năng không chuẩn, hoạt động trên 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()

Phiên bản cũ hơn: 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
/ +/ làm cho nhiều ý nghĩa hơn \sthất vọng tôi đã bỏ lỡ điều đó! Bạn có thể lưu byte bằng cách sử dụng x=' '.repeat(255);và tránh .join?
Dom Hastings

1
@DomHastings: Chuỗi JS là bất biến nên bạn sẽ phải .split('')cấu trúc nó thành một cấu trúc dữ liệu có thể thay đổi, nhưng tại thời điểm đó Array(255).fill(' ')ngắn hơn. Trong phiên bản của tôi, phần lớn tiền tiết kiệm của tôi đến từ (a) bằng cách sử dụng quy tắc "bạn có thể cung cấp chức năng hoặc chương trình" để xóa để eval(prompt())đổi lấy c=> và (b) sử dụng Array.prototype.slicephương thức dựng sẵn với tham số phần còn lại để rút ngắn phần logic một chút .
CR Drost

1
@ChrisDrost ah tất nhiên ... Tôi quên nó chỉ là một phụ kiện! Xấu hổ [].map.call(s[0],không cứu được bất cứ ai ...
Dom Hastings

2

Python, 85 byte

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

Dùng thử trực tuyến


1
Bạn sẽ có thể làm 'z'[2::5](backticks thay vì dấu nháy đơn) thay vì ''.join(z)để lưu một byte và di chuyển z=[' ']*256đến các tham số sẽ lưu một byte khác. Ngoài ra, tôi nghĩ bạn có thể thay đổi returnđể print.
Kade

Tôi nghĩ bạn có thể lưu ký tự bằng cách viết chương trình bằng p=input()(Python 2) chứ không phải là hàm, để tránh thụt lề. Ngoài ra, b+len(a)+1có thểb-~len(a)
xnor

1
Trên thực tế, một chương trình chỉ cho phép bạn làm for a,b in input():.
xnor

2

Perl, 66 byte

Tập lệnh 63 byte + 3 byte cho -p

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

Không có gì quá đặc biệt, sử dụng các biến $`và lần lượt $'là 'trước trận đấu' và 'sau trận đấu', thay vì chia chuỗi. Tôi đã sử dụng một biến $}cho chuỗi như ban đầu nó tiết kiệm cho tôi một byte, nhưng không còn nữa!

Chạy ví dụ:

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

Perl, 65 byte

Tập lệnh 62 byte + 3 byte cho -p

Một phiên bản khác in ra từng dòng (cho một byte ít hơn!). (Vâng, tôi đã làm điều này bởi vì tôi đã không đọc câu hỏi đúng cách ...)

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

Chạy ví dụ:

$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 byte

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

Sử dụng mã thoát ANSI để định vị con trỏ ( \x1b[XG, có ký tự Escape và X là tọa độ dựa trên 1), theo *sau là chuỗi đầu vào cho hàng đó. Chấp nhận đầu vào trên dòng lệnh của biểu mẫu:

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

Chấp nhận các mục nhập nhiều từ nếu chúng nằm trong dấu ngoặc kép, vì chúng là đối số dòng lệnh.


1

C ++ 11, 95 byte

Tại sao không?

Là một hàm, nhận đầu vào dưới dạng có map<int, string>tên vchứa vị trí và chuỗi.

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

Sử dụng

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

Kiểm tra nó đang chạy ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.