* * * * * * * * Overwrit ป้าย


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 coords คือ [0,127] และสตริงนั้น (0,127] ฉลากสามารถวิ่งออกจากปลายด้านขวาสุดของบรรทัดหรือมันได้รับการปกป้องหรือไม่นั่นคือ "foo 127" จบด้วย "*" หรือ "* foo" เพียงตรวจสอบว่าสตริงควรมีจุดอ่อนหรือจุดแข็ง
PotatoOmeletteSandwich

3
@PotatoOmeletteSandwich ความตั้งใจของฉันคือเพื่อให้ความยาวทั้งหมดพอดีภายใน 255 ดังนั้นความยาวเอาต์พุตสูงสุดจะเกิดขึ้นเมื่อมีความยาว 127 ฉลากที่พิกัด x-127 127. ผลลัพธ์สุดท้ายไม่ควรถูกตัดทอนยกเว้นช่องว่างที่ต่อท้าย .
Sp3000

คำตอบ:


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

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

คำสั่งแรกจะต้องมีการห่อในวงเล็บข้างต้นเพราะผู้ประกอบการที่ได้รับมอบหมายมีความสำคัญต่ำกว่าตรรกะและผู้ประกอบการ=&&

แอสเซมบลี "พารามิเตอร์ที่เหลือ" ..."*"+vเป็นส่วนหนึ่งของ ES6 เช่นกัน มัน concatenates นำ*ไปสู่สตริงแล้วตีความมันเป็นพารามิเตอร์รายการเหมือนแยกมันเข้าไปในกลุ่มของข้อโต้แย้งที่มีให้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

นี่คือรหัส 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 และ @ ไม่ Charles สำหรับความคิดในการลบตัวแปร


ดูเคล็ดลับการเล่นกอล์ฟทับทิม ในกรณีนี้คุณสามารถใช้$ <. map {| l | ... } สั้นกว่าขณะที่ l = ได้รับ; ... ; ปลายปลายและอาจแทนที่puts ด้วย$><<(ซึ่งไม่ต้องการพื้นที่เพิ่มเติม)
Cristian Lupascu

นอกจากนี้ฉันคิดว่า.chompสามารถลบออกได้
Cristian Lupascu

ในกรณีนี้ตอนนี้คุณพูดถึงแล้วฉันคิดว่ามันน่าจะปลอดภัยมากที่จะลบออกตามที่.to_iจะเป็น ความคิดที่ดี ขอบคุณ @ w0lf!
PotatoOmeletteSandwich

ยินดีต้อนรับคุณ! ต่อไปนี้เป็นรุ่นที่สั้นกว่าที่ฉันใช้เคล็ดลับข้างต้นและอื่น ๆ อีกไม่กี่: ideone.com/BiOvV5 รู้สึกอิสระที่จะโพสต์ไว้ในคำตอบของคุณถ้าคุณชอบมัน
Cristian Lupascu

3
@PotatoOmeletteSandwich อัพเกรด Ruby ของคุณ 1.8.7 สิ้นสุดลงแล้ว! นอกจากนี้คุณควรจะสามารถใช้s[int, int]แบบฟอร์มแทนs[range]การออม 1 ถ่าน
ไม่ใช่ชาร์ลส์ที่

3

Javascript 121 chars

ใช้คุณสมบัติที่ไม่ได้มาตรฐานทำงานบน 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ผิดหวังฉันพลาดนั่น! คุณสามารถบันทึก bytes โดยใช้x=' '.repeat(255);และหลีกเลี่ยง.join?
Dom Hastings

1
@DomHastings: สตริง JS นั้นไม่เปลี่ยนรูปดังนั้นคุณต้อง.split('')ใส่ลงในโครงสร้างข้อมูลที่ไม่แน่นอน แต่ ณ จุดArray(255).fill(' ')นั้นจะสั้นกว่า ในรุ่นของฉันเงินออมส่วนใหญ่ของฉันมาจาก (a) โดยใช้กฎ "คุณสามารถให้ทั้งฟังก์ชันหรือโปรแกรม" เพื่อลบเพื่อeval(prompt())แลกกับc=> และ (b) โดยใช้Array.prototype.sliceวิธีbuiltin พร้อมพารามิเตอร์ส่วนที่เหลือเพื่อย่อส่วนตรรกะเล็กน้อย .
CR Drost

1
@ChrisDrost อ่าแน่นอน ... ฉันลืมไปเลยว่ามันเป็นแค่ accessor! Shame [].map.call(s[0],จะไม่บันทึกทั้ง ...
Dom เฮสติ้งส์

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](backticks แทน apostrophes) แทน''.join(z)การบันทึกหนึ่งไบต์และการย้ายz=[' ']*256ไปยังพารามิเตอร์ควรบันทึกอีก นอกจากนี้ผมคิดว่าคุณสามารถเปลี่ยนไปreturn print
Kade

ฉันคิดว่าคุณสามารถบันทึกตัวอักษรได้ด้วยการเขียนโปรแกรมด้วยp=input()(Python 2) มากกว่าฟังก์ชั่นซึ่งจะช่วยหลีกเลี่ยงการเยื้อง นอกจากนี้ยังb+len(a)+1สามารถb-~len(a)
xnor

1
for a,b in input():ที่จริงโปรแกรมเพียงแค่ช่วยให้คุณทำ
xnor

2

Perl, 66 ไบต์

สคริปต์ 63 ไบต์ + 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'
*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;
}

ตรวจสอบทำงานที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.