กราฟแนวนอนของความยาวคำ


28

อินพุต

รายการคำที่คั่นด้วยช่องว่างจำนวนเท่าใดก็ได้

เอาท์พุต

กราฟศิลปะ ASCII แนวนอนที่เส้น n-th ประกอบด้วยเครื่องหมายดอกจัน ( *) มากที่สุดเท่าที่คำ n-th นั้นยาว

ตัวอย่างการใช้งาน

>ผู้ใช้ป้อนสัญญาณที่คุณไม่ควรป้อนข้อมูลเมื่อการทดสอบโปรแกรม

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

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

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

การดำเนินการอ้างอิง

ในกรณีที่มีข้อสงสัยเกี่ยวกับข้อมูลจำเพาะผลลัพธ์ของโปรแกรมของคุณควรตรงกับโปรแกรมด้านล่างทั้งหมดภายใต้อินพุตทั้งหมด

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

ดังนั้นการขึ้นบรรทัดใหม่จะได้รับอนุญาตหรือไม่ กากบาท
Beta Decay

@BetaDecay ใช่ได้รับอนุญาต ...........
Caridorc

อินพุตจะมีช่องว่างนำหน้าหรือต่อท้ายหรือไม่
PhiNotPi

8
สิ่งที่คุณกำลังอธิบายไม่ใช่ฮิสโตแกรม ฮิสโตแกรมจะแสดงจำนวนคำที่มีอักขระ x ในบรรทัด x ในตัวอย่างแรกบรรทัดที่ 1 จะมีเครื่องหมายดอกจัน 0 ตัว (ไม่มีคำที่มีความยาว 1) บรรทัดที่ 2 จะมีเครื่องหมายดอกจัน 3 ตัว (คือ, อัน, ของ) และอื่น ๆ
nitro2k01

1
ตกลงฉันรู้ว่าคุณพูดถูก แนวนอนนั้น
nitro2k01

คำตอบ:


24

Retina , 5 + 3 = 8 ไบต์

 +
\n
.
*

ทุกบรรทัดมีไฟล์ของตัวเองดังนั้นฉันจึงเพิ่ม 1 ไบต์สำหรับแต่ละไฟล์เพิ่มเติม นอกจากนี้\nควรแทนที่ด้วยขึ้นบรรทัดใหม่จริง

แต่ละคู่ของเส้นเป็นคู่แทนที่รูปแบบ +จับคู่หนึ่งหรือมากกว่าหนึ่งช่องว่างและแทนที่ด้วยขึ้นบรรทัดใหม่ .ตรงกับตัวอักษรใด ๆยกเว้น*การขึ้นบรรทัดใหม่และจะแทนที่ที่มี *นี้ถูกนำไปใช้ทั่วโลกเพื่อให้ตัวละครทุกตัวจะถูกแทนที่ด้วย


11

Pyth, 9 ไบต์

jm*ld\*cz

คำอธิบาย:

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


10

R - 33

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

ที่ไหน

  • scan(,"") อ่านจาก stdin และแยกบน white-space เป็นเวกเตอร์อักขระ
  • gsub(".", "*", ...) แทนที่อักขระทั้งหมดเป็น *แทนที่ตัวอักษรทั้งหมดลง
  • write(..., "") พิมพ์ไปยัง stdout ด้วย "\ n" เป็นตัวคั่นเริ่มต้น

10

Python 3, 43 ไบต์:

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

ขอบคุณ@BetaDecayชี้ให้เห็นข้อผิดพลาดทางไวยากรณ์

วิ่งตัวอย่าง:

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

(สตริงด้านล่างถูกป้อนเป็นตัวอักษรแทนที่จะเป็นข้อความ)

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

โบนัส: ฮิสโทแกรมแนวตั้ง

ขอบคุณ@Caridorc ที่ชี้ให้เห็นข้อผิดพลาดของฉันที่ทำให้โบนัสมี 1 ถึงหลายแถว

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

การสาธิต:

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

โบนัส: ฮิสโทแกรมแนวตั้ง (กลับหัว)

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

การสาธิต:

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

แนวตั้งถูกปิดโดยหนึ่ง
Caridorc

6

R, 38 ไบต์ (ด้วยความช่วยเหลือในการแสดงความคิดเห็น)

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

มันทำงานอย่างไร

  • gsub แทนที่ไม่มีช่องว่างด้วย *
  • วินาทีgsubเพิ่ม\n(ขึ้นบรรทัดใหม่) ที่ส่วนท้ายของแต่ละองค์ประกอบ
  • cat พิมพ์ตามนั้น

การสาธิต


6

> <> , 38 37 ไบต์

สาปแช่งคุณกรณีพื้นที่สองเท่า * สั่นปลา *

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

คุณสามารถลองออนไลน์ได้ (สิ่งที่คุณต้องทำคือให้อินพุตผ่านฟิลด์ใกล้ด้านล่างแล้วกดปุ่มGiveปุ่ม) ข้อเสนอแนะสำหรับการเล่นกอล์ฟต่อไปยินดีต้อนรับเสมอโดยเฉพาะอย่างยิ่งความคิดที่จะลบช่องว่างที่สิ้นเปลืองเหล่านั้นต่อหน้าบรรทัดที่สองและสาม

หากคุณได้รับอนุญาตให้พิมพ์บรรทัดใหม่เพิ่มเติมสำหรับพื้นที่ว่างเพิ่มเติมโค้ดอาจเป็นขนาด27 ไบต์ :

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

คำอธิบาย

หมายเหตุ: ลำดับของคำอธิบายจะสอดคล้องกับตำแหน่งของตัวชี้ (ดังนั้นหากรหัสถูกอธิบายออกมาจากสิ่งที่ใครจะพิจารณาสั่งซื้อมันเป็นเพราะมันเป็นลำดับที่ตัวชี้ดำเนินการ)

บรรทัด 1:

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

บรรทัด 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

บรรทัด 3:

NB บรรทัดนี้กลับด้านดังนั้นโปรดอ่านจากขวาไปซ้าย

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

โดยพื้นฐานแล้วโปรแกรมจะทดสอบเพื่อให้แน่ใจว่าอินพุต (ซึ่งอ่านครั้งละหนึ่งอักขระ) ไม่ใช่ช่องว่างจากนั้นพิมพ์เครื่องหมายดอกจัน มันจะยุติหากไม่มีการป้อนข้อมูล (ค่าอินพุตคือ -1) เพื่อให้แน่ใจว่ามันไม่ได้พิมพ์บรรทัดใหม่เพิ่มเติมมันใช้ค่าลงทะเบียนซึ่งตั้งค่าเป็น 0 หรือ 1 เนื่องจากวิธีที่ฉันตั้งค่ามันไม่สนใจค่าภายนอกที่ถูกผลักลงบนสแต็ก (เช่น ค่าของการลงทะเบียนเมื่อมันตั้งค่าเป็น1หลังจากพิมพ์เครื่องหมายดอกจัน); มันยังคงอยู่ในสแต็กเมื่อโปรแกรมหยุดทำงาน แต่ไม่ทำอะไรเลย

ฉันรู้ว่ามันอาจจะทำให้เกิดความสับสนเล็กน้อยเพราะผมใช้84*และ67*แทน" "และ"*"ตามลำดับ แต่นั่นก็เป็นเพราะผมไม่ได้รู้สึกเหมือนการวางสายในโปรแกรมด้วยเหตุผลใดก็ตาม



6

Javascript ES6

ฟังก์ชั่น 46 ตัวอักษร

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

โปรแกรม 55 ตัวอักษร

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

ฟังก์ชั่นของคุณมีความยาว 46 ตัวอักษรและโปรแกรมของคุณคือ 55
adroitwhiz

@ darkness3560 ขอบคุณสำหรับการแก้ไข ผมใช้การแสดงออกเช่นการวัดความยาวและลืมเกี่ยวกับ"f=s=>s.replace(/\S/g,'*').replace(/\s+/g,'\n')".length \
Qwertiy

6

Perl, 16 ไบต์ (15 ตัวอักษร + -p)

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

ทำงานเป็น:

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

บันทึกเป็นไบต์เพิ่มเติมขอบคุณ@ThisSuitIsBlackNotฉันไม่เคยพบy///sมาก่อน!


มันยอดเยี่ยมมาก! คุณสามารถบันทึก 1 ไบต์โดยเปลี่ยนการแทนที่แรกเป็นทับศัพท์:y/ /\n/s;
ThisSuitIsBlackNot

@ ThisSuitIsBlack ไม่ดีโอ้! ขอขอบคุณ!
Dom Hastings

5

Gema, 11 9 ตัวอักษร

 =\n
?=\*

วิ่งตัวอย่าง:

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 ไบต์

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


การใช้งาน:
โทรสคริปต์และกำหนดตัวแปรส่วนกลาง ($ a)
php -d error_reporting=0 script.php?a="This is an example histogram of word length"

เอาต์พุต:

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


4

Haskell, 31 ไบต์

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

ตัวอย่างการใช้งาน:

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

คุณสามารถแทนที่putStr.ด้วยf=เพื่อลดจำนวนไบต์หรือใช้main=interact$แทนputStr.การอ่านจาก STDIN และทำให้เป็นโปรแกรมที่สมบูรณ์
HEGX64

@ HEGX64: แต่f=unlines.map(>>"*").wordsส่งคืนสิ่งที่ชอบ"****\n**\n**\n"และจะไม่ส่งออก "กราฟ ASCII art แนวนอน" ตามที่ร้องขอ
nimi

4

CJam, 11 ไบต์

การแข่งขันสำหรับอันดับที่สองใน CJam หลังจาก @Optimizer พบวิธีแก้ปัญหาที่ชาญฉลาด 10 ไบต์ นี่คือโซลูชัน 11 ไบต์ที่ตรงไปตรงมา:

lS%:,'*f*N*

ลองออนไลน์

โซลูชันสำรองที่ใช้การวนซ้ำแทนการแมปสองรายการเช่น 11 ไบต์:

lS%{,'**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<"!"?`
`:'*')

replaceรุ่นสั้นใช้เพียงหนึ่ง


2
บ้าฉันเพิ่งทำฟังก์ชัน ES6 ของฉันเสร็จ 38 ไบต์ ใช้ upvote ของฉันในขณะที่ฉันวิ่งหนีด้วยความอับอาย! : D
นายกเทศมนตรีเงิน

4

J, 10 ไบต์

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

โบนัส: แนวตั้ง (12 ไบต์)

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

โบนัส: พลิกแนวตั้ง (14 ไบต์)

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

3

Python 3, 72 ไบต์

ซับหนึ่งที่ดี :)

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

เอาท์พุท:

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

มีการขึ้นบรรทัดใหม่ที่นี่ หากคุณต้องการโดยไม่ต้องเพิ่ม 5 ไบต์:

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

3

Julia, 50 ไบต์

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

สิ่งนี้จะสร้างฟังก์ชั่นที่ไม่มีชื่อที่ใช้สตริงเป็นอินพุตและพิมพ์ไปยัง STDOUT

Ungolfed:

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)

โปรแกรม 54 ตัวอักษร

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

ฟังก์ชั่น 60 ตัวอักษร

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

ตัวอย่างการใช้งาน:

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 ไบต์

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

สิ่งนี้เรียกใช้จากคอนโซลจะใช้สตริงในอินพุตจากstdinและจะแสดงกราฟคำในแนวนอนในstdout:

กันตัวอย่าง:

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

หรือเราอาจลองทำรูปร่างแฟนซีบางอย่าง:

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

วิธีการที่ฉลาดมาก!
Luis Mendo

3

Matlab / Octave, 75 ไบต์

ใช้ฟังก์ชั่นที่ไม่ระบุชื่อ:

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

ขอบคุณ Hoki ที่พบข้อผิดพลาดซึ่งทำให้ไม่สามารถตรวจจับคำสุดท้ายได้

ตัวอย่างการใช้ (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 =
****     
**       
**       
*******  
*********
**       
****     
******   

หรือลองออนไลน์ (Octave)


3

PowerShell, 35 31 ไบต์

การแข่งขันค่อนข้างจะเปลี่ยน ไปตัวดำเนินการแกดเจ็ต unary ตัวดำเนินการ ฉันยังลืมว่าการปัดเศษของฟังก์ชันบางอย่างเช่น-splitและ-replaceใช้ที่นี่เป็นทางเลือก

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

เรียกว่าผ่านอินพุตไปป์ไลน์ (เทียบเท่ากับ stdin สำหรับ PowerShell):

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

เป็นโบนัสหากเราสามารถใช้อาร์กิวเมนต์บรรทัดคำสั่งแทนเราสามารถลดขนาดได้ถึง20 ไบต์และมีบางสิ่งที่ทำงานได้ทั้งที่มีและไม่มีสตริงเดี่ยวเป็นอินพุต:

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

โซลูชั่นใหม่ (39 ไบต์):

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

โซลูชัน Regex (42 ไบต์):

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

โซลูชันที่ไม่ใช่ regex (71 ไบต์):

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

โซลูชั่นเหล่านี้กำหนดฟังก์ชั่นที่ไม่ระบุชื่อ กำหนดให้กับตัวแปรหรือเรียกพวกเขาเช่น:

(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 ไบต์

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

เรียกว่ากับสตริงรหัสเช่น a(`This is an example histogram of word length`).


2

STATA ขนาด 72 ไบต์

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

Ungolfed

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

โปรดทราบว่ารหัสนี้ใช้ไม่ได้กับล่ามออนไลน์และต้องการล่าม STATA ที่ไม่ต้องมีกรรมสิทธิ์




2

O, 22 ไบต์

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

คำอธิบาย

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

บีม, 92 ไบต์

นี่ไม่ใช่คำตอบที่น่าสนใจและค่อนข้างช้า แต่ฉันก็ได้เล่นกับ Beam เมื่อไม่นานมานี้และต้องการดูว่าฉันสามารถทำสิ่งนี้ได้หรือไม่ ในที่สุดก็ประสบความสำเร็จ :)

'''''''>`++++++)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 ""}}'

ตัวอย่าง

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

เอาท์พุท: -

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