Herausforderung
Fabrikarbeiter sind normalerweise sehr fleißig. Ihre Arbeit wird heute jedoch häufig durch Maschinen ersetzt.
Sie müssen ein Programm schreiben, das eine Zahl als Eingabe verwendet. Es wird 10 Mal eine Fabrik mit 10 Arbeitern ausgedruckt. Jedes Mal hat jeder Arbeiter die 1/input
Chance, entlassen und durch eine Maschine ersetzt zu werden.
Eingang
Eine Ganzzahl, die von STDIN oder einem Funktionsaufruf stammt.
Ausgabe
10 Fälle der Fabrik, jeder mit normalerweise mehr Arbeitern entlassen.
Ausgabeformat - So drucken Sie eine Fabrik
Eine Fabrik sieht so aus:
|0000000000|
oder |0000011001|
Eine Pfeife repräsentiert die Wände, eine 0 repräsentiert einen Arbeiter und eine 1 repräsentiert eine Maschine, so dass der erste Druck der Fabrik immer sein wird |0000000000|
.
Beispiel
Eingabe: 10
Ausgabe:
|0000000000| //always start off with this
|0000000010| //a 1/10 chance means that this worker lost his job
|0000010010|
|0010010010|
|1010010010|
|1010110010|
|1010110011|
|1010111011|
|1010111111|
|1110111111|
Eingabe: 5
Ausgabe:
|0000000000| //always start here
|0000001001| //a 1/5 chance means that 2 workers got fired
|1000101001|
|1000101111|
|1101101111|
|1111111111| //after achieving all machinery, the machines continue to be printed
|1111111111|
|1111111111|
|1111111111|
|1111111111|
HINWEIS
Die Anzahl der entlassenen Arbeiter ist ZUFÄLLIG - in meinen Beispielen 1/5 chance
würden immer 2 Arbeiter entlassen, aber Ihr Programm muss dies zufällig tun - manchmal 1 und manchmal 3 - sie haben nur 1/5 Chance, entlassen zu werden.
Antworten:
Japt
-R
,2221201918 BytesVersuch es
Erläuterung
quelle
R ,
9289 BytesProbieren Sie es online!
Ungolfed:
quelle
replicate
undfor
Schleifen zu versuchen, 92 zu schlagen, ohne Erfolg, aber mit Ihren Tipps für habeDo-while loops
ich endlich erkannt, wie missbräuchlich{
dies sein kann. Ich habe diesen Missbrauch um ein Beispielfor()
für eine 92-Byte-Lösung erweitert. Vielleicht haben Sie die Auswirkungen von{
Missbrauch bereits erkannt, als Sie diesen Tipp-Post geschrieben haben, aber ich habe es erst jetzt bemerkt. tio.run/##K/r/…"for"
ist fast immer nicht besser alsfor
und es ist gelegentlich schlimmer !pmax
kann natürlich verwendet werden. Hier ist mein früherer Punkt über den{
Betreiber. tio.run/##PZDBasNADETv@xVDfKhNjcGHXAKl5OJTT2l/…JavaScript (ES6), 84 Byte
Probieren Sie es online!
Rekursive Version, 88 Bytes
Probieren Sie es online!
Wie?
Wir beginnen mit k = s = '5000000000' .
Bei jeder Iteration:
Wir zwingen jedes Zeichen i von s zu einer Zahl, berechnen i modulo 5 - so dass die führende 5 wie eine 0 behandelt wird - und führen zufällig ein bitweises ODER mit 1 mit der erwarteten Wahrscheinlichkeit 1 / n aus , mit Ausnahme der ersten Iteration .
Der Zähler k ist um 3 Bits nach rechts verschoben. Wir stoppen die Rekursion, sobald k = 0 ist , was 10 Iterationen ergibt.
Es ist wichtig zu beachten, dass 5000000000 geringfügig größer als eine 32-Bit-Ganzzahl ist. Daher wird sie unmittelbar vor der ersten bitweisen Verschiebung implizit in 5000000000 & 0xFFFFFFFF = 705032704 konvertiert . Daher die folgenden Schritte:
quelle
APL (Dyalog) , 37 Bytes
Probieren Sie es online!
Wie?
10⍴0
- Beginnen Sie mit 10 Nullen.⎕←' '~⍨⍕'|'⍵'|'
- jedes Mal, wenn das formatierte Array gedruckt wird,?10⍴⍺
- Erzeugen Sie ein zufälliges Array mit unterschiedlichen Werten1
bis zur Eingabe ,⍺=
- Elementweiser Vergleich mit der Eingabe. sollte markieren1
/ Eingabe der Elemente, geben Sie jeweils ein1
/ eingeben,⍵+
- zum Array hinzufügen,×
- signum. Null bleibt Null, alles, was größer als Eins ist, kommt auf Eins zurück.⍣10
- 10 mal wiederholen.quelle
Netzhaut , 30 Bytes
Probieren Sie es online!
Ich habe viel Spaß mit Zufälligkeit in Retina ^^
Erläuterung
In der ersten Phase wird die Saite vorbereitet, mit der wir arbeiten werden:
|
Ersetzt die gesamte Eingabe durch eine neue Zeile und dann 10 Zeilen, die so viele enthalten0
s, wie die Eingabe . Das erste Zeichen in jeder Zeile steht für einen Arbeiter der Fabrik.Die folgende Stufe bedeutet:
Die erste Zeile der Arbeitszeichenfolge enthält nur a
|
, das das erste Zeichen ist, das von jeder Iteration der Schleife gedruckt wird (wobei es das erste Zeichen der ersten Zeile ist), und das auch am Ende jeder Iteration gedruckt wird (wobei es das erste ist) Zeichen der ganzen Zeichenkette). Die Ersetzung hat keine Auswirkung auf diese Zeile, da sie keine Ziffer enthält.Jede andere Zeile enthält
n
Ziffern, daher gibt es eine 1n
, um das erste Zeichen der Zeile (welches das einzig sinnvolle ist) in eine zu verwandeln1
.quelle
PowerShell ,
828069 BytesProbieren Sie es online!
Übernimmt die Eingabe
$x
. Erstellt ein Array mit allen Nullen, speichert es in$a
und wiederholt es dann so oft. Praktischerweise ist die Fabrik genauso breit wie es Iterationen wert ist. Jede Iteration, mit der wir unsere aktuelle Factory ausgeben"|$(-join$a)|"
, durchläuft dann jedes Element von$a
.Im Inneren wählen wir das aktuelle Element
$_
, das mit einem der beiden Elemente-b
verknüpft wurde, basierend auf der Wahrscheinlichkeit basierend auf der Eingabe aus . Zum Beispiel für die Eingabe , liegt im Bereich zwischen und und seinem etwa 1 / 10tel der Zeit. Mit einem Wrapping von erhalten wir ungefähr die Zeit und die andere Zeit . Ja, dies bedeutet manchmal, dass wir eine mit einer anderen überschreiben , aber das ist in Ordnung.or
1
Random
$x
10
Get-Random -max 10
0
9
0
!(...)
Random
1
1/input
1-1/input
$_
1
1
Das resultierende Array wird dann
$a
für den nächsten Durchlauf zurückgespeichert. Alle resultierenden ZeichenfolgenWrite-Output
verbleiben in der Pipeline, und der implizite Zeitpunkt des Programmabschlusses gibt uns kostenlose Zeilenumbrüche.-2 Bytes dank Veskah.
-11 Bytes nur dank ASCII.
quelle
$a
klar , warum indizieren wir neu, wenn wir bereits eine Schleife durchlaufen? lol Und das ist ein kluger Trick mit dem-bor
. Vielen Dank!Perl 6 , 58 Bytes
Probieren Sie es online!
+(1 > $_ * rand)
erzeugt ein einzelnes Bit mit der erforderlichen Frequenz von1
s.xx 10
Repliziert diesen Ausdruck zehnmal, um eine einzelne Factory-Instanz als eine Liste von Bits zu erstellen, und[~]
fügt diese Liste zu einer einzelnen Zeichenfolge hinzu.xx 9
Repliziert diesen Factory-String-generierenden Ausdruck neun Mal und führt dann[\~|]
eine dreieckige Reduktion (die in einigen anderen Sprachen als "Scan" bezeichnet wird) mit dem String oder Operator durch~|
, sodass ein Worker, der in einer früheren Iteration gefeuert wurde, in späteren Iterationen gefeuert bleibt.quelle
for
. Übertrifft die auf Zahlen basierende Lösung, an der{say "|{.join}|"for [\<<+|>>] (?$++X*!<<^$_).roll(10)xx 10}
ich gearbeitet habe, um zwei Bytes. Das[\Z+|]
wären 56 Bytes, aber das funktioniert aus irgendeinem Grund nicht.$_*rand
mit.rand
. Die Art und Weise, wie ich die Regeln interpretiere und eine Liste mit "Factory" -Strings zurückgebe, sollte ebenfalls in Ordnung sein.Python 2 ,
104103 BytesProbieren Sie es online!
quelle
Jelly , 22 Bytes
Ein vollständiges Programm, das die Ganzzahl als Befehlszeileneingabe akzeptiert und die Ausgabe an STDOUT ausgibt.
(Als monadische Verknüpfung wird eine Liste von Zeichen und ganzen Zahlen zurückgegeben.)
Probieren Sie es online!
Wie?
Entscheidet in jeder Phase effektiv, ob jeder Arbeiter (einschließlich aller Maschinen) seinen Job verliert (mit einer Eins-in-N-Chance), jedoch werden Maschinen durch Maschinen ersetzt (mit logischem ODER).
quelle
MATL , 26 Bytes
Probieren Sie es online!
(Lange) Erklärung
Beispielstapelinhalte werden auf dem Weg gezeigt. Bei jedem Schritt wird der Stapelinhalt von unten nach oben angezeigt.
quelle
JavaScript (Node.js) ,
1059390 ByteProbieren Sie es online!
+2 Byte für das Einfügen des Arrays in die Funktion, danke an @Shaggy für den Hinweis
Probieren Sie es online!
quelle
w
sein müssen und daher in Ihrer Funktion deklariert werden müssen.C (GCC) ,
110106 Bytes-4 Bytes von @ceilingcat
Probieren Sie es online!
Durchläuft eine Liste von Zeichen für jede Ersetzungsrunde.
Ungolfed:
quelle
SmileBASIC, 75 Bytes
quelle
Perl 5 , 44 Bytes
Probieren Sie es online!
quelle
05AB1E , 22 Bytes
Probieren Sie es online!
Es sollte mehr Platz zum Golfen geben.
TÅ0
- Schieben Sie eine Liste von 10 Nullen.TF...
- Mach das 10 mal:DJ
- Duplizieren Sie das aktuelle Element und verbinden Sie es.'|.ø=
- Mit zwei|
s umgeben und auf STDOUT drucken.ITи
- Wiederholen Sie die Eingabe 10 Mal.€L€Ω
- Und für jedes Vorkommen erhalten Sie ein zufälliges Element von [1 ... N] . (Möglicherweise gibt es eine integrierte Funktion, die ich noch nicht gesehen habe.)Θ
- 05AB1E truthified ™ drücken. Überprüfen Sie für jedes, ob es 1 entspricht .s...~
- Logisch ODER das Ergebnis des aktuellen Elements.quelle
JavaScript, 83 Bytes
Code-Snippet anzeigen
quelle
Java 10,
153152131 Bytes-18 Bytes dank @ OlivierGrégoire und -3 Bytes mehr durch die Konvertierung von Java 8 nach Java 10.
Erläuterung:
Probieren Sie es online aus.
quelle
var
durchString
für Java 9 und niedriger und durch zusätzliche 3 Bytes. Ich habe im Grunde die beiden Schleifen, die Sie haben, zusammengeführt.Kohle ,
302927 BytesProbieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Schieben Sie eine Zeichenfolge von 10
0
s in die leere Listeu
.Wiederholen Sie den nächsten Befehl 10 Mal.
Wiederholen Sie dies für jedes Zeichen der letzten Zeichenfolge,
n-1
fügen Sie ein hinzu1
und wählen Sie ein zufälliges Zeichen aus der Zeichenfolge aus. Dies gibt die1/n
Möglichkeit, den Charakter in a zu ändern1
. Das Ergebnis wird nach verschobenu
.Ordnen Sie über der Liste der Zeichenfolgen, die jeweils mit umgeben sind
|
, implizit jeweils eine eigene Zeile zu.quelle
Python 3 , 132 Bytes
Probieren Sie es online!
quelle
APL + WIN,
30 4035 BytesVerpasste das bisschen über keine Leerzeichen; (- behoben & danke an Uriel für -3 Bytes
Fordert zur Eingabe der Nummer auf dem Bildschirm auf
Erklärung ähnlich der von Uriel:
quelle
9 10⍴?90⍴5
→?9 10⍴5
. Sie müssen auch LeerzeichenVBA, 144 Bytes
Zum leichteren Lesen eingerückt:
Nutzt 2 Punkte: VBA - Arrays wird standardmäßig auf Basis 0 (so
w(9)
ist die gleiche wiew(0 to 9)
) und die Schaffung der Array als lange wird automatisch initialisieren es auf 0.(Es ist ärgerlich, dass 20 Bytes automatisch formatiert werden, die VBA hinzufügt, aber nicht benötigt - 19 Leerzeichen und ein Semikolon)
quelle
Ich sehe noch keine Antwort für Ruby, also:
Ruby , 92 Bytes
Probieren Sie es online!
quelle
rand(n)<1
anstelle von verwendenrand(n)==0
, und speichern Sie einige, indem Sie{..}
anstelle von verwendendo..end
, z. B.x.times{puts'|'+z...}
Ruby, 67 Bytes
Ich glaube, ich habe hier ein paar Dinge betrogen. Zuallererst druckt diese Funktion die Ausgabe mit Anführungszeichen um jede Zeile, zB:
Wenn dies nicht akzeptabel ist (vorausgesetzt, dies ist ascii-art , was wahrscheinlich der Fall ist), ist hier eine Lösung, die 70 Bytes ohne Anführungszeichen ausgibt :
Erläuterung:
quelle
PHP,
71-70Bytesverschmelzen Loops wurden (erneut) 5 Bytes gespart:
Mit
-nR
oder als Pipe ausführen probieren Sie es online aus .edit 1: festes format und erste ausgabe (keine änderung der
byteanzahl durch zusätzliches golfen ) edit 2: ein weiteres byte golfen: nach dem letzten druck muss niemand mehr gefeuert werden.
quelle
C # (Visual C # Interactive Compiler) , 131 Byte
Hey, zumindest habe ich mich mit Java beschäftigt.
Probieren Sie es online!
quelle