Biểu đồ ngang của chiều dài từ


28

Đầu vào

Một danh sách các từ được phân tách bằng bất kỳ số lượng khoảng trắng.

Đầu ra

Một biểu đồ nghệ thuật ASCII nằm ngang, trong đó dòng thứ n được tạo bởi nhiều dấu hoa thị ( *) khi từ thứ n dài.

Ví dụ sử dụng

Các >đầu vào tín hiệu sử dụng, bạn không nên đầu vào nó khi kiểm tra chương trình.

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

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

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

Thực hiện tham khảo

Trong trường hợp nghi ngờ về đặc điểm kỹ thuật, đầu ra của chương trình của bạn phải khớp chính xác với chương trình dưới đây trong tất cả các đầu vào.

puts gets.chomp.split.map{|word| '*' * word.length}.join("\n")

Vì vậy, một dòng mới được phép? bắt chéo ngón tay
Beta Decay

@BetaDecay Có, được phép ...........
Caridorc

Đầu vào bao giờ sẽ có không gian hàng đầu hoặc dấu?
PhiNotPi

8
Những gì bạn đang mô tả không phải là một biểu đồ. Một biểu đồ sẽ hiển thị số lượng từ có x ký tự trên dòng x. Trong ví dụ đầu tiên, dòng 1 sẽ có 0 dấu sao (không có từ nào có độ dài 1) dòng 2 sẽ có 3 dấu sao (is, an, of), v.v.
nitro2k01

1
Ok, tôi nhận ra bạn đúng. Ngang nó là.
nitro2k01

Câu trả lời:


24

Võng mạc , 5 + 3 = 8 byte

 +
\n
.
*

Mỗi dòng đi trong tệp riêng của nó, vì vậy tôi đã thêm 1 byte cho mỗi tệp bổ sung. Ngoài ra, \nnên được thay thế bằng một dòng mới thực tế.

Mỗi cặp dòng là một cặp thay thế mẫu. +phù hợp với một hoặc nhiều khoảng trắng và thay thế nó bằng một dòng mới. .phù hợp với bất kỳ ký tự nào ngoại trừ một dòng mới và nó thay thế bằng một *. Điều này được áp dụng trên toàn cầu, vì vậy mọi ký tự được thay thế bằng a *.


11

Bình thường, 9 byte

jm*ld\*cz

Giải trình:

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

10

CJam, 10 byte

r{,'**Nr}h

Cách thức hoạt động :

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

Dùng thử trực tuyến tại đây


10

R - 33

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

Ở đâu

  • scan(,"") đọc từ stdin và tách trên khoảng trắng thành một vectơ ký tự.
  • gsub(".", "*", ...)thay thế tất cả các nhân vật vào *.
  • write(..., "") in ra thiết bị xuất chuẩn với "\ n" làm dấu phân cách mặc định.

10

Python 3, 43 byte:

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

Cảm ơn @BetaDecay đã chỉ ra lỗi cú pháp.

Chạy mẫu:

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

(Chuỗi bên dưới được nhập dưới dạng chữ, thay vì dưới dạng văn bản)

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

Tiền thưởng: biểu đồ dọc

Cảm ơn @Caridorc đã chỉ ra lỗi của tôi khiến tiền thưởng có từ 1 đến nhiều hàng.

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

Bản giới thiệu:

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

Phần thưởng: biểu đồ dọc (lộn ngược)

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

Bản giới thiệu:

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

Dọc được tắt bởi một
Caridorc

6

R, 38 byte (với một số trợ giúp trong nhận xét)

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

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

  • gsub thay thế tất cả các khoảng trống bằng *
  • thứ hai gsubthêm \n(dòng mới) vào cuối mỗi phần tử
  • cat in phù hợp

Bản giới thiệu


6

> <> , 38 37 byte

Nguyền rủa bạn đôi trường hợp không gian * lắc cá *.

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

Bạn có thể thử trực tuyến (tất cả những gì bạn cần làm là cung cấp đầu vào thông qua trường gần phía dưới và sau đó nhấn Givenút). Những gợi ý cho việc chơi gôn tiếp tục luôn được hoan nghênh, đặc biệt là những ý tưởng để loại bỏ những không gian lãng phí đó trước hàng thứ hai và thứ ba.

Nếu bạn được phép in một dòng mới bổ sung cho các khoảng trắng thừa, mã có thể là một con số khổng lồ 27 byte :

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

Giải trình

Lưu ý: thứ tự giải thích sẽ tương ứng với vị trí của con trỏ (vì vậy nếu mã được giải thích theo thứ tự người ta sẽ xem xét thứ tự, thì đó là vì đó là thứ tự mà con trỏ thực thi nó).

Dòng 1:

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

Dòng 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

Dòng 3:

NB Dòng này đi ngược lại, vì vậy đọc từ phải sang trái.

 ^ &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)

Về cơ bản, chương trình kiểm tra để đảm bảo đầu vào (được đọc một ký tự một lần) không phải là khoảng trắng và sau đó in dấu hoa thị. Nó chấm dứt nếu không có đầu vào (giá trị đầu vào là -1). Để đảm bảo nó không in các dòng mới bổ sung, nó sử dụng giá trị đăng ký, nó đặt thành 0 hoặc 1. Do cách tôi thiết lập, nó không quan tâm đến các giá trị không liên quan được đẩy lên ngăn xếp (ví dụ: giá trị của thanh ghi khi nó đặt thành 1sau khi in dấu hoa thị); họ vẫn ở trên ngăn xếp khi chương trình kết thúc nhưng không làm gì cả.

Tôi biết nó có thể hơi khó hiểu kể từ khi tôi sử dụng 84*67*thay vào đó " ""*"tương ứng, nhưng đó là vì tôi không cảm thấy muốn đưa các chuỗi vào chương trình vì bất kỳ lý do gì.



6

Javascript ES6

Chức năng, 46 ký tự

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

Chương trình, 55 ký tự

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

Chức năng của bạn thực sự dài 46 ký tự và chương trình của bạn là 55.
adroitwhiz

@ dark3560, cảm ơn bạn đã sửa chữa. Tôi đã sử dụng các biểu thức như "f=s=>s.replace(/\S/g,'*').replace(/\s+/g,'\n')".lengthđể đo chiều dài và quên đi \.
Qwertiy

6

Perl, 16 byte (15 ký tự + -p)

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

Chạy như:

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

Đã lưu một byte bổ sung, nhờ @ ThisSuitIsBlackNot , tôi đã không gặp phải y///strước đây!


Thật tuyệt vời! Bạn có thể tiết kiệm 1 byte bằng cách thay đổi lần thay thế đầu tiên thành phiên âm:y/ /\n/s;
ThisSuitIsBlackNot

@ ThisSuitIsBlackNot Ooh tốt đẹp! cảm ơn bạn!
Dom Hastings

5

Gema, 11 9 ký tự

 =\n
?=\*

Chạy mẫu:

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'
******
*****
*******

5

PHP 5.3, 55 53 51 50 byte

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


Cách sử dụng:
Gọi Script và xác định biến toàn cục ($ a)
php -d error_reporting=0 script.php?a="This is an example histogram of word length"

Kết quả:

****
**
**
*******
*********
**
****
******

4

Java, 102 byte

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

4

Haskell, 31 byte

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

Ví dụ sử dụng:

Main> putStr.unlines.map(>>"*").words $ "This is an example histogram of word length"
****
**
**
*******
*********
**
****
******

bạn có thể thay thế putStr.bằng f=cách hạ thấp số byte hoặc sử dụng main=interact$thay vì putStr.đọc từ STDIN và biến nó thành một chương trình hoàn chỉnh
HEGX64

@ HEGX64: nhưng f=unlines.map(>>"*").wordstrả về một cái gì đó giống như "****\n**\n**\n"và không xuất ra "biểu đồ nghệ thuật ASCII ngang" như yêu cầu.
nimi

4

CJam, 11 byte

Cạnh tranh vị trí thứ hai tại CJam sau khi @Optimizer tìm thấy giải pháp 10 byte thông minh. Đây là một giải pháp 11 byte đơn giản:

lS%:,'*f*N*

Dùng thử trực tuyến

Giải pháp thay thế sử dụng một vòng lặp thay vì hai bản đồ, cũng là 11 byte:

lS%{,'**N}/

Giải thích cho giải pháp đầu tiên:

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.

4

JavaScript (ES6), 37

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

Phiên bản ngắn hơn chỉ sử dụng một replace.


2
Khỉ thật, tôi vừa hoàn thành chức năng ES6, 38 byte. Lấy upvote của tôi trong khi tôi chạy trốn trong sự xấu hổ! : D
MayorMonty

4

J, 10 byte

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

Phần thưởng: dọc (12 byte)

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

Phần thưởng: lật dọc (14 byte)

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

3

Python 3, 72 byte

Một lót tốt đẹp :)

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

Đầu ra:

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

Có một dòng mới ở đây. Nếu bạn muốn mà không có, bạn phải thêm 5 byte:

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

3

Julia, 50 byte

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

Điều này tạo ra một hàm không tên, lấy một chuỗi làm đầu vào và in ra STDOUT.

Ung dung:

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

3

JavaScript (ES5)

Chương trình, 54 ký tự

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

Chức năng, 60 ký tự

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

Ví dụ sử dụng:

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>


3

Matlab - 54 byte

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

Điều này chạy từ bàn điều khiển, sẽ lấy một chuỗi trong đầu vào từ stdinvà sẽ xuất ra biểu đồ từ ngang trong stdout:

Ví dụ:

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

Hoặc chúng ta có thể thử tạo một số hình dạng lạ mắt:

>> 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 =
*
**
***
******
**********
***********
**********
******
***
**
*
**
***
******
**********

Cách tiếp cận rất thông minh!
Luis Mendo

3

Matlab / Octave, 75 byte

Sử dụng chức năng ẩn danh:

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

Cảm ơn Hoki vì đã phát hiện ra một lỗi khiến cho từ cuối cùng bị phát hiện.

Ví dụ sử dụng (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 =
****     
**       
**       
*******  
*********
**       
****     
******   

Hoặc thử trực tuyến (Octave).


3

PowerShell, 35 31 byte

Khá cạnh tranh cho một sự thay đổi. Đi đi các nhà khai thác đơn phương tiện ích. Tôi cũng quên rằng parens trên một số chức năng, như -split-replaceđược sử dụng ở đây, là tùy chọn.

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

Được gọi thông qua đầu vào đường ống (tương đương với stdin cho PowerShell):

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

Như một phần thưởng, thay vào đó, nếu chúng ta có thể sử dụng các đối số dòng lệnh, chúng ta có thể giảm xuống còn 20 Byte và có một cái gì đó hoạt động cả có và không có một chuỗi làm đầu vào:

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

3

Javascript (ES6)

Giải pháp mới (39 byte):

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

Giải pháp Regex (42 byte):

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

Giải pháp phi regex (71 byte):

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

Những giải pháp này xác định các chức năng ẩn danh. Chỉ định chúng cho các biến hoặc gọi chúng như vậy:

(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]")

2

SWI-Prolog, 40 byte

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

Được gọi với các chuỗi mã, ví dụ a(`This is an example histogram of word length`).


2

STATA, 72 byte

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

Bị đánh cắp

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

Lưu ý rằng mã này không hoạt động trong trình thông dịch trực tuyến và yêu cầu trình thông dịch STATA độc quyền không miễn phí.


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


2

O, 22 byte

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

Giải trình

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

2

Chùm tia, 92 byte

Đây hoàn toàn không phải là một câu trả lời cạnh tranh và thực sự khá muộn, nhưng tôi đã chơi xung quanh với Beam một chút gần đây và muốn xem liệu tôi có thể khiến nó làm điều này không. Cuối cùng cũng có một số thành công :)

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


1

AWK

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

ví dụ

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

đầu ra: -

****
**
***********
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.