Horizontales Diagramm der Wortlänge

28

Eingang

Eine Liste von Wörtern, die durch eine beliebige Anzahl von Leerzeichen getrennt sind.

Ausgabe

Ein horizontales ASCII-Grafikdiagramm, bei dem die n-te Linie aus so vielen Sternchen ( *) besteht, wie das n-te Wort lang ist.

Anwendungsbeispiel

Die >Signale, die der Benutzer eingibt, sollten Sie beim Testen des Programms nicht eingeben.

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

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

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

Referenzimplementierung

Im Zweifelsfall über die Spezifikation sollte die Ausgabe Ihres Programms unter allen Eingaben genau der des folgenden Programms entsprechen.

puts gets.chomp.split.map{|word| '*' * word.length}.join("\n")
Caridorc
quelle
Ist also ein abschließender Zeilenumbruch erlaubt? Daumen drücken
Beta-Zerfall
@BetaDecay Ja, erlaubt ...........
Caridorc
Wird die Eingabe jemals führende oder nachfolgende Leerzeichen enthalten?
PhiNotPi
8
Was Sie beschreiben, ist kein Histogramm. Ein Histogramm würde die Anzahl der Wörter mit x Zeichen in Zeile x anzeigen. Im ersten Beispiel hätte Zeile 1 0 Sternchen (keine Wörter mit der Länge 1), Zeile 2 hätte 3 Sternchen (ist, ein, von) und so weiter.
nitro2k01
1
Ok, mir ist klar, dass du recht hast. Horizontal ist es.
Nitro2k01

Antworten:

24

Retina , 5 + 3 = 8 Bytes

 +
\n
.
*

Jede Zeile geht in eine eigene Datei, also habe ich für jede weitere Datei 1 Byte hinzugefügt. Außerdem \nsollte der durch einen tatsächlichen Zeilenumbruch ersetzt werden.

Jedes Linienpaar ist ein Musterersetzungspaar. +Stimmt mit einem oder mehreren Leerzeichen überein und ersetzt es durch eine neue Zeile. .stimmt mit jedem Zeichen außer einem Zeilenumbruch überein und ersetzt dieses durch ein *. Dies wird global angewendet, sodass jedes Zeichen durch ein ersetzt wird *.

NinjaBearMonkey
quelle
11

Pyth, 9 Bytes

jm*ld\*cz

Erläuterung:

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

CJam, 10 Bytes

r{,'**Nr}h

Wie es funktioniert :

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

Probieren Sie es hier online aus

Optimierer
quelle
10

R - 33

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

woher

  • scan(,"") Liest aus stdin und teilt den Leerraum in einen Zeichenvektor auf.
  • gsub(".", "*", ...)ersetzt alle Zeichen in *.
  • write(..., "") druckt auf Standardausgabe mit "\ n" als Standardtrennzeichen.
Flodel
quelle
10

Python 3, 43 Bytes:

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

Vielen Dank an @BetaDecay für den Hinweis auf einen Syntaxfehler.

Probelauf:

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

(Die folgende Zeichenfolge wird als Literal und nicht als Text eingegeben.)

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

Bonus: vertikales Histogramm

Vielen Dank an @Caridorc für den Hinweis auf meinen Fehler, dass die Boni 1 bis viele Zeilen enthalten.

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: vertikales Histogramm (verkehrt herum)

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
quelle
Vertikal ist um eins aus
Caridorc
6

R, 38 Bytes (mit etwas Hilfe in Kommentaren)

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

Wie es funktioniert

  • gsub Ersetzt alle Leerzeichen durch *
  • second gsubfügt \n(newline) am Ende jedes Elements hinzu
  • cat druckt entsprechend

Demo

David Arenburg
quelle
6

> <> , 38 37 Bytes

Fluch du doppelter Raum Fall * schüttelt Fisch *.

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

Sie können es online ausprobieren (alles, was Sie tun müssen, ist eine Eingabe über das Feld am unteren Rand und Givedrücken Sie dann die Taste). Vorschläge für weiteres Golfen sind immer willkommen, insbesondere Ideen, um diese verschwenderischen Räume vor der zweiten und dritten Zeile zu entfernen.

Wenn Sie eine zusätzliche neue Zeile für zusätzliche Leerzeichen drucken könnten, könnte der Code ganze 27 Bytes umfassen :

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

Erläuterung

Anmerkung: Die Reihenfolge der Erklärung entspricht der Position des Zeigers (wenn der Code also in einer anderen Reihenfolge erklärt wird, als dies der Fall wäre, führt der Zeiger ihn in dieser Reihenfolge aus).

Linie 1:

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

Zeile 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

Zeile 3:

Hinweis: Diese Zeile verläuft in umgekehrter Reihenfolge. Lesen Sie also von rechts nach links.

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

Grundsätzlich prüft das Programm, ob die Eingabe (die zeichenweise gelesen wird) kein Leerzeichen ist und gibt dann einen Stern aus. Es wird beendet, wenn keine Eingabe vorliegt (der Eingabewert ist -1). Um sicherzustellen, dass keine zusätzlichen Zeilenumbrüche gedruckt werden, wird der Registerwert verwendet, der entweder auf 0 oder 1 gesetzt wird. Aufgrund der Art und Weise, wie ich ihn einrichte, ist es egal, welche Werte auf den Stapel übertragen werden (z. B. den Wert des Registers, auf den es 1nach dem Drucken eines Sternchens gesetzt wird); Sie verbleiben auf dem Stapel, wenn das Programm beendet wird, tun aber nichts.

Ich weiß , es könnte ein bisschen verwirrend , da ich verwenden , 84*und 67*statt " "und "*"jeweils, aber das war , weil ich nicht aus irgendeinem Grunde , wie wenn man Strings im Programm fühlen.

cole
quelle
Gern geschehen;)
Beta Decay
6

Javascript ES6

Funktion, 46 Zeichen

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

Programm, 55 Zeichen

alert(prompt().replace(/\S/g,"*").replace(/\s+/g,"\n"))
Qwertiy
quelle
Ihre Funktion ist 46 Zeichen lang und Ihr Programm ist 55.
adroitwhiz
@ darkness3560, danke für die korrektur. Ich benutzte Ausdrücke "f=s=>s.replace(/\S/g,'*').replace(/\s+/g,'\n')".length, um die Länge zu messen und vergaß \.
Qwertiy
6

Perl, 16 Bytes (15 Zeichen + -p)

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

Rennen wie:

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

Dank @ThisSuitIsBlackNot wurde ein zusätzliches Byte gespeichert , auf das ich noch nie gestoßen y///swar!

Dom Hastings
quelle
Das ist ausgezeichnet! Sie können 1 Byte sparen, indem Sie die erste Ersetzung in eine Transliteration y/ /\n/s;
ändern
@ThisSuitIsBlackNot Ooh schön! Danke dir!
Dom Hastings
5

Gema, 11 9 Zeichen

 =\n
?=\*

Probelauf:

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'
******
*****
*******
Mann bei der Arbeit
quelle
5

PHP 5.3, 55 53 51 50 Bytes

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


Verbrauch:
Rufen Sie das Script und definieren eine globale Variable ($ a)
php -d error_reporting=0 script.php?a="This is an example histogram of word length"

Ausgabe:

****
**
**
*******
*********
**
****
******
jrenk
quelle
4

Java, 102 Bytes

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

Haskell, 31 Bytes

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

Anwendungsbeispiel:

Main> putStr.unlines.map(>>"*").words $ "This is an example histogram of word length"
****
**
**
*******
*********
**
****
******
nimi
quelle
Sie können ersetzen putStr.mit f=der Bytezahl zu senken, oder verwenden Sie main=interact$statt putStr.von STDIN zu lesen und ein komplettes Programm zu machen
HEGX64
@ HEGX64: Gibt aber so f=unlines.map(>>"*").wordsetwas zurück "****\n**\n**\n"und gibt nicht wie gewünscht ein "horizontales ASCII- Kunstdiagramm " aus.
nimi
4

CJam, 11 Bytes

Im Wettbewerb um den zweiten Platz in CJam fand @Optimizer eine clevere 10-Byte-Lösung. Dies ist eine einfache 11-Byte-Lösung:

lS%:,'*f*N*

Probieren Sie es online aus

Alternative Lösung, die anstelle der beiden Maps eine Schleife verwendet, ebenfalls 11 Byte:

lS%{,'**N}/

Erklärung zur ersten Lösung:

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
quelle
4

JavaScript (ES6), 37

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

Kürzere Version mit nur einer replace.

Cristian Lupascu
quelle
2
Verdammt, ich habe gerade meine ES6-Funktion beendet, 38 Bytes. Nimm mein Votum an, während ich beschämt davonlaufe! : D
MayorMonty
4

J, 10 Bytes

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

Bonus: vertikal (12 Bytes)

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

Bonus: vertikal gespiegelt (14 Bytes)

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

Python 3, 72 Bytes

Ein schöner Einzeiler :)

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

Ausgabe:

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

Es gibt hier einen nachgestellten Zeilenumbruch. Wenn Sie es ohne wollen, müssen Sie 5 Bytes hinzufügen:

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

Julia, 50 Bytes

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

Dadurch wird eine unbenannte Funktion erstellt, die eine Zeichenfolge als Eingabe verwendet und an STDOUT ausgegeben wird.

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
Alex A.
quelle
3

JavaScript (ES5)

Programm, 54 Zeichen

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

Funktion, 60 Zeichen

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

Anwendungsbeispiel:

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
quelle
3

Matlab - 54 Bytes

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

Dies läuft von der Konsole aus, nimmt einen String in die Eingabe von stdinund gibt das horizontale Wortdiagramm aus in stdout:

Beispiel:

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

Oder wir könnten versuchen, ausgefallene Formen zu kreieren:

>> 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
quelle
Sehr kluger Ansatz!
Luis Mendo
3

Matlab / Octave, 75 Bytes

Verwenden einer anonymen Funktion:

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

Vielen Dank an Hoki, der einen Fehler entdeckt hat, der verhindert hat, dass das letzte Wort erkannt wird.

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

Oder versuchen Sie es online (Oktave).

Luis Mendo
quelle
3

PowerShell, 35 - 31 Byte

Zur Abwechslung ziemlich konkurrenzfähig. Go go Gadget unären Operatoren. Ich vergesse auch immer wieder, dass das Paren einiger Funktionen, wie der hier verwendeten -splitund -replace, optional ist.

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

Wird über die Pipelineeingabe aufgerufen (entspricht stdin für PowerShell):

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

Als Bonus können wir, wenn wir stattdessen Befehlszeilenargumente verwenden können, bis zu 20 Bytes reduzieren und etwas haben, das sowohl mit als auch ohne eine einzelne Zeichenfolge als Eingabe funktioniert:

$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
quelle
3

Javascript (ES6)

Neue Lösung (39 Bytes):

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

Regex-Lösung (42 Byte):

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

Nicht-Regex-Lösung (71 Byte):

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

Diese Lösungen definieren anonyme Funktionen. Ordnen Sie sie Variablen zu oder rufen Sie sie wie folgt auf:

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

SWI-Prolog, 40 Bytes

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

Wird mit Code-Strings aufgerufen, z a(`This is an example histogram of word length`).

Tödlich
quelle
2

STATA, 72 Bytes

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

Beachten Sie, dass dieser Code im Online-Interpreter nicht funktioniert und den nicht-freien proprietären STATA-Interpreter erfordert.

Markierungen
quelle
2

C ++ 14, 107 106 Bytes

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

K5, 31 Bytes

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

O, 22 Bytes

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

Erläuterung

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
quelle
2

Strahl, 92 Bytes

Dies ist überhaupt keine wettbewerbsfähige Antwort und ziemlich spät, aber ich habe in letzter Zeit ein bisschen mit Beam herumgespielt und wollte sehen, ob ich es dazu bringen kann, dies zu tun. Endlich ein paar Erfolge :)

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

MickyT
quelle
1

AWK

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

Beispiele

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

Ausgabe:-

****
**
***********
Shravan Yadav
quelle