덮어 쓰기 * 라벨


23

정말 밀도가 높은 플롯에 레이블을 추가하려고 한 경우 레이블이 서로 겹치므로 레이블을 읽기가 어렵다는 것을 알게 될 것입니다. 우리는 비슷하지만 1D로 무언가를 할 것입니다.

입력은 일련의 (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 사이입니다.

  • 입력은 쌍이 모호하지 않고 입력에서 레이블 / 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

답변:


7

CJam, 24 23 19 바이트

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

입력을 좌표 레이블 쌍의 CJam 배열로 읽습니다.

보십시오 이 바이올린 CJam 인터프리터에서 또는 한 번에 모든 테스트 케이스를 확인합니다.

4 바이트 절약에 도움을 주신 @ MartinBüttner에게 감사합니다!

작동 원리

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 2016 년

4

자바 스크립트 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논리적으로 함께 처리 된 3 개의 식에서 익명 함수가 만들어집니다 . 처음 두 문장은 항상 진실이며 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

파이썬 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)]하고 결과를 인쇄합니다.

파이썬은 문자열을 수정하는 것을 허용하지 않으며, 목록과의 변환은 비쌉니다. 따라서 문자열 z을 다시 작성하여 새 단어를 추가합니다. 우리는 받아 b, 별표 다음 새 텍스트의 다음 부분 필요한 경우 공백으로 패딩, 단어 앞에 문자를 z새로운 단어 후를. 후행 공백은 추가되지 않습니다.

reduce버전은 더 이상 3 개 문자 (70)이다 :

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

3

루비, 94 81 75 바이트

골프 :

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

ungolfed 코드는 다음과 같습니다.

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

또한 .chomp제거 할 수 있다고 생각 합니다.
Cristian Lupascu

이 경우 이제 언급 했으므로 제거하는 것이 매우 안전하다고 생각합니다 .to_i. 좋은 생각이야 감사합니다 @ w0lf!
PotatoOmeletteSandwich

천만에요! 여기에 위의 팁을 적용한 더 짧은 버전과 ideone.com/BiOvV5가 더 있습니다. 원한다면 답변에 자유롭게 게시하십시오.
Cristian Lupascu

3
@PotatoOmeletteSandwich 루비를 업그레이드하십시오. 1.8.7은 수명이 다되었습니다! 또한 1 문자 절약 s[int, int]대신 양식 을 사용할 수 있어야합니다 s[range].
찰스

3

자바 스크립트 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(' ')에서는 짧습니다. 내 버전에서 내 저축의 대부분에서 온 (가) 삭제 "당신은 함수 또는 프로그램 중 하나를 제공 할 수 있습니다"규칙을 사용 eval(prompt())하는 대가로 c=> 내장의 사용 및 (b)에 Array.prototype.slice약간의 로직 부분을 단축하기 위해 나머지 매개 변수와 방법을 .
CR Drost

1
@ChrisDrost 아 물론 ... 나는 그것이 접근 자라는 것을 잊었다! 수치심 [].map.call(s[0],은 어느 것도 저장하지 않습니다 ...
Dom Hastings

2

파이썬, 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.
Kade

p=input()들여 쓰기를 피하는 함수 대신 (Python 2) 로 프로그램을 작성하여 문자를 절약 할 수 있다고 생각합니다 . 또한, b+len(a)+1수 있습니다b-~len(a)
XNOR

1
실제로, 프로그램은 단지 당신을 허용합니다 for a,b in input():.
xnor

2

펄, 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

펄, 65 바이트

62 바이트 스크립트 + 3 바이트 -p

각 줄을 인쇄하는 다른 버전 (1 바이트 미만)! (예, 질문을 제대로 읽지 못했기 때문에 이것을 만들었습니다 ...)

$}||=$"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이스케이프 문자와 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;
}

여기서 실행 중인지 확인

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.