Tantangan:
Input:
- String yang berisi ASCII yang dapat dicetak (tidak termasuk spasi, tab, dan baris baru)
- A boolean †
Keluaran:
Bagian-bagian dari String dibagi menjadi empat kelompok:
- Huruf kecil
- Huruf besar
- Digit
- Lain
Berdasarkan boolean, kami dapat menampilkan kemunculan tertinggi satu (atau kelipatan) dari empat kelompok ini, atau yang terendah, menggantikan yang lainnya dengan spasi.
Sebagai contoh:
Input: "Just_A_Test!"
Berisi:
- 3 huruf besar: JAT
- 6 huruf kecil: ustest
- 0 digit
- 3 lainnya:__!
Ini akan menjadi output untuk true
atau false
:
true: " ust est "
// digits have the lowest occurrence (none), so everything is replaced with a space
false: " "
(Catatan: Anda diizinkan untuk mengabaikan spasi tambahan, sehingga hasilnya juga bisa " ust est"
dan""
masing masing.)
Aturan tantangan:
- Input tidak akan pernah kosong atau berisi spasi, dan hanya akan terdiri dari ASCII dicetak dalam rentang
33-126
atau'!'
melalui'~'
. - Anda diizinkan untuk mengambil input dan / atau output sebagai karakter-array atau daftar jika Anda mau.
- † Dua nilai yang konsisten dan berbeda untuk boolean diizinkan:
true
/false
;1
/0
;'H'
/'L'
;"highest"
/"lowest"
; dll. Perhatikan bahwa nilai-nilai yang berbeda ini harus digunakan (agak) sebagai boolean! Jadi tidak diperbolehkan memasukkan dua program lengkap, satu yang memberikan hasil yang benar untuktrue
dan yang lainnya untukfalse
, dan kemudian hanya memiliki kode Anda yang sebenarnya<run input with parameter>
. Celah default baru yang relevan yang telah saya tambahkan, meskipun masih dapat menggunakan banyak finetuning mengenai definisi .. - Jika kemunculan dua atau lebih kelompok adalah sama, kami menampilkan semua kemunculan itu.
- Ruang trailing yang diperlukan adalah opsional, dan satu baris baru trailing juga opsional. Ruang terkemuka yang diperlukan wajib diisi. Dan spasi atau baris baru lainnya tidak diperbolehkan.
Aturan umum:
- Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang.
Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa pun'. - Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat, program lengkap. Panggilanmu.
- Celah default tidak diperbolehkan.
- Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
- Juga, silakan tambahkan penjelasan jika perlu.
Kasus uji:
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 "
dan" 9 "
(dengan spasi yang sesuai) dijadikan keluaran alih-alih"H 9"
?H
dan9
merupakan bagian dari "paling sedikit"."max"
/"min"
, yang kemudian digunakanMath[b]
untuk merujuk keMath.max
atauMath.min
?b?"max":"min"
jawaban Anda .. Ini adalah garis yang bagus saya kira, mungkin saya harus menggunakan nilai truthy / falsey lain kali ..Jawaban:
Sekam ,
27262422 byte-2 byte terima kasih kepada Zgarb
-2 byte terima kasih kepada Leo
Dibawa
' '
asFalse
dan'a'
asTrue
(In Husk, spasi putih di Fasly dan semua karakter lainnya adalah Truthy)Cobalah online!
Bagaimana cara kerjanya?
†
ḟ
adalah fungsi yang mengambil predikatp
dan daftarL
dan mengembalikan elemen pertamaL
yang memuaskanp
. Jika tidak ada elemen yang memenuhip
argumen default dikembalikan. Dalam hal ini' '
. Dengan menerapkanḟ
ke string satu karakter, kami pada dasarnya mengatakanif p c then c else ' '
.Ṫ
Apakah fungsi yang mengambil fungsif
dan dua daftarL1
,L2
. Ini mengembalikan tabelf
diterapkan pada semua pasanganL1
danL2
. Dalam hal inif
adalahḟ
,L1
adalah daftar 4 fungsi kami, danL2
merupakan daftar string satu karakter.Setelah
Ṫḟ
kami memiliki daftar string di mana setiap string adalah hasil dari penggantian karakter yang tidak memenuhi salah satu aturan dengan a' '
.NB: Dalam versi Husk yang lebih baru,
ġ#¬Ö#≡⁰
dapat diganti dengank#≡⁰
penghematan 3 byte!sumber
' '
dan'a'
? Mungkin saya mengerti lebih baik ketika penjelasan ditambahkan, karena saya tidak dapat membaca Husk. ;)Ṫ
.Mmm
saya lakukan sendiri :)S`?'
mungkin lebih sederhana seperti?IK'
I
, terkadang itu membuat penerjemah butuh waktu lama. Sepertinya juga boros.Jelly , 31 byte
Cobalah online!
Nilai boolean adalah
2
dan1
(atau pasangan genap / ganjil lainnya), yang mewakiliTrue
danFalse
masing - masing. Saya akan mencoba menambahkan penjelasan setelah bermain golf lebih lanjut.Terima kasih kepada caird coinheringaahing untuk menghemat 2 byte, dan untuk Lynn karena telah menghemat 4 byte! Berkat salah satu trik Erik , yang menginspirasi saya untuk menghemat 4 byte!
Bagaimana itu bekerja
Perhatikan bahwa ini adalah penjelasan untuk versi 35-byte. Yang baru kira-kira sama (tapi sedikit dimodifikasi oleh Lynn), jadi saya tidak akan mengubahnya.
sumber
µ
D yang asing :ØṖḟØBṭØBUs26¤
, dan kemudian menguji keanggotaan denganf
danÇ
bukannyae¢$
.Python 2 ,
166158 byteCobalah online!
sumber
R ,
193186179158 byte-7 byte terima kasih kepada NofP dan sarannya
cbind
-6 byte menggunakan
outer
, -1 byte beralih[^a-zA-Z0-9]
dengan[[:punct:]]
-21 byte, terima kasih kepada MickyT karena menunjukkan daftar karakter yang diizinkan
Verifikasi semua kasus uji
Membawa
1/T
sebagai truthy (max
) dan0/F
sebagai falsey (min
), dan diambilS
sebagai daftar karakter tunggal.Cobalah online!
Dalam versi asli saya (dengan saran NofP), matriks
y
dibangun dengan mengevaluasigrepl(regex, S)
untuk masing-masingregex
, kemudian menggabungkannya bersama-sama sebagai kolom dari sebuah matriks. Ini menghasilkan beberapa panggilangrepl
, tetapi sebagaiS
yang diperbaiki, tampaknya ada hal lain yang perlu dilakukan. Seperti yang saya perhatikan:Saya menggunakan
outer
daripadamapply
, yang selalu mengembalikan array (matriks dalam kasus ini), dan terpaksaVectorize
grepl
, yang benar-benar hanya sebuahmapply
pembungkus di sekitarnya.Saya juga menemukan grup karakter standar
[:punct:]
yang cocok dengan karakter tanda baca (non-spasi, non-alfanumerik).sumber
like this
. :)S=el(strsplit(G,""))
Sekam ,
31 2928 byteMenggunakan 0 untuk minimal dan 1 untuk jumlah karakter maksimal. Cobalah online!
Penjelasan
Daftar fungsinya keren.
sumber
Python 2 , 140 byte
Cobalah online!
Jonathan Frech menyimpan satu byte. Terima kasih!
Tertinggi
m=-1
, terendahm=0
.sumber
+x.isalpha()*-~(x>'Z')
dengan-~(x>'Z')*x.isalpha()
.Jelly , 35 byte
Cobalah online!
sumber
Java (OpenJDK 8) ,
448439432362361354352348343320 byteCobalah online!
sumber
+
in\\|+$
untuk -1 byte tambahan.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()
bisan=-1>>>1
untuk tambahan -4.[0-9]
->\\d
Ruby ,
118116 byteMengambil
0
(terendah) atau-1
(tertinggi) untuk argumen kedua.-2 byte terima kasih kepada Lynn.
Cobalah online!
Tidak disatukan
sumber
-1
as the “highest” value and replaceminmax[t]
bysort[t]
.Python 2,
190183174173 bytesThanks to Jonathan Frech for shortening it
This takes the strings
'max(l)'
and'min(l)'
as true and false. (I don't think this breaks the rules...?) This is longer than the other two python answers but different so I thought I'd post it. I'm not a great golfer so I'm guessing this could be improved further but all the things I tried didn't work.Try it online!
sumber
sum(1for m...
should besum(1 for m...
, but I think there are other problems too. Could you provide a link to an online interpreter (such as tio) to demonstrate how you're calling this, and to show it isn't erroring?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.sumber
Jelly, 37 bytes
Try it online!
-6 bytes "borrowing" from Erik's post :D
sumber
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!
sumber
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
sumber
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.
sumber
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
sumber