Poziomy wykres długości słowa

28

Wkład

Lista słów oddzielonych dowolną liczbą spacji.

Wydajność

Poziomy wykres artystyczny ASCII, na którym n-ta linia składa się z tylu gwiazdek ( *), ile n-te słowo jest długie.

Przykładowe użycie

>Wejściowe użytkownika sygnały, nie należy go wejście podczas testowania programu.

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

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

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

Realizacja referencyjna

W przypadku wątpliwości co do specyfikacji, wyjście twojego programu powinno dokładnie odpowiadać wynikowi poniżej pod wszystkimi danymi wejściowymi.

puts gets.chomp.split.map{|word| '*' * word.length}.join("\n")
Caridorc
źródło
Czy dozwolone jest wstawianie nowej linii? krzyżuje palce
rozpad bety
@BetaDecay Tak, dozwolone ...........
Caridorc,
Czy dane wejściowe będą miały początkowe lub końcowe spacje?
PhiNotPi
8
To, co opisujesz, nie jest histogramem. Histogram pokazuje liczbę słów zawierających x znaków w wierszu x. W pierwszym przykładzie wiersz 1 miałby 0 gwiazdek (bez słów o długości 1) wiersz 2 miałby 3 gwiazdki (jest, an,) i tak dalej.
nitro2k01
1
Ok, zdaję sobie sprawę, że masz rację. Jest poziomo.
nitro2k01

Odpowiedzi:

24

Siatkówka , 5 + 3 = 8 bajtów

 +
\n
.
*

Każda linia przechodzi we własny plik, więc dodałem 1 bajt dla każdego dodatkowego pliku. Ponadto \nnależy go zastąpić rzeczywistą nową linią.

Każda para linii jest parą zastępującą wzór. +dopasowuje co najmniej jedną spację i zastępuje ją nową linią. .dopasowuje dowolny znak oprócz nowego wiersza i zastępuje go znakiem *. Jest to stosowane globalnie, więc każda postać jest zastępowana przez *.

NinjaBearMonkey
źródło
11

Pyth, 9 bajtów

jm*ld\*cz

Wyjaśnienie:

jm*ld\*cz
       cz    chop input on whitespace
 m           map to
   ld        length of the segment
  *  \*      number of asterisks
j            joined on newlines
isaacg
źródło
10

CJam, 10 bajtów

r{,'**Nr}h

Jak to działa :

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

Wypróbuj online tutaj

Optymalizator
źródło
10

R - 33

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

gdzie

  • scan(,"") czyta ze standardowego wejścia i dzieli białą spację na wektor znaków.
  • gsub(".", "*", ...)zamienia wszystkie znaki na *.
  • write(..., "") wypisuje na standardowe wyjście z domyślnym separatorem „\ n”.
flodel
źródło
10

Python 3, 43 bajty:

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

Dzięki @BetaDecay za wskazanie błędu składniowego.

Przykładowy przebieg:

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

(Poniższy ciąg jest wprowadzany jako literał, a nie tekst)

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

Premia: histogram pionowy

Dzięki @Caridorc za wskazanie mojego błędu, który sprawił, że bonusy mają od 1 do wielu wierszy.

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

Próbny:

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

Premia: histogram pionowy (do góry nogami)

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

Próbny:

> This is an example histogram of word length
********
********
*  ** **
*  ** **
   **  *
   **  *
   **   
JF
źródło
Vertical jest wyłączony o jeden
Caridorc,
6

R, 38 bajtów (z pewną pomocą w komentarzach)

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

Jak to działa

  • gsub zastępuje wszystkie spacje bez znaku *
  • drugi gsubdodaje \n(nowy wiersz) na końcu każdego elementu
  • cat drukuje odpowiednio

Próbny

David Arenburg
źródło
6

> <> , 38 37 bajtów

Przeklinaj podwójną skrzynkę * potrząsa rybą *.

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

Możesz spróbować w trybie online (wystarczy, że podasz dane w polu u dołu, a następnie naciśnij Giveprzycisk). Sugestie dotyczące dalszego gry w golfa są zawsze mile widziane, zwłaszcza pomysły na usunięcie tych marnotrawczych miejsc przed drugą i trzecią linią.

Jeśli pozwolono ci wydrukować dodatkowy znak nowej linii dla dodatkowych spacji, kod może mieć aż 27 bajtów :

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

Wyjaśnienie

Uwaga: kolejność objaśnień będzie odpowiadać położeniu wskaźnika (więc jeśli kod zostanie wyjaśniony na podstawie tego, co uważa się za porządek, dzieje się tak, ponieważ jest to kolejność, w której wskaźnik go wykonuje).

Linia 1:

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

Linia 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

Wiersz 3:

Uwaga: Ta linia jest odwrócona, więc czytaj od prawej do lewej.

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

Zasadniczo test programu, aby upewnić się, że wejście (które jest odczytywane jeden znak na raz) nie jest spacją, a następnie drukuje gwiazdkę. Kończy się, jeśli nie ma danych wejściowych (wartość wejściowa to -1). Aby upewnić się, że nie drukuje dodatkowych znaków nowej linii, używa wartości rejestru, którą ustawia na 0 lub 1. Ze względu na sposób, w jaki go skonfigurowałem, nie przejmuje się dodatkowymi wartościami wypychanymi na stos (np. wartość rejestru, gdy ustawia się go 1po wydrukowaniu gwiazdki); pozostają na stosie po zakończeniu programu, ale nic nie robią.

Wiem, że może to być trochę mylące, ponieważ użyłem 84*i 67*zamiast " "i "*"odpowiednio, ale było tak, ponieważ nie miałem ochoty umieszczać ciągów w programie z jakiegokolwiek powodu.

kapusta
źródło
Nie ma za co;)
Rozpad Beta
6

JavaScript ES6

Funkcja, 46 znaków

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

Program, 55 znaków

alert(prompt().replace(/\S/g,"*").replace(/\s+/g,"\n"))
Qwertiy
źródło
Twoja funkcja ma w rzeczywistości długość 46 znaków, a twój program ma 55.
adroitwhiz
@ darkness3560, dziękuję za korektę. Użyłem wyrażeń takich jak "f=s=>s.replace(/\S/g,'*').replace(/\s+/g,'\n')".lengthpomiar długości i zapomniałem o tym \.
Qwertiy,
6

Perl, 16 bajtów (15 znaków + -p)

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

Uruchom jako:

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

Zapisałem dodatkowy bajt dzięki @ThisSuitIsBlackNot , nigdy wcześniej nie spotkałem y///s!

Dom Hastings
źródło
To jest doskonałe! Możesz zapisać 1 bajt, zmieniając pierwsze podstawienie na transliterację:y/ /\n/s;
ThisSuitIsBlackNot
@ThisSuitIsBlackNot Ooh nice! Dziękuję Ci!
Dom Hastings,
5

Gema, 11 9 znaków

 =\n
?=\*

Przykładowy przebieg:

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'
******
*****
*******
człowiek w pracy
źródło
5

PHP 5.3, 55 53 51 50 bajtów

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


Użycie:
Wywołaj skrypt i zdefiniuj zmienną globalną ($ a) Dane
php -d error_reporting=0 script.php?a="This is an example histogram of word length"

wyjściowe:

****
**
**
*******
*********
**
****
******
Jrenk
źródło
4

Java, 102 bajty

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

Haskell, 31 bajtów

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

Przykład użycia:

Main> putStr.unlines.map(>>"*").words $ "This is an example histogram of word length"
****
**
**
*******
*********
**
****
******
nimi
źródło
można zastąpić putStr.w f=celu obniżenia liczby bajtów, lub użyć main=interact$zamiast putStr.czytać ze standardowego wejścia i uczynić z niego kompletny program
HEGX64
@ HEGX64: ale f=unlines.map(>>"*").wordszwraca coś podobnego "****\n**\n**\n"i nie wyświetla „poziomego wykresu graficznego ASCII” zgodnie z żądaniem.
nimi
4

CJam, 11 bajtów

Rywalizując o drugie miejsce w CJam po tym, jak @Optimizer znalazł sprytne 10-bajtowe rozwiązanie. Jest to proste 11-bajtowe rozwiązanie:

lS%:,'*f*N*

Wypróbuj online

Alternatywne rozwiązanie wykorzystujące pętlę zamiast dwóch map, również 11 bajtów:

lS%{,'**N}/

Objaśnienie pierwszego rozwiązania:

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
źródło
4

JavaScript (ES6), 37

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

Krótsza wersja wykorzystująca tylko jedną replace.

Cristian Lupascu
źródło
2
Cholera, właśnie skończyłem moją funkcję ES6, 38 bajtów. Weź głos, kiedy uciekam ze wstydu! : D
MayorMonty,
4

J, 10 bajtów

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

Bonus: pionowy (12 bajtów)

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

Bonus: odwrócony w pionie (14 bajtów)

   |.|:'*'$~$&>;:'This is an example histogram of word length'
    *   
    *   
   **   
   **  *
   **  *
*  ** **
*  ** **
********
********
hoosierEE
źródło
3

Python 3, 72 bajty

Miły jeden liner :)

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

Wydajność:

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

Kończy się nowa linia tutaj. Jeśli chcesz bez niego, musisz dodać 5 bajtów:

print(''.join(map(lambda x:"*"*len(x)+"\n"*int(x!=""),input().split()))[:-1])
Rozpad beta
źródło
3

Julia, 50 bajtów

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

Spowoduje to utworzenie nienazwanej funkcji, która pobiera ciąg jako dane wejściowe i drukuje do STDOUT.

Nie golfowany:

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.
źródło
3

JavaScript (ES5)

Program, 54 znaki

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

Funkcja, 60 znaków

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

Przykładowe użycie:

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
źródło
3

Matlab - 54 bajty

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

Uruchamia się z konsoli, pobiera ciąg danych wejściowych stdini wyświetla wykres słowa poziomego w stdout:

Przykład:

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

Lub możemy spróbować stworzyć fantazyjne kształty:

>> 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
źródło
Bardzo sprytne podejście!
Luis Mendo,
3

Matlab / Octave, 75 bajtów

Korzystanie z anonimowej funkcji:

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

Dzięki Hoki za wykrycie błędu, który uniemożliwił wykrycie ostatniego słowa.

Przykładowe użycie (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 =
****     
**       
**       
*******  
*********
**       
****     
******   

Lub wypróbuj online (Octave).

Luis Mendo
źródło
3

PowerShell, 35 31 bajtów

Bardzo konkurencyjny dla odmiany. Idź idź gadżety unary operatorów. Ciągle zapominam, że pareny niektórych funkcji, takich jak -spliti -replaceużywane tutaj, są opcjonalne.

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

Wywoływane przez dane wejściowe potoku (równoważne stdin dla PowerShell):

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

Jako bonus, jeśli zamiast tego możemy użyć argumentów wiersza polecenia, możemy zejść do 20 bajtów i mieć coś, co działa zarówno z, jak i bez pojedynczego ciągu jako danych wejściowych:

$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
źródło
3

JavaScript (ES6)

Nowe rozwiązanie (39 bajtów):

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

Rozwiązanie Regex (42 bajty):

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

Rozwiązanie inne niż wyrażenia regularne (71 bajtów):

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

Te rozwiązania definiują anonimowe funkcje. Przypisz je do zmiennych lub nazwij tak:

(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]")
adroitwhiz
źródło
2

SWI-Prolog, 40 bajtów

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

Wywoływany za pomocą ciągów kodu, np a(`This is an example histogram of word length`).

Fatalizować
źródło
2

STATA, 72 bajty

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

Nie golfił

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

Pamiętaj, że ten kod nie działa w tłumaczu online i wymaga niewolnego zastrzeżonego interpretera STATA.

znaczniki
źródło
2

C ++ 14, 107 106 bajtów

#include<iostream>
main(){std::string s;for(;std::cin>>s;){for(char c:s)std::cout<<'*';std::cout<<'\n';}}
sweerpotato
źródło
2

K5, 31 bajtów

`0:{(#x)#"*"}'f@&0<#:'f:" "\0:`
kirbyfan64sos
źródło
2

O, 22 bajty

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

Wyjaśnienie

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
źródło
2

Belka, 92 bajty

To wcale nie jest konkurencyjna odpowiedź i naprawdę dość późno, ale ostatnio bawiłem się trochę z Beamem i chciałem sprawdzić, czy uda mi się to zrobić. W końcu udało mi się osiągnąć sukces :)

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

MickyT
źródło
1

AWK

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

przykłady

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

wydajność:-

****
**
***********
Shravan Yadav
źródło