* Menimpa * label

23

Jika Anda pernah mencoba menambahkan label ke plot yang sangat padat, maka Anda akan menyadari bahwa kadang-kadang label akan tumpang tindih satu sama lain, membuatnya sulit untuk dibaca. Kita akan melakukan sesuatu yang serupa tetapi dalam 1D.

Input akan menjadi urutan (label, x-coordinate)pasangan, dan output akan menjadi hasil menggambar setiap titik dan label, dalam urutan yang diberikan. Tanda bintang yang *mewakili titik harus ditempatkan pada koordinat x yang diberikan dan label harus mengikuti. Setiap karakter yang ada akan ditimpa.

Misalnya, jika inputnya adalah

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

Maka yang berikut akan terjadi:

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

Baris terakhir harus di-outputkan.

Aturan I / O

  • Input dapat terdiri dari sejumlah pasangan. Setiap label hanya terdiri dari huruf besar dan kecil, dan panjang label paling banyak 127 karakter. Setiap koordinat x akan termasuk antara 0 dan 127 inklusif.

  • Input mungkin dalam format daftar atau string yang mudah sehingga pasangan tidak ambigu dan label / koordinat x berganti dalam input. Misalnya, format suka [("Hello", 0), ("World", 8) ...]atau [0 "Hello" 8 "World" ...]baik-baik saja. Namun, Anda tidak boleh mengasumsikan dua daftar label dan koordinat x yang terpisah.

  • Fungsi dan program lengkap keduanya baik-baik saja.

  • Setiap titik yang tidak tercakup oleh label harus diwakili dengan spasi. Namun, mungkin tidak ada spasi putih tambahan atau jejak tambahan selain dari satu baris tambahan opsional baru.

Contohnya

Memasukkan:

OneLabel   10

Keluaran:

          *OneLabel

Memasukkan:

Heathrow   0
Edinburgh  2
London     4
Liverpool  6
Oxford     8

Keluaran:

*H*E*L*L*Oxfordl

Memasukkan:

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

Keluaran:

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

Memasukkan:

abc  5
d    5
abc  10
ABCDEFGHIJKLMNOPQRSTUVWXYZ 127

Keluaran:

     *dbc *abc                                                                                                                 *ABCDEFGHIJKLMNOPQRSTUVWXYZ

Perhatikan bahwa label dan / atau koordinat x dapat diulang.

Sp3000
sumber
Jika x coords adalah [0,127] dan stringnya adalah (0,127), dapatkah label keluar dari ujung paling kanan dari garis, atau dilindungi? Yaitu, apakah "foo 127" mengakhiri garis dengan "*" atau "* foo"? Hanya memeriksa apakah string harus memiliki akhir yang lembut atau keras.
PotatoOmeletteSandwich
3
@PotatoOmeletteSandwich Tujuan saya adalah agar total panjang cocok dalam 255, sehingga panjang output maksimal akan terjadi ketika ada label panjang 127 di koordinat x 127. Output akhir tidak boleh dipotong dengan cara apa pun, kecuali untuk menghapus spasi spasi tambahan .
Sp3000

Jawaban:

7

CJam, 24 23 19 byte

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

Ini membaca input sebagai array CJam dari pasangan koordinat-label.

Coba biola ini dalam juru bahasa CJam atau verifikasi semua kasus uji sekaligus.

Terima kasih kepada @ MartinBüttner karena membantu saya menghemat 4 byte!

Bagaimana itu bekerja

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".
Dennis
sumber
2
Saya baru saja menambahkan test case dan berpikir saya akan meninggalkan komentar yang mengatakan bahwa tidak, itu tidak melanggar kiriman ini - output juru bahasa CJam hanya kata-kata. Kalau-kalau ada orang yang bingung.
Sp3000
4

Pyth, 20 byte

V.Tmrj" *"d9Qpe+d-Nd

Cobalah online: Demonstrasi atau Test Suite

Penjelasan

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)
Jakube
sumber
1
Ini jauh lebih baik daripada yang saya miliki.
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(/ +$/,"")

Contoh Penggunaan

Masukan ke konsol yang sesuai:

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

Keluaran dari pernyataan terakhir:

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

Penjelasan

Ini menciptakan fungsi anonim dari ctiga ekspresi yang secara logika-ANDed bersama. Dua pernyataan pertama selalu benar, dan aturan korsleting JS mengatakan bahwa setiap kali yang pertama adalah benar, kembalikan seluruh nilai di sisi kanan (tanpa paksaan ke boolean): jadi ini secara formal setara dengan

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

Pernyataan pertama harus dibungkus dalam tanda kurung di atas karena operator penugasan =memiliki prioritas lebih rendah daripada operator logika-DAN &&.

Rakitan "parameter istirahat" ..."*"+vjuga merupakan bagian dari ES6; itu menggabungkan memimpin *ke string dan kemudian menafsirkannya sebagai parameter daftar-suka, membaginya menjadi sekelompok argumen yang disediakan Array.prototype.splice, yang mengambil (m, n, ...rest)dan memodifikasi array pada posisi muntuk menghapus nelemen dan kemudian memasukkan semua restargumen. Untuk mencapai ini sebelum ES6 Anda akan menggunakan yang lebih rumit:

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

Array kemudian digabungkan dengan string kosong dan spasi spasi tambahan dihapus.

CR Drost
sumber
4

Python 2, 67 byte

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

Mengambil input suka [('Heathrow', 0), ('Edinburgh', 2), ('London', 4), ('Liverpool', 6), ('Oxford', 8)]dan mencetak hasilnya.

Python tidak mengizinkan string untuk dimodifikasi, dan mengkonversi ke dan dari daftar itu mahal. Jadi, ini menciptakan string zuntuk menambahkan kata baru. Kami mengambil bkarakter sebelum kata, padding dengan spasi jika diperlukan, lalu teks baru dengan tanda bintang, lalu bagian zsetelah kata baru. Perhatikan bahwa spasi tambahan tidak pernah ditambahkan.

The reduceversi 3 karakter lagi (70):

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

Ruby, 94 81 75 byte

Golf:

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

Berikut adalah kode yang tidak dikenali:

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

Terima kasih @ w0lf untuk saran tentang pemetaan input!

Terima kasih @ w0lf dan @Tidak itu Charles untuk pemikiran tentang menghapus variabel.

PotatoOmeletteSandwich
sumber
Lihat tips golf Ruby . Dalam hal ini Anda dapat menerapkan $ <. Map {| l | ...} lebih pendek dari pada saat l = mendapat; ...; ujung ujung dan mungkin ganti puts dengan $><<(yang tidak memerlukan ruang tambahan).
Cristian Lupascu
juga, saya pikir .chompbisa dihapus.
Cristian Lupascu
Dalam hal ini, sekarang setelah Anda menyebutkannya, saya pikir kemungkinan besar sangat aman untuk dihapus, karena .to_iakan menangkapnya. Pikiran yang bagus. Terima kasih @ w0lf!
PotatoOmeletteSandwich
Sama-sama! Berikut adalah versi yang lebih singkat di mana saya menerapkan kiat-kiat di atas dan beberapa lainnya: ideone.com/BiOvV5 . Jangan ragu untuk memposting di jawaban Anda jika Anda menyukainya.
Cristian Lupascu
3
@PotatoOmeletteSandwich Tingkatkan Ruby Anda. 1.8.7 sudah habis masa hidupnya! juga, Anda harus dapat menggunakan s[int, int]formulir alih-alih s[range]untuk tabungan 1 char.
Bukannya Charles
3

Javascript 121 karakter

Menggunakan fitur-fitur non-standar, berfungsi di 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()

Versi yang lebih lama: 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
Stefnotch
sumber
1
/ +/ jauh lebih masuk akal daripada \skecewa saya melewatkan itu! Bisakah Anda menyimpan byte menggunakan x=' '.repeat(255);dan menghindari .join?
Dom Hastings
1
@DomHastings: String JS tidak dapat diubah sehingga Anda harus .split('')membuatnya menjadi struktur data yang dapat berubah, tetapi pada saat Array(255).fill(' ')itu lebih pendek. Dalam versi saya, sebagian besar tabungan saya berasal dari (a) menggunakan aturan "Anda dapat memberikan fungsi atau program" untuk dihapus eval(prompt())dengan imbalan c=> dan (b) menggunakanArray.prototype.slice metode dengan parameter lainnya untuk mempersingkat bagian logika sedikit. .
CR Drost
1
@ ChrisDrost ah tentu saja ... Saya lupa itu hanya accessor! Malu [].map.call(s[0],juga tidak menyelamatkan ...
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()

Cobalah online

Mego
sumber
1
Anda harus dapat melakukan 'z'[2::5](backticks alih-alih apostrof) alih-alih ''.join(z)menyimpan satu byte, dan pindah z=[' ']*256ke parameter harus menyimpan yang lain. Juga, saya pikir Anda bisa berubah returnmenjadi print.
Kade
Saya pikir Anda dapat menyimpan karakter dengan menulis program dengan p=input()(Python 2) daripada fungsi, yang menghindari lekukan. Juga, b+len(a)+1bisab-~len(a)
xnor
1
Sebenarnya, sebuah program hanya memungkinkan Anda melakukannya for a,b in input():.
xnor
2

Perl, 66 byte

Script 63 byte + 3 byte untuk -p

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

Tidak ada yang terlalu istimewa, memanfaatkan variabel $` dan$' yang masing-masing 'sebelum pertandingan' dan 'setelah pertandingan', alih-alih membelah string. Saya menggunakan $}untuk variabel string seperti awalnya itu menyelamatkan saya satu byte, tetapi tidak lagi!

Contoh dijalankan:

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

Perl, 65 byte

Script 62 byte + 3 byte untuk -p

Versi lain yang mencetak setiap baris (kurang dari satu byte!). (Ya, saya membuat ini karena saya tidak membaca pertanyaan dengan benar ...)

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

Contoh dijalankan:

$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
Dom Hastings
sumber
2

PHP - 84 byte

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

Menggunakan kode pelarian ANSI untuk memposisikan kursor (\x1b[XG , menampilkan karakter Escape dan X menjadi koordinat berbasis 1), diikuti oleh *string input kemudian untuk baris itu. Menerima input pada baris perintah dari formulir:

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

Menerima entri multi-kata jika mereka dalam tanda kutip, karena mereka argumen argumen perintah.

Niet the Dark Absol
sumber
1

C ++ 11, 95 byte

Kenapa tidak?

Sebagai fungsi, terima input sebagai map<int, string>nama yang vberisi posisi dan string.

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

Pemakaian

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

Periksa Menjalankannya Di Sini

wendelbsilva
sumber