Wyzwanie:
Wejścia:
- Ciąg zawierający ASCII do wydruku (z wyłączeniem spacji, tabulatorów i nowych wierszy)
- Wartość logiczna †
Wynik:
Części ciągu są podzielone na cztery grupy:
- Małe litery
- Wielkie litery
- Cyfry
- Inny
W oparciu o wartość logiczną albo wypisujemy najwyższe wystąpienie jednej (lub wielu) z tych czterech grup, albo najniższą, zastępując wszystko inne spacjami.
Na przykład:
Wprowadzanie: "Just_A_Test!"
Zawiera:
- 3 duże litery: JAT
- 6 małych liter: ustest
- 0 cyfr
- 3 inne:__!
Byłyby wyjścia dla true
lub false
:
true: " ust est "
// digits have the lowest occurrence (none), so everything is replaced with a space
false: " "
(Uwaga: możesz ignorować końcowe spacje, więc wyniki mogą być odpowiednio " ust est"
i ""
).
Zasady konkursu:
- Dane wejściowe nigdy nie będą puste ani nie będą zawierać spacji i będą się składały wyłącznie z drukowalnego ASCII w zakresie
33-126
lub'!'
przez'~'
. - Możesz wziąć dane wejściowe i / lub wyjściowe jako tablicę znaków lub listę, jeśli chcesz.
- † Dozwolone są dwie spójne i różne wartości logiczne:
true
/false
;1
/0
;'H'
/'L'
;"highest"
/"lowest"
; itd. Zauważ, że te odrębne wartości powinny być użyte (nieco) jako wartość logiczna! Dlatego nie wolno wprowadzać dwóch kompletnych programów, jednego, który daje poprawny wynik dlatrue
drugiegofalse
, a drugiego dla , a następnie posiadanie tylko faktycznego kodu<run input with parameter>
. Dodałem istotną nową domyślną lukę, chociaż nadal może ona zawierać wiele drobnych korekt dotyczących definicji. - Jeśli wystąpienie dwóch lub więcej grup jest takie samo, wyprowadzamy wszystkie te wystąpienia.
- Niezbędne końcowe spacje są opcjonalne, a pojedyncza nowa linia jest również opcjonalna. Niezbędne pola wiodące są obowiązkowe. I żadne inne wiodące spacje lub nowe linie nie są dozwolone.
Główne zasady:
- To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
Nie pozwól, aby języki kod-golfowe zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania. - Do odpowiedzi odnoszą się standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami, pełnych programów. Twoja decyzja.
- Domyślne luki są zabronione.
- Jeśli to możliwe, dodaj link z testem swojego kodu.
- W razie potrzeby dodaj również wyjaśnienie.
Przypadki testowe:
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 "
i" 9 "
(z odpowiednimi spacjami) wyprowadzać zamiast"H 9"
?H
i9
są częścią „najmniejsza”."max"
/"min"
, która jest następnie używana jakoMath[b]
odniesienieMath.max
lubMath.min
?b?"max":"min"
odpowiedź. Chyba jest to dobra linia, może następnym razem powinienem użyć wartości true / falsey.Odpowiedzi:
Łuska ,
27262422 bajtów-2 bajty dzięki Zgarbowi
-2 bajty dzięki Leo
Trwa
' '
jakFalse
i'a'
jakoTrue
(W Łusce, białe znaki w Fasly i wszystkie inne postacie są prawdziwe)Wypróbuj online!
Jak to działa?
†
ḟ
jest funkcją, która pobiera predykatp
i listęL
i zwraca pierwszy element,L
który spełniap
. Jeśli żaden element nie spełnia,p
zwracany jest domyślny argument. W tym przypadku' '
. Stosującḟ
do ciągu jednego znaku, zasadniczo mówimyif p c then c else ' '
.Ṫ
Jest funkcją, która wykonuje funkcjęf
i dwie listyL1
,L2
. Zwraca tabelęf
zastosowanych dla wszystkich parL1
iL2
. W tym przypadkuf
jestḟ
,L1
znajduje się lista z 4 funkcjami, aL2
lista jednego ciągów znaków.Po
Ṫḟ
mamy listę ciągów, w których każdy ciąg jest wynikiem zamiany znaków niespełniających jednej z reguł na a' '
.Uwaga: W nowszych wersjach Husk
ġ#¬Ö#≡⁰
można zastąpićk#≡⁰
3-bajtową oszczędnością!źródło
' '
i'a'
? Może lepiej to rozumiem po dodaniu wyjaśnienia, ponieważ nie mogę odczytać Łuski. ;)Ṫ
.Mmm
robię sam :)S`?'
może być prostsze?IK'
I
, czasem sprawia, że tłumacz trwa wiecznie. Wydaje się to również marnotrawstwem.Galaretka , 31 bajtów
Wypróbuj online!
Wartości logiczne o to
2
i1
(lub dowolny inny pozytywny parzyste / nieparzyste parę), które stanowiąTrue
iFalse
odpowiednio. Spróbuję dodać wyjaśnienie po dalszej grze w golfa.Dzięki caird coinheringaahing za zapisanie 2 bajtów i Lynn za zapisanie 4 bajtów! Dzięki jednej z sztuczek Erika , która zainspirowała mnie do zaoszczędzenia 4 bajtów!
Jak to działa
Zauważ, że to jest wyjaśnienie wersji 35-bajtowej. Nowy działa mniej więcej tak samo (ale trochę poprawił Lynn), więc go nie zmienię.
źródło
µ
D:ØṖḟØBṭØBUs26¤
, a następnie przetestuj członkostwo za pomocąf
iÇ
zamiaste¢$
.Python 2 ,
166158 bajtówWypróbuj online!
źródło
R ,
193186179158 bajtów-7 bajtów dzięki NofP i jego sugestii
cbind
-6 bajtów za pomocą
outer
, -1 bajtowe przełączanie za[^a-zA-Z0-9]
pomocą[[:punct:]]
-21 bajtów dzięki MickyT za wskazanie listy znaków jest dozwolone
Sprawdź wszystkie przypadki testowe
Pobiera
1/T
jako truey (max
) i0/F
jako falsey (min
) i przyjmujeS
jako listę pojedynczych znaków.Wypróbuj online!
W mojej oryginalnej wersji (z sugestiami NofP) macierz
y
jest konstruowana poprzez ocenęgrepl(regex, S)
każdego z nichregex
, a następnie połączenie ich razem jako kolumn macierzy. Powoduje to wiele wywołańgrepl
, ale jakS
zostało ustalone, wydawało się, że trzeba zrobić coś innego. Jak zauważyłem:Użyłem
outer
raczej niżmapply
, który zawsze zwraca tablicę (w tym przypadku macierz), i byłem do tego zmuszonyVectorize
grepl
, co jest tak naprawdę tylkomapply
otoczką.Odkryłem również predefiniowaną grupę znaków,
[:punct:]
która pasuje do znaków interpunkcyjnych (spacji, nie alfanumerycznych).źródło
like this
. :)S=el(strsplit(G,""))
Łuska ,
31 2928 bajtówUżywa 0 dla minimalnej i 1 dla maksymalnej liczby znaków. Wypróbuj online!
Wyjaśnienie
Listy funkcji są fajne.
źródło
Python 2 , 140 bajtów
Wypróbuj online!
Jonathan Frech uratował bajt. Dzięki!
Najwyższy jest
m=-1
, najniższy jestm=0
.źródło
+x.isalpha()*-~(x>'Z')
go-~(x>'Z')*x.isalpha()
.Galaretka , 35 bajtów
Wypróbuj online!
źródło
Java (OpenJDK 8) ,
448439432362361354352348343320 bajtówWypróbuj online!
źródło
+
in\\|+$
za dodatkową -1 bajt.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()
może byćn=-1>>>1
za dodatkowe -4.[0-9]
->\\d
Rubin ,
118116 bajtówPobiera
0
(najniższy) lub-1
(najwyższy) za drugi argument.-2 bajty dzięki Lynn.
Wypróbuj online!
Nie golfił
źródło
-1
jako „najwyższej” wartości i zastąpićminmax[t]
jąsort[t]
.Python 2,
190183174173 bajtówPodziękowania dla Jonathana Frecha za jego skrócenie
To trwa za sznurki
'max(l)'
i'min(l)'
jako prawdziwe i fałszywe. (Nie sądzę, że to łamie zasady ...?) To jest dłuższe niż pozostałe dwie odpowiedzi w Pythonie, ale inne, więc pomyślałem, że to opublikuję. Nie jestem świetnym golfistą, więc myślę, że można to jeszcze poprawić, ale wszystkie rzeczy, których próbowałem, nie zadziałały.Wypróbuj online!
źródło
sum(1for m...
powinno byćsum(1 for m...
, ale myślę, że istnieją inne problemy. Czy możesz podać link do tłumacza online (takiego jak tio ), aby zademonstrować, jak to się nazywa, i pokazać, że to nie błąd?max(l)
imin(l)
jako ciągi, dlatego otrzymywałem błędy. Dzięki za wyjaśnienie! Chociaż teraz jest to sprzeczne z zasadą nr 3, „Zauważ, że te odrębne wartości powinny być używane (nieco) jako wartość logiczna”, ale zdecydowanie jest to trochę szara strefa.JavaScript (ES6),
151149 bajtówNiestety reguły prawdopodobnie nie pozwalają mi podać
Math.max
aniMath.min
flagi. Edycja: Zapisano 2 bajty dzięki @JustinMariner.źródło
Galaretka , 37 bajtów
Wypróbuj online!
-6 bajtów „pożyczanie” od postu Erika: D
źródło
Java (OpenJDK 8) ,
307 + 34306 + 27295 bajtówMoje „interesujące” wyzwanie.
Dziękujemy Kevinowi Cruijssenowi za
zmniejszenie bajtówimportu i całkowite usunięcie importu!Wypróbuj online!
Wyjaśnienie:
Najpierw zastępuje każdą grupę liczbą całkowitą od 0 do 3 za pomocą prostego wyrażenia regularnego i zapisuje to w nowym ciągu.
int a[]={0,0,0,0},m,i=0,z=0,y=-1>>>1;
Inicjuje tablicę liczb całkowitych, a także kilka innych liczb całkowitych do użycia później. Ustawia
y
zmienną na maksymalny rozmiar int przy użyciu przesuniętego prawego bitu bez znaku.t.chars().forEach(j->{a[j%4]++;});
Dla każdego znaku w zmodyfikowanym ciągu wykorzystuje wartość modulo 4 ASCII do obliczenia indeksu wspomnianej tablicy w celu zwiększenia.
Następnie przechodzi przez liczniki każdej grupy przechowywanej w tablicy i oblicza minimum (
y
) i maksimum (z
).Zapętla ponownie każdy znak w ciągu, sprawdzając, czy grupa tej grupy znaków jest równa wartości min / max (przy użyciu sztuczki modulo wspomnianej wcześniej). Jeśli nie jest równy, wówczas do nowego ciągu znaków dodaje się spację w miejscu znaków, w przeciwnym razie dodawany jest oryginalny znak.
return v;
Wreszcie zwróć nowy ciąg!
źródło
import java.util.stream.IntStream;
może byćimport java.util.stream.*;
i,i
może być,,i=0
po których można usunąći=0
z pętli for. Och, i(s,b)->
może byćs->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();
może byćl=s.length(),x=0,y=l
ifor(int x:a){z=x>z?x:z;y=x<y?x:y;}
a(b?z:y)
, więc nie trzeba już importowanie. Złożenie wszystkiego razem: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 bajty ) .Bash,
229227212 bajtówWypróbuj online
źródło
f(){((
, że nadal działa bez spacji .(
, że można również zaoszczędzić 2 bajty,(
zamiast{
, obniżając wydajność, ponieważ tworzenie podpowłokiPHP,
161158 bajtówUruchom
-nr
lub wypróbuj online .i policz wystąpienia grup, w których nie ma obecnego znaku .
(negacja zapisała 3 bajty)
od wartości min./maks. liczba, to wypisz przestrzeń, w przeciwnym razie wypisz znak
źródło
JavaScript (ES6), 139 bajtów
Dane wejściowe i wyjściowe to tablica znaków. Pobiera na wejściu rzeczywiste wartości logiczne.
Inne podejście niż odpowiedź @ Neila ; prawie unikając wyrażeń regularnych. Zamiast tego użyłem serii testów, aby określić kategorię każdego znaku:
true
doc>-1
ponieważ nie-cyfry nie porównań matematycznych/[a-z]/i
i mają mniejszy kod niż"a"
"a"
Przypadki testowe
Pokaż fragment kodu
źródło