Strom von Briefen zu Wörtern

8

Teilen Sie eine Zeichenfolge, die nur Buchstaben enthält (ohne Berücksichtigung der Groß- und Kleinschreibung), mit der folgenden Verteilung in Wörter mit gleichmäßig zufälligen Längen auf, mit Ausnahme des letzten Wortes, das eine beliebige gültige Länge haben kann (1-10). Ihre Ausgabe besteht aus diesen Wörtern als durch Leerzeichen getrennte Zeichenfolge ( "test te tests"), Array von Zeichenfolgen ( ["test","te","tests"]) oder einem anderen ähnlichen Ausgabeformat.

Wortlängenverteilung

Word Length - Fractional Chance / 72 - Rounded Percentage
1 - 2 / 72 - 2.78%
2 - 14 / 72 - 19.44%
3 - 16 / 72 - 22.22%
4 - 12 / 72 - 16.67%
5 - 8 / 72 - 11.11%
6 - 6 / 72 - 8.33%
7 - 5 / 72 - 6.94%
8 - 4 / 72 - 5.56%
9 - 3 / 72 - 4.17%
10 - 2 / 72 - 2.78%

Ihre Gewinnchancen müssen nicht genau übereinstimmen - sie können um 1/144th oder .69%in beide Richtungen abweichen (aber natürlich müssen sie immer noch zu 72/72oder summieren 100%).

Daten grob erraten von der vierten Seite, erste Abbildung dieses Papiers .

Testfälle mit Probenausgabe

Das Verhalten in sehr kurzen (Länge <11) Testfällen ist undefiniert.

Beachten Sie, dass ich diese von Hand erstellt habe, damit sie der oben angegebenen gleichmäßigen Verteilung folgen können oder nicht.

abcdefghijklmnopqrstuvwxyz
abcd efgh i jklmnopq rs tu vwx yz

thequickbrownfoxjumpedoverthelazydog
t heq uick brown fo xj ump edo vert helazydog

ascuyoiuawerknbadhcviuahsiduferbfalskdjhvlkcjhaiusdyfajsefbksdbfkalsjcuyasjehflkjhfalksdblhsgdfasudyfekjfalksdjfhlkasefyuiaydskfjashdflkasdhfksd
asc uyoi uawer k nb a dhcviua hsid ufe r bfa lskd jhv lkcj haius dy faj se fbks dbfkals jcuyasjehf lkjh falk sd blhsgdf asudyfekjf alk sdjfhlk asefyu iaydskfja shdflk as dhf ksd

Dies ist , also gewinnt die kürzeste Antwort in Bytes.

Stephen
quelle
Sandbox
Stephen
Kann das letzte Wort eine leere Zeichenfolge sein?
Rahnema1
@ rahnema1 meinst du in einer Array-Ausgabe?
Stephen
Ja, letztes Element der Array-Ausgabe.
Rahnema1
@ rahnema1 sicher, denn wenn Sie dem Array auf Speicherplatz beitreten, hätten Sie nur einen nachgestellten Speicherplatz, den ich zulassen würde.
Stephen

Antworten:

5

Gelee , 28 Bytes

“¤Œæ׿®¬©¥¤‘Jẋ"$FẋLẊ‘1¦+\Ṭœṗ

Ein monadischer Link, der eine Liste erstellt und eine Liste mit Listen zurückgibt.

Probieren Sie es online aus! (Die Fußzeile trennt die resultierende Liste der Listen durch Leerzeichen.)

Wie?

Verwendet alle Prozentsätze in der Verteilung, die auf die nächste Ganzzahl gerundet sind (und somit innerhalb der zulässigen Schwellenwerte von 0,69% liegen).

“¤Œæ׿®¬©¥¤‘Jẋ"$FẋLẊ‘1¦+\Ṭœṗ - Link: list (of characters), s
“¤Œæ׿®¬©¥¤‘                 - code page indexes = [3,19,22,17,11,8,7,6,4,3]
               $             - last two links as a monad:
            J                -   range of length = [1, 2, 3, 4, 5,6,7,8,9,10]
              "              -   zip with:
             ẋ               -     repeat list = [[1,1,1],...,[9,9,9,9],[10,10,10]]
                F            - flatten (into one list of length 100)
                  L          - length of s
                 ẋ           - repeat list (one list of length 100*length(s) with the
                             -              correct distribution of integer lengths)
                   Ẋ         - shuffle
                      ¦      - sparse application of:
                    ‘        -   increment
                     1       -   to indexes: 1 (offset indexes for the partition below)
                        \    - cumulative reduce by:
                       +     -   addition (e.g. [4,4,7,1,...] -> [4,8,15,16,...])
                         Ṭ   - untruth (yield a list with 1s at those indexes (1 indexed)
                          œṗ - partition s at truthy indexes (note: excess ignored)
Jonathan Allan
quelle
Ihr Skript kann theoretisch die Liste ausgeben, deren erstes Element eine leere Zeichenfolge ist. Ich bin mir nicht sicher, ob die Frage dies zulässt.
@ThePirateBay Ja, ich habe das gerade selbst bemerkt - ich muss 1 zum ersten Element meiner kumulativen Längen hinzufügen; wird in Kürze aktualisiert, um das Problem zu beheben.
Jonathan Allan
Behoben und Erklärung hinzugefügt (kann nicht darum bitten, das führende Leerzeichen zuzulassen, da die erste Wortlänge tatsächlich die falsche Verteilung verwenden würde).
Jonathan Allan
4

PHP, 94 Bytes

for(;$c=$argn[$k++];print$c." "[--$e])if(!$e)for($r=rand(0,71);$r>ord(x^"ywgSKAF:=?"[$e++]););

Laufen Sie als Pipe mit -nRoder probieren Sie es online aus .

Nervenzusammenbruch

for(;$c=$argn[$i++];            # loop $c through string
    print$c                         # 2. print current character,
        ." "                        # 4. if remaining length is 0, print space
        [--$e]                      # 3. decrement remaining length
    )
    if(!$e)                         # 1. if remaining length is 0,
        for($r=rand(0,71);              # get random value from 0 to 71
            $r>ord(x^"ywgSKAF:=?"[$e++])    # and increment $e while $r is > probability
        ;);

Hinweis: ywgSKAF:=?repräsentiert die zunehmenden Wahrscheinlichkeiten -1:[1,15,31,43,51,57,62,66,69,71]

Titus
quelle
Ich frage mich: Würden sich die Wahrscheinlichkeiten ändern, wenn ich rand()jeden Vergleich anfordern würde ? Wenn nicht, könnte ich 5 Bytes sparen.
Titus
1
Sie würden sich sicherlich ändern, z. B. wäre die Wahrscheinlichkeit der Länge 2 70/72 * 16/72, was höher als 14/72 ist.
Ørjan Johansen
@ ØrjanJohansen Etwas hat mir gesagt, dass das passieren würde. Schade: Auf diese Weise würde ich mindestens 5 Bytes verschwenden.
Titus
Dies ist nicht das erste Mal, dass ich eine angeblich vollständige PHP-Lösung sehe, die nicht mit <? oder <? php. Als eigenständiges Programm ausführen, das braucht PHP. Oder fehlt mir etwas?
Manassehkatz-Moving 2 Codidact
@manassehkatz Du vermisst Run as pipe with -nR. Dh dieser Code soll ein Parameter für PHP sein, keine Datei. Verwenden Sie echo <input> | php -nR '<code>'in der Befehlszeile auszuführen.
Titus
3

Oktave, 108 Bytes

@(s)mat2cell(s,1,[k=(w=repelems(1:10,[1:10;'AMOKGEDCBA'-63])(randi(72,1,n=nnz(s))))(cumsum(w)<=n) n-sum(k)])

Probieren Sie es online aus!

* Nimmt die Zeichenfolge als Eingabe und gibt ein Array von Zeichenfolgen aus.

* Das letzte Element der Ausgabe kann eine leere Zeichenfolge sein.

rahnema1
quelle
3

Python 2, 154 150 147 145 Bytes

Okay, dies ist mein erster Versuch mit Code Golf. Mit dem Code direkt:

import numpy.random as r
def f(s):
 i=0
 while i<len(s):
    i+=r.choice(11,p=[x/72. for x in [0,2,14,16,12,8,6,5,4,3,2]])
    s=s[:i]+' '+s[i:]
    i+=1
 return s

Der zweite Einzug ist ein Tabulatorzeichen, wie Sie in meiner TIO-Version sehen können: Probieren Sie es online aus .

Ich füge der Zeichenfolge ein Leerzeichen entsprechend der angegebenen Verteilung hinzu. Ich habe meine Distribution sehr verbessert, indem ich Folgendes verwendet habe:

import collections
dist = r.choice(11,100000,p=[x/72. for x in [0,2,14,16,12,8,6,5,4,3,2]])
print collections.Counter(dist)

Welches gab mir:

Word Length - Rounded Percentage as asked - Rounded Percentage as counted
1 - 2.78% - 2.794%
2 - 19.44% - 19.055%
3 - 22.22% - 22.376%
4 - 16.67% - 16.638%
5 - 11.11% - 11.246%
6 - 8.33% - 8.362%
7 - 6.94% - 7.063%
8 - 5.56% - 5.533%
9 - 4.17% - 4.153%
10 - 2.78% - 2.780%

Was ich für richtig genug halte. Ich wiederhole dann diesen Vorgang des Hinzufügens eines Leerzeichens, bis die Länge meiner Zeichenfolge erreicht ist. Ich erhöhe meinen Positionsindex auch um eins, nachdem ich ein Leerzeichen hinzugefügt habe. Ich hoffe, jemand kann mir helfen, diese Linie zu spielen, aber ich habe nicht gesehen, wie ich sie herausholen kann, ohne das erste Feld zu verfälschen.

Wenn ich meinen Text sehe, erkenne ich, dass ich viel über diese Site lernen muss. Könnte mir jemand eine Anleitung zur Verwendung der Stackoverflow-Antwortfunktion in den Kommentaren verlinken, damit ich für meine nächsten Beiträge lernen kann.


Bearbeiten:

Anscheinend habe ich beim erneuten Lesen meines Beitrags einen Weg gefunden, das i + = 1 loszuwerden. Also habe ich 4 Bytes gespart. Der neue Code sieht folgendermaßen aus:

import numpy.random as r
def f(s):
 i=-1
 while i<len(s):
  i+=r.choice(11,p=[x/72. for x in[0,2,14,16,12,8,6,5,4,3,2]])+1
  s=s[:i]+' '+s[i:]
 return s

Probieren Sie es online aus!


Bearbeiten:

Ich habe herausgefunden, dass ich einige Zeilenumbrüche entfernen kann.

import numpy.random as r
def f(s):
 i=-1
 while i<len(s):i+=r.choice(11,p=[x/72. for x in[0,2,14,16,12,8,6,5,4,3,2]])+1;s=s[:i]+' '+s[i:]
 return s


Bearbeiten: Ich habe meinen Import modifiziert und die Definition von i in die Funktion eingefügt.

from numpy.random import*
def f(s,i=-1):
 while i<len(s):i+=choice(11,p=[x/72. for x in[0,2,14,16,12,8,6,5,4,3,2]])+1;s=s[:i]+' '+s[i:]
 return s

Probieren Sie es online aus!

Simon
quelle
Willkommen bei Programming Puzzles & Code Golf! Schöner erster Beitrag! Ich habe Ihre Antwort ein wenig bearbeitet, um die Formatierung (Titel, Syntaxhervorhebung) zu verbessern. Sie können sich ansehen, was sich geändert hat, um die Befehle für Ihre zukünftigen Beiträge anzuzeigen. (Ich habe leider keinen Link, den ich dir geben kann, aber hoffentlich wird es jemand anderes tun)
Dada
Vielen Dank für die Begrüßung und Formatierung meines Textes. Dies hat mir geholfen und ich habe es bereits in meiner Bearbeitung verwendet.
Simon
2

Dyalog APL, 90 Bytes

{k←⍵⋄{' '~⍨(2⊃⍵)↓k↑⍨⊃⍵}¨(↓(o[1;2]),0),↓o←1↓⍉2(1-⍨≢⍵)⍴+\((2 14 16 12 8,⌽1+⍳5)\⍳10)[72?⍨≢⍵]}

Probieren Sie es online aus! Klicken Sie einige Male auf Ausführen, um zu sehen, wie sich dies ändert.

Wie?

72?⍨≢⍵ - Wirf 72-seitige Würfellänge der Eingabezeiten

[...] - Index innen

(2 14 16 12 8,⌽1+⍳5)\⍳10- Erweitern Sie den Bereich von 10 um 2 14 16 12 8 6 5 4 3 2(um einen gewichteten Zufall zu erstellen)

+\ - kumulative Summe

⍉2(1-⍨≢⍵)⍴- Form als Reißverschlusstisch x y zz x, x y, y z

o←1↓ - Erstes Element löschen

(↓(o[1;2]),0),↓o - umschließen mit seiner ersten Koordinate gepaart mit 0

¨ - für jedes Paar (x, y)

(2⊃⍵)↓k↑⍨⊃⍵ - Eingaben vom Index x nach y vornehmen

' '~⍨ - und Leerzeichen entfernen

Uriel
quelle
2

Python 2 , 155 Bytes

from random import*
def f(s):
 i=sum([[i+1]*[2,14,16,12,8,6,5,4,3,2][i]for i in range(10)],[])[randint(0,71)]
 return s if len(s)<11else s[:i]+' '+f(s[i:])

Probieren Sie es online aus!

Chas Brown
quelle
2

Mathematica, 164 Bytes

(s=Length[c=Characters@#];t=0;l={};While[t<s,If[t+(r=RandomChoice[{2,14,16,12,8,6,5,4,3,2}->Range@10])<=s,l~AppendTo~r];t=Tr@l];""<>#&/@FoldPairList[TakeDrop,c,l])&


Nimmt eine Zeichenfolge als Eingabe
gibt ein Array von Zeichenfolgen aus

J42161217
quelle
2

Holzkohle , 43 39 Bytes

FθF⁺¹I‽⪫Eχ×Iκ⌕᧔v↷£o8″!”κω⊞υ⎇κω Fθ⁺ι⊟υ

Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Gibt ein nachfolgendes Leerzeichen aus, wenn das letzte Wort die exakt zufällig ausgewählte Größe hatte.

Neil
quelle
Ja, es scheint zu lang: / Irgendeine Idee für neue Funktionen, die es verkürzen würden?
Nur ASCII-
@ Nur ASCII Ich kann mir keine gute Möglichkeit vorstellen, die Wahrscheinlichkeitstabelle zu generieren, die bereits über 50% des Codes ausmacht. Es wäre schön, wenn ich nicht herumarbeiten müsste, Assign(Slice(q, i), q);ohne zu arbeiten.
Neil
Das würde funktionieren, nur ist es mehrdeutig, nicht ganz sicher, wie man das am besten beheben kann, sorry
ASCII-nur
Woah so viel Nesting
ASCII-
@ Nur ASCII Wen interessiert es, ob Bytes gespeichert werden?
Neil
2

Perl 5 , 107 Bytes

@B=((1,10,9,5,2)x2,(2,3,4)x12,(5,6)x6,7,(3,7,8)x4,9);while(10<length){$i=$B[rand 72];s/.{$i}//;print"$& "}

Probieren Sie es online aus!

106 Bytes Code +1 für -p

Xcali
quelle
Willkommen auf der Seite! Schön, einen neuen Perl-Golfer zu sehen, tolle Antwort! (Sie können jedoch immer noch einige Bytes speichern ). Außerdem empfehle ich, einige Erklärungen hinzuzufügen, damit Nicht-Perl-Leute eine Vorstellung davon haben, wie Sie es gemacht haben (und selbst für Perl-Codierer spart es ein bisschen Zeit), aber das ist nicht obligatorisch und liegt ganz bei Ihnen.
Dada
1

Rubin , 96 + 1 = 97 Bytes

Verwendet die -pFlagge.

i=0
m=[3,19,22,17,11,8,7,6,4,3].flat_map{|k|[i+=1]*k}
i=0
$_[i-1,0]=' 'while~/$/+1>i+=1+m.sample

Probieren Sie es online aus!

Wert Tinte
quelle
1

> <> , 168 152 Bytes

<v?(0:i
~/<r
/x\/oo \
012\oo~\!/ !ox\
\v/:1=?^?\ooo>>
 x^
v\:1\/>> o
|/o\=\x^!/
voo/? >x
v\o~/ v_
>" "\?\x>xoo\
^oooooo<<< \
^.22/ \>x!/xv
^ooooooo_o<<<

Probieren Sie es online aus oder schauen Sie es sich auf dem Fischspielplatz an !

Zufälligkeit ist in> <> schwierig: Es gibt nur eine zufällige Anweisung, xdie die Richtung des Fisches entweder nach oben, unten, links oder rechts festlegt. Dies ist ein kompliziertes Programm. Hier ist ein farbcodiertes Diagramm, das Ihnen hilft:

Farbcodierter Code!

Ich habe versucht, die Wahrscheinlichkeiten in Blöcke aufzuteilen, so dass die Wahrscheinlichkeiten innerhalb und zwischen den Blöcken ziemlich einfach waren (z. B. 1/3 bis 25/72). Ich habe das wie folgt gemacht:

Baum der Wahrscheinlichkeiten

Der Fisch beginnt am grauen Teil des Codes ( X ). Dies ist ziemlich normaler> <> Code zum Einlesen aller Eingaben. Es wird interessanter, also lasst uns weitermachen.

Als nächstes kommt der Fisch zu den hell- und dunkelgrünen Abschnitten ( Y ). Aus dem Wahrscheinlichkeitsbaum können Sie ersehen, dass sich die drei Hauptzweige jeweils zu 1/3 summieren und dass sich jeder dieser Zweige in einen 2/3 Unterzweig und einen 1/3 Unterzweig aufteilt. Die grünen Codeabschnitte decken diese beiden Ebenen des Baums ab. Zuerst wählen wir eine Zufallszahl aus 0, 1, 2 mit jeweils gleicher Wahrscheinlichkeit im oberen Lappen des hellgrünen Bits. Wir können eine 1/3 Chance mit der Vier-Wege-Anweisung simulieren, indem wir xeinen der Ausgänge abschneiden, so dass der Fisch nur zurück zum x- umgeleitet wird - dann gibt es nur drei Fluchtwege vomx und aus Symmetriegründen haben sie gleiche Wahrscheinlichkeiten.

Der nächste x, etwas unterhalb dieses, schickt den Fisch ^mit einer Chance von 2/3 zum nächsten daneben - beachten Sie, dass sich der Fisch umwickelt, wenn er von links nach links schwimmt x- und mit einer \Chance von 1/3 zu einem . Der Fisch schwimmt dann entlang eines der beiden Schwänze des hellgrünen Abschnitts. Diese Schwänze sind funktional gleich: Jeder prüft, ob wir zuvor 0, 1 oder 2 gedrückt haben, und verzweigt sich entsprechend. Damit sind die ersten beiden Ebenen des Baums abgeschlossen.

In den nächsten sechs Abschnitten ( A - F ) werden im Wesentlichen mehr xs verwendet, um den Fisch weiter zu verzweigen, und dann einige os, um eine Anzahl von Buchstaben aus der Eingabe zu drucken. Diese Abschnitte reichen von einfach (z. B. dunkelblau,  C , das nur drei Buchstaben druckt) bis nicht so einfach (z. B. Orange, D , das zwei benötigt)x Sekunden benötigt, um eine 3 / 8–5 / 8-Teilung zu simulieren und Buchstaben einzudrucken mehrere Stufen). Die Details davon bleiben als Übung. (Ich bin besonders zufrieden mit Gelb, E , das den Fisch in einer Schleife schickt!)

Nach jedem dieser Zweige erreicht der Fisch schließlich den rosa Abschnitt ( Z ). Dadurch werden alle Zweige wieder zusammengezogen, ein Leerzeichen gedruckt, und der Fisch springt schließlich zu Position (2,2) im Raster und beginnt beim ersten Mal erneutx .


Für den Fall, dass die obige Erklärung "es ist kompliziert" Sie nicht davon überzeugt, dass dies die richtigen Wahrscheinlichkeiten ergibt, habe ich dies auch an einer Eingabezeichenfolge mit einer Länge von 65.000 (64 KiB, nur 13 Sekunden in TIO!) Und der daraus resultierenden Verteilung der Wortlängen getestet war

{{1,0.027377},{2,0.191237},{3,0.226599},{4,0.164128},{5,0.113064},{6,0.0818627},{7,0.0703885},{8,0.0543515},{9,0.0426089},{10,0.0283835}}

Diese Wahrscheinlichkeiten sind höchstens 0,0044 von den erwarteten Wahrscheinlichkeiten entfernt.

Kein Baum
quelle