Herausforderung:
Eingänge:
- Eine Zeichenfolge mit druckbarem ASCII (ohne Leerzeichen, Tabulatoren und Zeilenumbrüche)
- Ein Boolescher †
Ausgabe:
Die Teile der Zeichenfolge sind in vier Gruppen unterteilt:
- Kleinbuchstaben
- Großbuchstaben
- Ziffern
- Andere
Basierend auf dem Booleschen Wert geben wir entweder das höchste Vorkommen einer (oder mehrerer) dieser vier Gruppen aus oder das niedrigste, wobei wir alles andere durch Leerzeichen ersetzen.
Beispielsweise:
Eingabe: "Just_A_Test!"
Es enthält:
- 3 Großbuchstaben: JAT
- 6 Kleinbuchstaben: ustest
- 0 Ziffern
- 3 weitere:__!
Dies wären die Ausgaben für true
oder false
:
true: " ust est "
// digits have the lowest occurrence (none), so everything is replaced with a space
false: " "
(Hinweis: Sie dürfen nachgestellte Leerzeichen ignorieren, daher können die Ausgaben auch " ust est"
und sein ""
.)
Herausforderungsregeln:
- Die Eingabe ist niemals leer oder enthält Leerzeichen und besteht nur aus druckbarem ASCII im Bereich
33-126
oder'!'
durch'~'
. - Sie können die Ein- und / oder Ausgänge als Zeichenfeld oder Liste verwenden, wenn Sie möchten.
- † Es sind zwei beliebige konsistente und unterschiedliche Werte für den Booleschen Wert zulässig:
true
/false
;1
/0
;'H'
/'L'
;"highest"
/"lowest"
; usw. Beachten Sie, dass diese unterschiedlichen Werte (etwas) als Boolescher Wert verwendet werden sollten! Es ist also nicht erlaubt, zwei vollständige Programme einzugeben, eines, das das richtige Ergebnis fürtrue
und das andere für liefertfalse
, und dann nur Ihren tatsächlichen Code zu haben<run input with parameter>
. Relevante neue Standardlücke, die ich hinzugefügt habe, obwohl sie hinsichtlich der Definitionen noch viel Feinabstimmung erfordern kann. - Wenn das Vorkommen von zwei oder mehr Gruppen gleich ist, geben wir alle diese Vorkommen aus.
- Die erforderlichen nachgestellten Leerzeichen sind optional, und eine einzelne nachstehende neue Zeile ist ebenfalls optional. Erforderliche führende Leerzeichen sind obligatorisch. Andere führende Leerzeichen oder Zeilenumbrüche sind nicht zulässig.
Allgemeine Regeln:
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden. - Für Ihre Antwort gelten Standardregeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methode mit den richtigen Parametern und vollständige Programme verwenden. Ihr Anruf.
- Standardlücken sind verboten.
- Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu.
- Fügen Sie ggf. auch eine Erklärung hinzu.
Testfälle:
Inputs: Output:
"Just_A_Test!", true " ust est " (or " ust est")
"Just_A_Test!", false " " (or "")
"Aa1!Bb2@Cc3#Dd4$", either "Aa1!Bb2@Cc3#Dd4$"
"H@$h!n9_!$_fun?", true " @$ ! _!$_ ?"
"H@$h!n9_!$_fun?", false "H 9 " (or "H 9")
"A", true "A"
"A", false " " (or "")
"H.ngm.n", true " ngm n"
"H.ngm.n", false " " (or "")
"H.ngm4n", false "H. 4 " (or "H. 4")
"H "
und" 9 "
(mit entsprechenden Leerzeichen) statt ausgegeben werden"H 9"
?H
und9
gehören zu den "Wenigsten"."max"
/ sein"min"
, auf den dannMath[b]
verwiesen wirdMath.max
oderMath.min
?b?"max":"min"
in Ihrer Antwort behalten . Es ist eine feine Linie, denke ich, vielleicht sollte ich beim nächsten Mal einfach einen Wert für Wahrhaftigkeit / Falschheit verwenden.Antworten:
Schale ,
27262422 Bytes-2 Bytes dank Zgarb
-2 Bytes dank Leo
Takes
' '
asFalse
and'a'
asTrue
(In Husk sind Leerzeichen in Fasly und alle anderen Zeichen die Wahrheit)Probieren Sie es online!
Wie funktioniert es?
†
ḟ
ist eine Funktion, die ein Prädikatp
und eine Liste annimmtL
und das erste Element davon zurückgibt, dasL
erfülltp
. Wenn kein Element erfüllt ist, wirdp
ein Standardargument zurückgegeben. In diesem Fall' '
. Durch die Anwendungḟ
auf eine eine Zeichenkette, sagen wir im Wesentlichenif p c then c else ' '
.Ṫ
Ist Funktion , die eine Funktion übernimmtf
und zwei ListenL1
,L2
. Es wird eine Tabelle mitf
angewendeten Werten für alle Paare vonL1
und zurückgegebenL2
. In diesem Fallf
istḟ
,L1
unsere Liste mit 4 Funktionen undL2
die Liste mit einer Zeichenfolge.Nachdem
Ṫḟ
wir eine Liste von Zeichenfolgen erstellt haben, in der jede Zeichenfolge das Ergebnis des Ersetzens von Zeichen ist, die einer der Regeln nicht entsprechen, durch a' '
.Hinweis: In neueren Versionen von Husk
ġ#¬Ö#≡⁰
kann dies durchk#≡⁰
eine 3-Byte-Einsparung ersetzt werden!quelle
' '
und'a'
? Vielleicht verstehe ich es besser, wenn die Erklärung hinzugefügt wird, weil ich Husk nicht lesen kann. ;)Ṫ
.Mmm
ich selbst tue :)S`?'
könnte aber einfacher sein als?IK'
I
, manchmal lässt es den Dolmetscher für immer dauern. Es scheint auch verschwenderisch.Gelee , 31 Bytes
Probieren Sie es online!
Die Booleschen Werte sind
2
und1
(oder jedes andere positive gerade / ungerade Paar), dieTrue
und darstellenFalse
. Ich werde versuchen, nach weiteren Golfspielen eine Erklärung hinzuzufügen.Dank Caird Coinheringaahing für die Einsparung von 2 Bytes und Lynn für das Speichern von 4 Bytes! Dank eines von Eriks Tricks , der mich dazu inspiriert hat, 4 Bytes zu sparen!
Wie es funktioniert
Beachten Sie, dass dies die Erklärung für die 35-Byte-Version ist. Das neue tut ungefähr das Gleiche (aber ein bisschen von Lynn optimiert), also werde ich es nicht ändern.
quelle
µ
D:ØṖḟØBṭØBUs26¤
und testen Sie dann die Mitgliedschaft mitf
undÇ
anstelle vone¢$
.Python 2 ,
166158 BytesProbieren Sie es online!
quelle
R ,
193186179158 Bytes-7 Bytes dank NofP und seinem Vorschlag von
cbind
-6 Bytes mit
outer
, -1 Bytes[^a-zA-Z0-9]
mit[[:punct:]]
-21 Bytes Dank an MickyT für den Hinweis auf eine Liste von Zeichen ist erlaubt
Überprüfen Sie alle Testfälle
Nimmt
1/T
als wahr (max
) und0/F
als falsch (min
) und nimmtS
als Liste der einzelnen Zeichen.Probieren Sie es online!
In meiner ursprünglichen Version (mit den Vorschlägen von NofP) wird die Matrix erstellt,
y
indem siegrepl(regex, S)
für jede ausgewertetregex
und dann als Spalten einer Matrix zusammengefügt wird. Dies führt zu mehreren Anrufen angrepl
, aber wieS
behoben, schien es, dass etwas anderes getan werden musste. Wie ich bemerkte:Ich habe
outer
stattdessen verwendetmapply
, was immer ein Array (in diesem Fall eine Matrix) zurückgibt und dazu gezwungen wurdeVectorize
grepl
, was eigentlich nur ein Array istmapply
Wrapper .Ich habe auch die vordefinierte Zeichengruppe entdeckt,
[:punct:]
die mit Interpunktionszeichen (keine Leerzeichen, keine alphanumerischen Zeichen) übereinstimmt.quelle
like this
. :)S=el(strsplit(G,""))
Schale ,
31 2928 BytesVerwendet 0 für minimale und 1 für maximale Zeichenanzahl. Probieren Sie es online!
Erläuterung
Funktionslisten sind cool.
quelle
Python 2 , 140 Bytes
Probieren Sie es online!
Jonathan Frech hat ein Byte gespeichert. Vielen Dank!
Am höchsten ist
m=-1
, am niedrigsten istm=0
.quelle
+x.isalpha()*-~(x>'Z')
mit-~(x>'Z')*x.isalpha()
.Gelee , 35 Bytes
Probieren Sie es online!
quelle
Java (OpenJDK 8) ,
448439432362361354352348343320 ByteProbieren Sie es online!
quelle
+
in\\|+$
einem zusätzlichen -1 Byte.String r=(w[0]!=m?"[a-z]|":"")+(w[1]!=m?"[A-Z]|":"")+(w[2]!=m?"[0-9]|":"")+(w[3]!=m?"[^a-zA-Z0-9]|":"");return r.isEmpty()?s:s.replaceAll(r.replaceAll(".$","")," ");}
.n=s.length()
kannn=-1>>>1
für eine zusätzliche -4 sein.[0-9]
\\d
Ruby ,
118116 BytesNimmt
0
(niedrigste) oder-1
(höchste) als zweites Argument.-2 Bytes dank Lynn.
Probieren Sie es online!
Ungolfed
quelle
-1
als der „höchste“ Wert und ersetzenminmax[t]
durchsort[t]
.Python 2,
190183174173 BytesVielen Dank an Jonathan Frech für die Kürzung
Dies nimmt die Zeichenfolgen
'max(l)'
und'min(l)'
als wahr und falsch. (Ich glaube nicht, dass dies gegen die Regeln verstößt ...?) Dies ist länger als die anderen beiden Python-Antworten, aber anders, also dachte ich, ich würde es posten. Ich bin kein großartiger Golfer, also denke ich, dass dies weiter verbessert werden könnte, aber all die Dinge, die ich versucht habe, haben nicht funktioniert.Probieren Sie es online!
quelle
sum(1for m...
sollte seinsum(1 for m...
, aber ich denke, es gibt auch andere Probleme. Können Sie einen Link zu einem Online-Dolmetscher (wie z. B. tio ) bereitstellen, um zu veranschaulichen, wie Sie dies aufrufen, und um zu zeigen, dass es keine Fehler gibt?max(l)
andmin(l)
as strings, that's why I was getting errors. Thanks for clearing that up! Although now, this is on the edge of violating rule #3, ` Note that these distinct values should be used (somewhat) as a boolean`, but it's definitely a little bit of a gray area.JavaScript (ES6),
151149 bytesSadly the rules probably don't allow me to pass
Math.max
orMath.min
as the flag. Edit: Saved 2 bytes thanks to @JustinMariner.quelle
Jelly, 37 bytes
Try it online!
-6 bytes "borrowing" from Erik's post :D
quelle
Java (OpenJDK 8),
307 + 34306 + 27295 bytesMy "interesting" take on the challenge.
Thanks to Kevin Cruijssen for
cutting down the import bytesremoving the import entirely!Try it online!
Explanation:
First replaces each group with an integer between 0 and 3 using some simple regex and stores this in a new String.
int a[]={0,0,0,0},m,i=0,z=0,y=-1>>>1;
Initialises an array of integers as well as a couple of other integers to use later. Sets the
y
variable to the max int size using unsigned right bit shift.t.chars().forEach(j->{a[j%4]++;});
For each character in the modified string, this uses its ASCII value modulo 4 to calculate the index of the aforementioned array to increment.
This then loops through the counts of each group stored in the array and calculates the minimum (
y
) and the maximum (z
).Loops through every character in the String again, checking if the group of that characters group is equal to the min/max (using the modulo trick mentioned earlier). If it isn't equal, then a space is added to the new String in the characters place, otherwise the original character is added.
return v;
Finally return the new String!
quelle
import java.util.stream.IntStream;
can beimport java.util.stream.*;
and,i
can be,i=0
after which you can removei=0
from the for-loop. Oh, and(s,b)->
can bes->b->
.java.util.function.Function<String, java.util.function.Function<Boolean, String>> g = s->b->{...};
.IntStream z=IntStream.of(a);m=(b?z.max():z.min()).getAsInt();
can bel=s.length(),x=0,y=l
andfor(int x:a){z=x>z?x:z;y=x<y?x:y;}
and(b?z:y)
, so you no longer need the import. Putting it all together becomes:s->b->{String t=s.replaceAll("\\d","2").replaceAll("[a-z]","0").replaceAll("[A-Z]","1").replaceAll("\\D","3"),v="";int a[]={0,0,0,0},i=0,l=s.length(),z=0,y=l;t.chars().forEach(j->{a[j%4]++;});for(int x:a){z=x>z?x:z;y=x<y?x:y;}for(;i<l;i++)v+=a[t.charAt(i)%4]!=(b?z:y)?" ":s.charAt(i);return v;}
(294 bytes).Bash,
229227212 bytesTry it Online
quelle
f(){((
.(
, also 2 bytes could be saved using(
instead of{
, degrading performance because creating a subshellPHP,
161158 bytesRun with
-nr
or try it online.and count the occurences of groups that the current character is not in.
(that negation saved 3 bytes)
from min/max non-count then print space, else print character.
quelle
JavaScript (ES6), 139 bytes
Input and output is an array of characters. Takes actual boolean values for input.
A different approach from @Neil's answer; almost avoiding regular expressions. Instead, I used a series of checks to determine the category of each character:
true
forc>-1
because non-digits fail mathematical comparisons/[a-z]/i
and have codepoints less than"a"
"a"
Test Cases
Show code snippet
quelle