Kelime uzunluğunun yatay grafiği


28

Giriş

Herhangi bir boşlukla ayrılmış kelimelerin listesi.

Çıktı

N. Çizginin, *n. Kelimesi uzun olduğu kadar çok yıldızla ( ) oluşturulduğu yatay bir ASCII sanat grafiği .

Örnek kullanım

>Sinyaller kullanıcı girişi, giriş o programın test olmamalı.

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

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

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

Referans uygulaması

Spesifikasyon konusunda şüphe durumunda, programınızın çıktısı, tüm girdiler altındaki programın tam olarak aynı olması gerekir.

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

Öyleyse takip eden bir yeni satıra izin veriliyor mu? parmakları haçlar
Beta Decay

@BetaDecay Evet, izin verilir ...........
Caridorc

Girdide öncü veya iz bırakan boşluklar olacak mı?
PhiNotPi 7:15

8
Tarif ettiğiniz şey bir histogram değil. Bir histogram, x satırındaki x karakterli sözcük sayısını gösterir. İlk örnekte, 1. satırda 0 yıldız işareti (uzunluğu 1 olan hiçbir sözcük yok) 2. satırda 3 yıldız işareti (olur, bir, vb.) Olur.
nitro2k01

1
Tamam, haklı olduğunun farkındayım. Yataydır.
nitro2k01

Yanıtlar:


24

Retina , 5 + 3 = 8 bayt

 +
\n
.
*

Her satır kendi dosyasına girer, bu yüzden her ek dosya için 1 bayt ekledim. Ayrıca, \ngerçek bir yeni satır ile değiştirilmelidir.

Her bir çizgi çifti bir model değiştirme çiftidir. +bir veya daha fazla boşlukla eşleşir ve onu yeni bir satırla değiştirir. yeni satır dışındaki. herhangi bir karakterle eşleşir ve bunu a ile değiştirir . Bu global olarak uygulanır, bu yüzden her karakter a ile değiştirilir .**


11

Pyth, 9 bayt

jm*ld\*cz

Açıklama:

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 bayt

r{,'**Nr}h

Nasıl çalışır :

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

Burada çevrimiçi deneyin


10

R - 33

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

nerede

  • scan(,"") stdin'den okur ve beyaz boşlukta karakter vektörüne böler.
  • gsub(".", "*", ...)Tüm karakterleri içine yerleştirir *.
  • write(..., "") varsayılan ayırıcı olarak "\ n" ile stdout'a yazdırır.

10

Python 3, 43 bayt:

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

@ Sözdizimi hatasını bildirdiği için @ BetaDecay'e teşekkür ederiz .

Örnek çalışma:

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

(Aşağıdaki dize metin yerine değişmez olarak girilir)

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

Bonus: dikey histogram

Bonusları 1 ila birçok sıraya sokan hatamı işaret ettiği için @Caridorc'a teşekkürler .

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: dikey histogram (baş aşağı)

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

Düşey teker teker kapalı
Caridorc

6

R, 38 bayt (yorumlarda yardımı ile)

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

Nasıl çalışır

  • gsub tüm boşlukları ile değiştirir *
  • her elemanın sonuna ikinci gsubekler \n(yeni satır)
  • cat buna göre yazdırır

gösteri


6

> <> , 38 37 Byte

Lanet olsun size çift boşluk halinde * balık sallıyor *.

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

Şunları yapabilirsiniz çevrimiçi denemek (yapmanız gereken tüm alt kısmına yakın alanda yoluyla vermek girdi ve daha sonra vurmak Givedüğmesine). Daha fazla golf oynamak için öneriler her zaman açıktır, özellikle de ikinci ve üçüncü sıraların önünde bu israf alanlarını kaldırma fikirleri.

Ekstra alanlar için ek bir yeni satır yazdırmanıza izin verildiyse, kod göz alıcı bir 27 bayt olabilir :

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

açıklama

Not: Açıklamanın sırası, işaretçinin konumuna karşılık gelir (kod, sıranın ne olacağını açıklayamazsa, bunun nedeni, işaretçinin çalıştırdığı sıradır).

Satır 1:

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

Hat 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

Satır 3:

NB Bu satır tersten gider, bu yüzden sağdan sola doğru okuyun.

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

Temel olarak, program girişin (her seferinde bir karakter okunan) boşluk olmadığından emin olmak için test eder ve sonra bir yıldız işareti basar. Giriş yoksa sonlandırılır (giriş değeri -1'dir). Ek yeni satırlar yazdırmadığından emin olmak için, 0 veya 1 olarak ayarladığı register değerini kullanır. Ayarlama biçimim nedeniyle yığına itilen yabancı değerlerle ilgilenmez (ör. 1yıldız işaretini yazdırdıktan sonra ayarlandığı zaman yazmacın değeri ); program sonlandığında yığında kalırlar ama hiçbir şey yapmazlar.

Kullandığımdan 84*ve 67*bunun yerine " "ve "*"sırasıyla kullanmamın biraz kafa karıştırıcı olabileceğini biliyorum , çünkü bunun nedeni ne olursa olsun programa ipler koymak istemiyor olmamdı.



6

Javascript ES6

İşlev, 46 karakter

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

Program, 55 karakter

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

Fonksiyonunuz aslında 46 karakter uzunluğunda ve programınız 55.
adroitwhiz

@ darkness3560, düzeltme için teşekkür ederiz. "f=s=>s.replace(/\S/g,'*').replace(/\s+/g,'\n')".lengthUzunluğu ölçmek ve unutmak gibi ifadeler kullandım \.
Qwertiy

6

Perl, 16 bayt (15 karakter + -p)

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

Olarak çalıştırmak:

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

@BuSuitIsBlackNot sayesinde ek bir bayt kaydedildi, daha y///sönce karşılaşmamıştım !


Bu mükemmel! İlk değiştirmeyi bir harf çevirisine değiştirerek 1 byte y/ /\n/s;
kazanabilirsiniz

@BuSuitIsBlackNot Ooh güzel! teşekkür ederim!
Dom Hastings

5

Gema, 11 9 karakter

 =\n
?=\*

Örnek çalışma:

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 bayt

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


Kullanım:
Script'i arayın ve global bir değişken tanımlayın ($ a)
php -d error_reporting=0 script.php?a="This is an example histogram of word length"

Çıktı:

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

4

Java, 102 bayt

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

4

Haskell, 31 bayt

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

Kullanım örneği:

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

bayt sayısını azaltmak için putStr.ile değiştirebilir f=veya main=interact$putStr.
STDIN'den

@ HEGX64: ancak f=unlines.map(>>"*").wordsbenzer bir şey döndürür "****\n**\n**\n"ve istendiği gibi bir "yatay ASCII sanat grafiği" çıkarmaz.
nimi

4

CJam, 11 bayt

@ OPtimizer’dan sonra CJam’da ikinci sırada yer almak akıllıca 10 baytlık bir çözüm buldu. Bu basit bir 11 baytlık çözümdür:

lS%:,'*f*N*

Çevrimiçi deneyin

İki harita yerine bir döngü kullanan alternatif çözüm, ayrıca 11 bayt:

lS%{,'**N}/

İlk çözüm için açıklama:

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

Sadece birini kullanarak daha kısa versiyon replace.


2
Kahretsin, ES6 fonksiyonumu 38 byte bitirdim. Utandığımda kaçarken, benim oyumu al! : D
Belediye BaşkanıMonty

4

J, 10 bayt

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

Bonus: dikey (12 bayt)

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

Bonus: dikey döndürülmüş (14 bayt)

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

3

Python 3, 72 bayt

Güzel bir liner :)

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

Çıktı:

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

Burada son bir yeni hat var. Eğer istemiyorsanız, 5 byte eklemelisiniz:

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

3

Julia, 50 bayt

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

Bu, dizgeyi girdi olarak alan ve STDOUT'a basan isimsiz bir işlev yaratır.

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)

Program, 54 karakter

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

İşlev, 60 karakter

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

Örnek kullanım:

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 bayt

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

Bu konsoldan çalışır, girişte bir dize alır stdinve içinde yatay kelime grafiğini çıkarır stdout:

exemple:

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

Veya bazı süslü şekiller yapmaya çalışabiliriz:

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

Çok akıllıca bir yaklaşım!
Luis Mendo

3

Matlab / Octave, 75 bayt

İsimsiz bir işlev kullanma:

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

Son sözün tespit edilmesini engelleyen bir hata tespit ettiği için Hoki'ye teşekkürler.

Örnek kullanım (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 =
****     
**       
**       
*******  
*********
**       
****     
******   

Veya çevrimiçi deneyin (Octave).


3

PowerShell, 35 31 bayt

Bir değişiklik için oldukça rekabetçi. Git gadget unary operatörleri gidin. Ayrıca burada kullanılan -splitve -replacekullanıldığı gibi bazı işlevlerde parens'in isteğe bağlı olduğunu unutmaya devam ediyorum .

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

Pipeline girişi üzerinden çağrıldı (PowerShell için stdin'e eşdeğer):

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

Bir bonus olarak, bunun yerine komut satırı argümanlarını kullanabilirsek, 20 Byte'a kadar indirebilir ve giriş olarak tek bir dize olan ve olmayan bir şeye sahip olabiliriz:

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

Yeni çözüm (39 bayt):

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

Regex çözümü (42 bayt):

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

Regex olmayan çözüm (71 bayt):

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

Bu çözümler adsız işlevleri tanımlar. Onları değişkenlere atayın ya da şöyle arayın:

(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 bayt

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

Kod dizeleriyle çağrılır, örneğin a(`This is an example histogram of word length`).


2

STATA, 72 bayt

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

Bu kodun çevrimiçi tercümanda çalışmadığını ve tescilli olmayan STATA tercümanı gerektirdiğini unutmayın.


2

C ++ 14, 107 106 bayt

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


2

O, 22 bayt

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

açıklama

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

Kiriş, 92 Bayt

Bu kesinlikle rekabetçi bir cevap değil ve gerçekten oldukça geç, ama son zamanlarda biraz Beam ile oynuyordum ve bunu başarabilecek miyim görmek istedim. Sonunda biraz başarılı oldum :)

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

örnekler

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

çıktı:-

****
**
***********
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.