Grafik horizontal panjang kata

28

Memasukkan

Daftar kata yang dipisahkan oleh sejumlah spasi.

Keluaran

Grafik seni ASCII horizontal, di mana garis ke-n disusun oleh banyak tanda bintang ( *) seperti kata ke-ke-panjang.

Contoh penggunaan

The >sinyal input pengguna, Anda tidak harus memasukkan ketika menguji program.

> This is an example histogram of word length
****
**
**
*******
*********
**
****
******

> a aa aaa aaaa aaaaa
*
**
***
****
*****

> double space  example
******
*****
*******

Implementasi referensi

Jika ragu dengan spesifikasi, output dari program Anda harus sama persis dengan program di bawah ini di bawah semua input.

puts gets.chomp.split.map{|word| '*' * word.length}.join("\n")
Caridorc
sumber
Jadi, apakah baris baru tertinggal diperbolehkan? crosses fingers
Beta Decay
@BetaDecay Ya, diizinkan ...........
Caridorc
Apakah input akan memiliki spasi awal atau akhir?
PhiNotPi
8
Apa yang Anda gambarkan bukanlah histogram. Histogram akan menunjukkan jumlah kata dengan karakter x pada baris x. Dalam contoh pertama, baris 1 akan memiliki 0 tanda bintang (tidak ada kata dengan panjang 1) baris 2 akan memiliki 3 tanda bintang (adalah, an, dari) dan seterusnya.
nitro2k01
1
Oke, saya sadar Anda benar. Horisontal itu.
nitro2k01

Jawaban:

24

Retina , 5 + 3 = 8 byte

 +
\n
.
*

Setiap baris masuk dalam file sendiri, jadi saya telah menambahkan 1 byte untuk setiap file tambahan. Juga, \nharus diganti dengan baris baru yang sebenarnya.

Setiap pasangan garis adalah pasangan pengganti-pola. +cocok dengan satu atau lebih spasi dan menggantinya dengan baris baru. .cocok dengan karakter apa pun kecuali baris baru, dan menggantikannya dengan a *. Ini diterapkan secara global, sehingga setiap karakter diganti dengan a *.

NinjaBearMonkey
sumber
11

Pyth, 9 byte

jm*ld\*cz

Penjelasan:

jm*ld\*cz
       cz    chop input on whitespace
 m           map to
   ld        length of the segment
  *  \*      number of asterisks
j            joined on newlines
isaacg
sumber
10

CJam, 10 byte

r{,'**Nr}h

Cara kerjanya :

r{     r}h         e# This do-while loop basically reads all the whitespace separated tokens
                   e# from input. It separates the tokens on running lengths of whitespace
  ,                e# Take the length of the token
   '**             e# Get a string of that many '*' characters
      N            e# Print a new line

Cobalah online di sini

Pengoptimal
sumber
10

R - 33

write(gsub(".","*",scan(,"")),"")

dimana

  • scan(,"") membaca dari stdin dan membelah ruang putih menjadi vektor karakter.
  • gsub(".", "*", ...)mengganti semua karakter menjadi *.
  • write(..., "") mencetak ke stdout dengan "\ n" sebagai pemisah default.
flodel
sumber
10

Python 3, 43 byte:

for w in input().split():print('*'*len(w))

Terima kasih kepada @BetaDecay karena menunjukkan kesalahan sintaksis.

Contoh dijalankan:

> This is an example histogram of word length
****
**
**
*******
*********
**
****
******

(String di bawah ini dimasukkan sebagai teks, bukan sebagai teks)

> 'example\twith\nweird\rwhite   space'
*******
****
*****
**********

Bonus: histogram vertikal

Terima kasih kepada @Caridorc untuk menunjukkan kesalahan saya yang membuat bonus memiliki 1 hingga banyak baris.

l=[len(x)for x in input().split()]
for i in range(len(l)-1,0,-1):print(''.join(['*'if j>=i else' 'for j in l]))

Demo:

> This is an example histogram of word length
   **   
   **  *
   **  *
*  ** **
*  ** **
********
********

Bonus: histogram vertikal (terbalik)

l=[len(x)for x in input().split()]
for i in range(len(l)-1):print(''.join(['*'if j>i else' 'for j in l]))

Demo:

> This is an example histogram of word length
********
********
*  ** **
*  ** **
   **  *
   **  *
   **   
JF
sumber
Vertikal dinonaktifkan satu per satu
Caridorc
6

R, 38 byte (dengan bantuan komentar)

cat(gsub(" +|$","\n",gsub("\\S","*",x)))

Bagaimana itu bekerja

  • gsub mengganti semua tanpa spasi dengan *
  • kedua gsubmenambahkan \n(baris baru) ke akhir setiap elemen
  • cat mencetak sesuai

Demo

David Arenburg
sumber
6

> <> , 38 37 Bytes

Terkutuk Anda ruang ganda kasus * getar ikan *.

<v&0
 >i:84*=?v0(?;67*o&1&
 \ &0o?&a/

Kamu bisa mencobanya secara online (yang perlu Anda lakukan adalah memberi input melalui bidang di dekat bagian bawah lalu tekan Givetombol). Saran untuk bermain golf lebih lanjut selalu disambut, terutama gagasan untuk menghilangkan ruang-ruang yang boros di depan garis kedua dan ketiga.

Jika Anda diizinkan untuk mencetak baris baru tambahan untuk ruang tambahan, kode ini bisa menjadi 27 byte kekalahan :

>i:84*=?v0(?;67*o
^     oa<

Penjelasan

Catatan: urutan penjelasan akan sesuai dengan lokasi penunjuk (jadi jika kode dijelaskan dari apa yang akan dianggap urutan, itu karena urutan penunjuk yang menjalankannya).

Baris 1:

<v&0
<      redirects flow leftward
   0   pushes 0 onto the stack
  &    pops 0 and puts it in the register 
 v     redirects flow downward

Baris 2:

>i:84*=?v0(?;67*o&1&
>                     redirects flow leftward
 i:                   pushes input and then duplicates it
   84*                pushes 32 (the space character numerically)
      =?v             pops 32 and input and redirects flow downward if they're equal
         0(?;         pops input and terminates if input is less than 0*
             67*o     pushes 42 (asterisk) and prints it
                 &1&  pushes register value and then puts 1 in the register

*in ><>, the command i returns -1 if no input is given

Baris 3:

NB Baris ini terbalik, jadi baca kanan ke kiri.

 ^ &0o?&a<
         <  redirects flow leftward
        a   pushes 10 (newline) onto the stack
     o?&    prints a newline if the register is not 0
   &0       sets the register to 0
 ^          redirects flow upwards (back to the second line)

Pada dasarnya, tes program untuk memastikan input (yang dibaca satu karakter pada satu waktu) bukan spasi dan kemudian mencetak tanda bintang. Ini berakhir jika tidak ada input (nilai input -1). Untuk memastikan itu tidak mencetak baris baru tambahan, ia menggunakan nilai register, yang baik set ke 0 atau 1. Karena cara saya mengaturnya, itu tidak peduli tentang nilai-nilai asing yang didorong ke tumpukan (misalnya nilai register saat diset ke1 setelah mencetak tanda bintang); mereka tetap berada di tumpukan ketika program berakhir tetapi tidak melakukan apa pun.

Saya tahu itu mungkin agak membingungkan karena saya menggunakan 84*dan 67*bukannya masing " "- "*"masing, tapi itu karena saya tidak merasa ingin memasukkan string ke dalam program untuk alasan apa pun.

cole
sumber
Decay Beta
6

Javascript ES6

Fungsi, 46 karakter

f=s=>s.replace(/\S/g,'*').replace(/\s+/g,'\n')

Program, 55 karakter

alert(prompt().replace(/\S/g,"*").replace(/\s+/g,"\n"))
Qwertiy
sumber
Fungsi Anda sebenarnya 46 karakter, dan program Anda adalah 55.
adroitwhiz
@ darkness3560, terima kasih atas koreksinya. Saya menggunakan ungkapan suka "f=s=>s.replace(/\S/g,'*').replace(/\s+/g,'\n')".lengthmengukur panjang dan melupakan \.
Qwertiy
6

Perl, 16 byte (15 karakter + -p)

y/ /
/s;s/./*/g

Jalankan sebagai:

$ perl -pe 's/ +/
/g;s/./*/g' <<< 'This is a test'
****
**
*
****

Menyimpan byte tambahan, terima kasih kepada @ThisSuitIsBlackNot , saya belum pernah bertemu y///ssebelumnya!

Dom Hastings
sumber
Ini luar biasa! Anda dapat menyimpan 1 byte dengan mengubah subtitusi pertama menjadi transliterasi:y/ /\n/s;
ThisSuitIsBlackNot
@ ThisSuitIsBlackNot Ooh bagus! Terima kasih!
Dom Hastings
5

Gema, 11 9 karakter

 =\n
?=\*

Contoh dijalankan:

bash-4.3$ gema ' =\n;?=\*' <<< 'This is an example histogram of word length'
****
**
**
*******
*********
**
****
******

bash-4.3$ gema ' =\n;?=\*' <<< 'a aa aaa aaaa aaaaa'
*
**
***
****
*****

bash-4.3$ gema ' =\n;?=\*' <<< 'double space  example'
******
*****
*******
manatwork
sumber
5

PHP 5.3, 55 53 51 50 byte

<?for(;$i<strlen($a);){echo$a{$i++}!=' '?'*':"
";}


Penggunaan:
Panggil Script dan tentukan variabel global ($ a)
php -d error_reporting=0 script.php?a="This is an example histogram of word length"

Output:

****
**
**
*******
*********
**
****
******
jrenk
sumber
4

Java, 102 byte

class R{public static void main(String[]a){for(String s:a)System.out.println(s.replaceAll(".","*"));}}
Koekje
sumber
4

Haskell, 31 byte

putStr.unlines.map(>>"*").words

Contoh penggunaan:

Main> putStr.unlines.map(>>"*").words $ "This is an example histogram of word length"
****
**
**
*******
*********
**
****
******
nimi
sumber
Anda dapat mengganti putStr.dengan f=untuk menurunkan jumlah byte, atau menggunakan main=interact$alih-alih putStr.membaca dari STDIN dan menjadikannya program yang lengkap
HEGX64
@ HEGX64: tetapi f=unlines.map(>>"*").wordsmengembalikan sesuatu seperti "****\n**\n**\n"dan tidak menampilkan "grafik seni ASCII horizontal" seperti yang diminta.
nimi
4

CJam, 11 byte

Bersaing untuk tempat kedua di CJam setelah @Optimizer menemukan solusi 10 byte yang cerdas. Ini adalah solusi 11 byte langsung:

lS%:,'*f*N*

Cobalah online

Solusi alternatif yang menggunakan loop alih-alih dua peta, juga 11 byte:

lS%{,'**N}/

Penjelasan untuk solusi pertama:

l     Get input.
S%    Split at spaces.
:,    Apply length operator to each word.
'*f*  Map each length to corresponding repetitions of '*.
N*    Join with newlines.
Reto Koradi
sumber
4

JavaScript (ES6), 37

f=s=>s.replace(/./g,m=>m<"!"?`
`:'*')

Versi lebih pendek hanya menggunakan satu replace.

Cristian Lupascu
sumber
2
Sial, saya baru saja menyelesaikan fungsi ES6 saya, 38 byte. Ambil upvote saya saat saya melarikan diri karena malu! : D
MayorMonty
4

J, 10 byte

   '*'$~$&>;:'This is an example histogram of word length'
****     
**       
**       
*******  
*********
**       
****     
******

Bonus: vertikal (12 byte)

   |:'*'$~$&>;:'This is an example histogram of word length'
********
********
*  ** **
*  ** **
   **  *
   **  *
   **   
    *   
    *   

Bonus: terbalik vertikal (14 byte)

   |.|:'*'$~$&>;:'This is an example histogram of word length'
    *   
    *   
   **   
   **  *
   **  *
*  ** **
*  ** **
********
********
hoosierEE
sumber
3

Python 3, 72 byte

Satu liner yang bagus :)

print(''.join(map(lambda x:"*"*len(x)+"\n"*int(x!=""),input().split())))

Keluaran:

>>> print(''.join(map(lambda x:"*"*len(x)+"\n"*int(x!=""),input().split())))
Hello world  how are you?
*****
*****
***
***
****

Ada baris baru di sini. Jika Anda menginginkannya tanpa, Anda harus menambahkan 5 byte:

print(''.join(map(lambda x:"*"*len(x)+"\n"*int(x!=""),input().split()))[:-1])
Peluruhan Beta
sumber
3

Julia, 50 byte

s->print(join(["*"^length(w)for w=split(s)],"\n"))

Ini menciptakan fungsi tanpa nama yang mengambil string sebagai input dan mencetak ke STDOUT.

Tidak Terkumpul:

function f(s::String)
    # Construct a vector of horizontal bars
    bars = ["*"^length(w) for w in split(s)]

    # Join the bars with newlines
    j = join(bars, "\n")

    # Print the result to STDOUT
    print(j)
end
Alex A.
sumber
3

JavaScript (ES5)

Program, 54 karakter

alert(prompt().replace(/\S/g,'*').replace(/ +/g,'\n'))

Fungsi, 60 karakter

function(i){return i.replace(/\S/g,'*').replace(/ +/g,'\n')}

Contoh penggunaan:

var h=function(i){return i.replace(/\S/g,'*').replace(/ +/g,'\n')},
d=document,g=d.getElementById.bind(d),i=g('i'),o=g('o')
i.onchange=function(){o.textContent=h(i.value)}
<input id="i"/>
<pre id="o"></pre>

Patrick Roberts
sumber
3

Matlab - 54 byte

s=input('');o=repmat('*',1,numel(s));o(s==32)=char(10)

Ini berjalan dari konsol, akan mengambil string dalam input dari stdindan akan menampilkan grafik kata horizontal di stdout:

Contoh:

>> s=input('');o=repmat('*',1,numel(s));o(s==32)=char(10)
'This is an example histogram of word length'
o =
****
**
**
*******
*********
**
****
******

Atau kita dapat mencoba membuat beberapa bentuk mewah:

>> s=input('');o=repmat('*',1,numel(s));o(s==32)=char(10)
'a aa aaa aaaaaa aaaaaaaaaa aaaaaaaaaaa aaaaaaaaaa aaaaaa aaa aa a aa aaa aaaaaa aaaaaaaaaa'
o =
*
**
***
******
**********
***********
**********
******
***
**
*
**
***
******
**********
Hoki
sumber
Pendekatan yang sangat pintar!
Luis Mendo
3

Matlab / Oktaf, 75 byte

Menggunakan fungsi anonim:

@(s)char(arrayfun(@(n)repmat('*',1,n),diff([0 find([s 32]==32)])-1,'un',0))

Terima kasih kepada Hoki karena menemukan kesalahan yang mencegah kata terakhir terdeteksi.

Contoh penggunaan (Matlab):

>> @(s)char(arrayfun(@(n)repmat('*',1,n),diff([0 find([s 32]==32)])-1,'un',0)) % define function
ans = 
    @(s)char(arrayfun(@(n)repmat('*',1,n),diff([0,find([s,32]==32)])-1,'un',0))
>> ans('This is an example histogram of word length') % call function
ans =
****     
**       
**       
*******  
*********
**       
****     
******   

Atau coba online (Oktaf).

Luis Mendo
sumber
3

PowerShell, 35 31 Bytes

Cukup kompetitif untuk perubahan. Go go gadget operator unary. Saya juga terus lupa bahwa parens pada beberapa fungsi, seperti -splitdan -replacedigunakan di sini, adalah opsional.

%{$_-split"\s+"-replace".","*"}

Dipanggil melalui input pipa (setara dengan stdin untuk PowerShell):

PS C:\Tools\Scripts\golfing> "a aa aaa" | %{$_-split"\s+"-replace".","*"}
*
**
***

Sebagai bonus, jika kita bisa menggunakan argumen command-line, kita bisa turun ke 20 Bytes dan memiliki sesuatu yang berfungsi baik dengan dan tanpa string tunggal sebagai input:

$args-replace".","*"

PS C:\Tools\Scripts\golfing> .\horizontal-graph-word-length.ps1 "double space  example"
******
*****
*******

PS C:\Tools\Scripts\golfing> .\horizontal-graph-word-length.ps1 double space  example
******
*****
*******
AdmBorkBork
sumber
3

Javascript (ES6)

Solusi baru (39 byte):

s=>[...s].map(c=>c==' '?`
`:'*').join``

Solusi Regex (42 byte):

s=>s.replace(/\S/g,"*").replace(/ +/g,`
`)

Solusi non-regex (71 byte):

s=>s.split(" ").map(v=>"*".repeat(v.length)).filter(a=>a!="").join(`
`)

Solusi ini menentukan fungsi anonim. Tetapkan mereka ke variabel atau panggil mereka seperti itu:

(s=>s.replace(/\S/g,"*").replace(/ +/g,`
`))("[your string here]")

(s=>s.split(" ").map(v=>"*".repeat(v.length)).filter(a=>a!="").join(`
`))("[your string here]")
adroit whiz
sumber
2

SWI-Prolog, 40 byte

a([A|T]):-(A=32,nl;put(42)),(T=[];a(T)).

Dipanggil dengan string kode, mis a(`This is an example histogram of word length`).

Fatalisasi
sumber
2

STATA, 72 byte

di _r(a)
token "$a"
while ("`1'")!=""{
di _d(`=length("`1'")')"*"
ma s
}

Tidak disatukan

display _request(a) //get input via prompt
tokenize "$a" //split a by spaces into the variables 1,2,...
while ("`1'")!=""{ //while the first variable is not empty
display _dup(`=length("`1'")')"*" //display "*" duplicated for every character in variable 1.
macro shift //move variable 2 to 1, 3 to 2, etc.
}

Perhatikan bahwa kode ini tidak berfungsi dalam juru bahasa online dan memerlukan juru bahasa STATA yang tidak bebas.

tanda
sumber
2

C ++ 14, 107 106 byte

#include<iostream>
main(){std::string s;for(;std::cin>>s;){for(char c:s)std::cout<<'*';std::cout<<'\n';}}
sweerpotato
sumber
2

K5, 31 byte

`0:{(#x)#"*"}'f@&0<#:'f:" "\0:`
kirbyfan64sos
sumber
2

O, 22 byte

i' /rl{e{'.'*%p}{;}?}d

Penjelasan

i                         Read the user input
 ' /r                     Split on spaces and reverse
     l{             }d    For each element
       e           ?      If it's not empty
        {'.'*%            Replace every char with an asterick
              p}          And print it
                {;}       Else, just pop it off the stack
kirbyfan64sos
sumber
2

Beam, 92 Bytes

Ini bukan jawaban yang kompetitif sama sekali dan benar-benar terlambat, tetapi saya telah bermain-main dengan Beam akhir-akhir ini dan ingin melihat apakah saya bisa mendapatkannya untuk melakukan ini. Akhirnya berhasil :)

'''''''>`++++++)v
vgLsP-(---`<''P'<
>rnp+v
  >Sv>++v
    (>`v+
    H^ )+
^Sp`@p'<+
^  @++++<

MickyT
sumber
1

AWK

 awk '{for(i=1;i<=NF;i++){while(k++<length($i)){printf "*"};k=0;print ""}}'

contoh

 echo "this is programming" | awk '{for(i=1;i<=NF;i++){while(k++<length($i)){printf "*"};k=0;print ""}}'

keluaran:-

****
**
***********
Shravan Yadav
sumber