Вызов:
Входы:
- Строка, содержащая печатный ASCII (исключая пробелы, табуляции и новые строки)
- Логическое †
Выход:
Части Строки делятся на четыре группы:
- Строчные буквы
- Заглавные буквы
- Digits
- Другой
На основе логического значения мы либо выводим наибольшее вхождение одной (или нескольких) из этих четырех групп, либо наименьшее, заменяя все остальное пробелами.
Например:
Входные данные: "Just_A_Test!"
содержит:
- 3 заглавные буквы: JAT
- 6 строчных букв: ustest
- 0 цифр
- 3 другие:__!
Это будут результаты для true
или false
:
true: " ust est "
// digits have the lowest occurrence (none), so everything is replaced with a space
false: " "
(Примечание. Вы можете игнорировать конечные пробелы, поэтому выходные данные также могут быть " ust est"
и ""
соответственно.)
Правила вызова:
- Ввод никогда не будет пустым или будет содержать пробелы и будет состоять только из печатного ASCII в диапазоне
33-126
или'!'
сквозном'~'
. - Вы можете принимать входные данные и / или выходные данные как массив символов или список, если хотите.
- † Допускаются любые два согласованных и различных значения для логического значения:
true
/false
;1
/0
;'H'
/'L'
;"highest"
/"lowest"
; и т. д. Обратите внимание, что эти различные значения должны использоваться (в некоторой степени) как логическое значение! Поэтому нельзя вводить две полные программы, одна из которых дает правильный результат,true
а другая - дляfalse
, а затем иметь только фактический код<run input with parameter>
. Я добавил соответствующую новую лазейку по умолчанию, хотя она все еще может использовать много тонких настроек в отношении определений. - Если вхождение двух или более групп совпадает, мы выводим все эти вхождения.
- Необходимые завершающие пробелы являются необязательными, и одна конечная новая строка также необязательна. Необходимые пробелы обязательны. И любые другие ведущие пробелы или новые строки не допускаются.
Основные правила:
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте найти как можно более короткий ответ для «любого» языка программирования. - К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с соответствующими параметрами, полные программы. Ваш звонок.
- По умолчанию лазейки запрещены.
- Если возможно, добавьте ссылку с тестом для вашего кода.
- Также, пожалуйста, добавьте объяснение, если это необходимо.
Тестовые случаи:
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 "
и" 9 "
вместо (с соответствующими пробелами) выводить"H 9"
?H
и9
являются частью «меньше всего»."max"
/"min"
, которое затем используется какMath[b]
ссылкаMath.max
илиMath.min
?b?"max":"min"
в своем ответе .. Это тонкая грань, я думаю, может быть, я должен просто использовать значение truey / falsey в следующий раз ..Ответы:
Шелуха ,
27262422 байта-2 байта благодаря Zgarb
-2 байта благодаря Лео
Берет
' '
какFalse
и'a'
какTrue
(В Husk, пробел в Fasly и все остальные символы являются правдой)Попробуйте онлайн!
Как это работает?
†
ḟ
это функция, которая принимает предикатp
и списокL
и возвращает первый элемент,L
который удовлетворяетp
. Если ни один элемент не удовлетворяет,p
возвращается аргумент по умолчанию. В этом случае' '
. Применяяḟ
к одной символьной строке, мы по существу говоримif p c then c else ' '
.Ṫ
Есть функция , которая принимает функциюf
и два спискаL1
,L2
. Возвращает таблицуf
применений по всем парамL1
иL2
. В этом случаеf
этоḟ
,L1
наш список из 4 -х функций, иL2
список из одной строки символов.После того, как
Ṫḟ
у нас есть список строк, где каждая строка является результатом замены символов, которые не удовлетворяют одному из правил,' '
.NB. В более новых версиях Husk
ġ#¬Ö#≡⁰
может быть замененоk#≡⁰
на 3 байта!источник
' '
и'a'
? Может быть, я понимаю это лучше, когда добавляется объяснение, потому что я не могу читать Хаска. ;)Ṫ
.Mmm
делал сам :)S`?'
может быть проще, чем?IK'
I
, иногда это заставляет переводчика работать вечно. Это также кажется расточительным.Желе , 31 байт
Попробуйте онлайн!
Логические значения - это
2
и1
(или любая другая положительная четная / нечетная пара), которые представляютTrue
иFalse
соответственно. Я постараюсь добавить объяснение после дальнейшей игры в гольф.Спасибо caird coinheringaahing за сохранение 2 байта и Линн за сохранение 4 байта! Благодаря одному из приемов Эрика , который вдохновил меня сэкономить 4 байта!
Как это устроено
Обратите внимание, что это объяснение 35-байтовой версии. Новый делает примерно то же самое (но немного подправил Линн), поэтому я не буду его менять.
источник
µ
D:ØṖḟØBṭØBUs26¤
, а затем проверять членство сf
иÇ
вместоe¢$
.Python 2 ,
166158 байтПопробуйте онлайн!
источник
R ,
193186179158 байт-7 байт благодаря NofP и его предложению
cbind
Использование -6 байтов
outer
, переключение -1 байта[^a-zA-Z0-9]
с[[:punct:]]
-21 байт, спасибо MickyT за указание списка символов
Проверьте все контрольные примеры
Принимает
1/T
как truey (max
) и0/F
как falsey (min
) и принимаетS
список отдельных символов.Попробуйте онлайн!
В моей исходной версии (с предложениями NofP) матрица
y
строится путем оценкиgrepl(regex, S)
каждого из нихregex
, а затем объединяет их вместе в виде столбцов матрицы. Это приводит к многочисленным вызовамgrepl
, но, какS
это было установлено, казалось, что нужно что-то еще сделать. Как я уже отметил:Я использовал
outer
вместоmapply
, который всегда возвращает массив (матрица в данном случае), и был вынужденVectorize
grepl
, что на самом деле является простоmapply
оберткой вокруг него.Я также обнаружил предопределенную группу символов,
[:punct:]
которая соответствует знакам пунктуации (не пробелы, не алфавитно-цифровые).источник
like this
. :)S=el(strsplit(G,""))
Шелуха ,
31 2928 байтИспользует 0 для минимального и 1 для максимального количества символов. Попробуйте онлайн!
объяснение
Списки функций это круто.
источник
Python 2 , 140 байт
Попробуйте онлайн!
Джонатан Фрех сохранил байт. Благодарность!
Самый высокий
m=-1
, самый низкийm=0
.источник
+x.isalpha()*-~(x>'Z')
на-~(x>'Z')*x.isalpha()
.Желе , 35 байт
Попробуйте онлайн!
источник
Java (OpenJDK 8) ,
448439432362361354352348343320 байтПопробуйте онлайн!
источник
+
in\\|+$
для дополнительного -1 байта.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()
может бытьn=-1>>>1
за дополнительную -4.[0-9]
->\\d
Руби ,
118116 байтБерет
0
(низший) или-1
(самый высокий) для своего второго аргумента.-2 байта благодаря Линн.
Попробуйте онлайн!
Ungolfed
источник
-1
в качестве «самого высокого» значения и заменитьminmax[t]
наsort[t]
.Python 2,
190183174173 байтаСпасибо Джонатану Фречу за сокращение
Это принимает строки
'max(l)'
и'min(l)'
как правда, и ложь. (Я не думаю, что это нарушает правила ...?) Это длиннее, чем два других ответа на Python, но отличается, поэтому я решил опубликовать его. Я не большой игрок в гольф, поэтому я думаю, что это можно улучшить, но все, что я пробовал, не сработало.Попробуйте онлайн!
источник
sum(1for m...
должно бытьsum(1 for m...
, но я думаю , что есть и другие проблемы тоже. Не могли бы вы предоставить ссылку на онлайн-переводчика (например, tio ), чтобы продемонстрировать, как вы это называете, и показать, что это не ошибка?max(l)
иmin(l)
как строки, поэтому я получаю ошибки. Спасибо за разъяснение этого! Хотя сейчас это на грани нарушения правила № 3, «обратите внимание, что эти различные значения должны использоваться (несколько) как логическое значение», но это определенно немного серой области.JavaScript (ES6),
151149 байтК сожалению, правила, вероятно, не позволяют мне проходить
Math.max
илиMath.min
как флаг. Изменить: Сохранено 2 байта благодаря @JustinMariner.источник
Желе , 37 байт
Попробуйте онлайн!
-6 байт "позаимствовал" из поста Эрика: D
источник
Java (OpenJDK 8) ,
307 + 34306 + 27295 байтМой «интересный» вызов.
Спасибо Кевину Круйссену за
сокращение импортных байтов иполное исключение импорта!Попробуйте онлайн!
Объяснение:
Сначала заменяет каждую группу целым числом от 0 до 3, используя некоторое простое регулярное выражение, и сохраняет его в новой строке.
int a[]={0,0,0,0},m,i=0,z=0,y=-1>>>1;
Инициализирует массив целых чисел, а также пару других целых чисел, которые будут использоваться позже. Устанавливает
y
переменную в максимальный размер int, используя беззнаковое смещение вправо.t.chars().forEach(j->{a[j%4]++;});
Для каждого символа в измененной строке используется значение ASCII по модулю 4 для вычисления индекса вышеупомянутого массива для приращения.
Затем он перебирает счетчики каждой группы, хранящейся в массиве, и вычисляет минимум (
y
) и максимум (z
).Повторно просматривает каждый символ в строке, проверяя, равна ли группа этой группы символов минимуму / максимуму (используя трюк по модулю, упомянутый ранее). Если он не равен, то к новой строке в месте символов добавляется пробел, в противном случае добавляется исходный символ.
return v;
Наконец, верните новую строку!
источник
import java.util.stream.IntStream;
могут бытьimport java.util.stream.*;
и,i
могут быть,,i=0
после чего вы можете удалитьi=0
из цикла. Ох, и(s,b)->
может быть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();
может бытьl=s.length(),x=0,y=l
иfor(int x:a){z=x>z?x:z;y=x<y?x:y;}
и(b?z:y)
, поэтому вам больше не нужно импортировать. Собрать все вместе становится: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 байта ) .Баш,
229227212 байтПопробуйте онлайн
источник
f(){((
.(
, что можно сэкономить 2 байта, используя(
вместо этого{
PHP,
161158 байтЗапустите
-nr
или попробуйте онлайн .и подсчет вхождений групп , что текущий символ не в.
(that negation saved 3 bytes)
from min/max non-count then print space, else print character.
источник
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
источник