Флажок не снят?


65

Делая обзор кода, я наткнулся на следующий код, который проверяет состояние флажка:

if (!isNotUnchecked()) { ... }

Я должен был провести мозговой штурм в течение 30 минут, чтобы выяснить, какой фактический статус флажка ожидал код. Пожалуйста, напишите мне программу, которая может упростить эти глупые выражения!


Программа должна принять в качестве входных данных строку, представляющую выражение для упрощения (например:) !isNotUnchecked(). Программа должна вывести логически эквивалентное упрощенное выражение, либо isChecked()или !isChecked().

Имя метода во входном выражении всегда начинается с 0 .. isn Notи заканчивается Checked()либо Unchecked(). Метод может иметь префикс любого числа !.

Примеры

isChecked() => isChecked()
isUnchecked() => !isChecked()
isNotChecked() => !isChecked()
!isNotChecked() => isChecked()
!!!isNotNotUnchecked() => isChecked()

Всегда ли текст чувствителен к регистру? Будет ли вход notunischecked?
Stevefestl

1
@SteveFest Нет, вы можете предполагать, что входные данные всегда имеют формат, который я описал выше. Вам не нужно обращаться, isnotuncheckedнапример.
Арно

6
С таким именем функции я бы дал 10 к 1 вероятности, что он даже не протестировал проверенное условие в соответствии с его именованием.
Калеб

2
Другими словами, вы знаете, что такое непроверенный блок, вы знаете, что такое непроверенный блок (он установлен, если и только если «отмечен» и «не отмечен» являются единственными двумя возможными состояниями, в противном случае это может быть что угодно в флажок: int, sign ...) и для этого конкретного флажка это не так (он не «проверяется», будь то с галочкой или чем-то еще). Если true, то вы уверены, что флажок не «проверен» ничем Если false, то вы знаете, что флажок не установлен, но это не обязательно означает, что он отмечен, если только нет двух возможных состояний (тогда он отмечен).
J Doe

1
@J Доу спасибо за разъяснения!
Арно

Ответы:


31

Python , 51 байт

lambda s:sum(map(s.count,'!NU'))%2*'!'+'isC'+s[-8:]

Попробуйте онлайн!


Вы чистый гений! Никогда бы не подумалs[-8:]
мистер Xcoder

Конечно, 'isC'+s[-8:]байт длиннее 'isChecked'?
Нил

9
но на 1 байт короче 'isChecked ()'
Эндрю Смит

Может кто-нибудь объяснить, что s[-8:]/ делает?
ESR

1
@EdmundReed Требуется последние 8 символов ввода, которые всегда hecked().
xnor

24

Сетчатка , 23 байта

Unc
!C
Not
!
O`is|!
!!

Попробуйте онлайн!

объяснение

Unc
!C

Превратись Uncheckedв !Checked.

Not
!

Превратить все Notс в !. Теперь мы получаем что-то вроде !!!is!!!!Checked().

O`is|!

Сортировать все матчи либо isили !. Так как ! < is, это перемещает все в !начало строки, поэтому приведенный выше пример станет !!!!!!!isChecked().

!!

Удалите пары, !чтобы отменить повторное отрицание.



13

Python , 43 байта

lambda s:sum(map(ord,s))%2*'!'+'isC'+s[-8:]

Неименованная функция, принимающая строку sи возвращающая строку.

Попробуйте онлайн!

Не нужно проверять наличие символов, когда !, Notи Unвсе имеют ровно один нечетный порядковый номер (и cи Cоба являются нечетными), поэтому просто суммируйте порядковые числа и используйте значение по модулю 2, чтобы решить, хотим мы !или нет.

Кроме этого, форма такая же, как и у ответа xnor , так как я не нашел ничего лучшего. Следующее также 43:

lambda s:'!isC'[~sum(map(ord,s))%2:]+s[-8:]

10

JavaScript (ES6), 51 50 байт

f=
s=>(s.split(/!|n/i).length%2?'':'!')+'isChecked()'
<input oninput=o.textContent=f(this.value)><pre id=o>

Работа ищет !, Nи nсимволы, которые инвертировать проверенное состояние. splitпо умолчанию возвращает нечетную длину массива, поэтому мы добавляем, !когда splitдлина четная. Редактировать: 1 байт сохранен благодаря @ETHproductions. Альтернативная версия, также для 50 байтов:

s=>`${s.split(/!|n/i).length%2?``:`!`}isChecked()`

Да, теперь я возвращаюсь и смотрю на другие ответы, они все делают это.
Нил

Вы должны иметь возможность удалить глобальный флаг из RegEx, чтобы сохранить байт.
Лохматый

@ Shaggy На самом деле моя длина верна, я просто не смог удалить gв последнем редактировании.
Нил

1
Я думаю, что вы можете сохранить байт с/!|N/i
ETHproductions

@ETHproductions Я думаю, что вы имели в виду /!|N/без iмодификатора
SplittyDev


7

Java 7, 100 77 байт

String c(String s){return(s.split("[!NU]").length%2<1?"!":"")+"isChecked()";}

Expanation:

String c(String s){  // Method with String parameter and String return-type
  return(s.split("[!NU]").length
                     //  Count the amount of '!', 'N' and 'U' in the input String (+ 1)
    %2<1?            //  and if they are an even number:
     "!"             //   Start with an examination mark
    :                //  Else:
     "")             //   Start with nothing
    +"isChecked()";  //  And append "isChecked()" to that
}                    // End of method

Тестовый код:

Попробуй это здесь.

class M{
  static String c(String s){return(s.split("[!NU]").length%2<1?"!":"")+"isChecked()";}

  public static void main(String[] a){
    System.out.println(c("isChecked()"));
    System.out.println(c("isUnchecked()"));
    System.out.println(c("isNotChecked()"));
    System.out.println(c("!isNotChecked()"));
    System.out.println(c("!!!isNotNotUnchecked()"));
  }
}

Выход:

isChecked()
!isChecked()
!isChecked()
isChecked()
isChecked()

7

Ацето , 49 байт

&M"pp"
L!)(de
&c;`Che"
`!d!sick
!',@p"!'
'N'U`!Lu

Ядда Ядда Кривая Гильберта.

Прежде всего, мы помещаем три важных символа в стек:

!'
'N'U

Затем мы устанавливаем метку и начинаем с чтения одного символа. Мы dдублируем это и отрицаем его, и если результат этого является правдивым (поэтому, если строка была пустой; значит, ввод закончился), мы переходим к концу:

;`
d!
,@

С оставшейся копией входного символа мы проверяем, содержится ли он в остальной части стека (т. Е. Является ли он одним из!, N, U). Если это не так, мы выдаем ошибку, возвращая нас к нашей метке, где мы читаем другой символ:

&c
`!

В противном случае мы загружаем то, что находится в быстром хранилище (по сути, регистр, который изначально является пустой строкой; ложно), отменяем его и отправляем обратно в быстрое хранилище, а затем поднимаем ошибку (возвращаясь к чтению символов):

&M
L!

Когда ввод прекратился, нас отправили до конца. Там мы меняем направление, нажимаем восклицательный знак, загружаем быстрое хранение и отменяем его. Если это правда (т. Е. У нас было нечетное количество отрицаний), мы печатаем восклицательный знак, который мы нажали:

p !'
`!Lu

Наконец, мы помещаем строку в две части и печатаем их (для экономии места):

"pp"
)(de
  Che"
  sick
   "

После этого программа все еще возвращается к исходному началу, но поскольку ни одна из команд не выводит ничего или имеет зацикленное поведение, это не имеет значения. Фактически, первая команда non-nopping, которую мы достигаем, вызывает исключение, пропуская большую часть кода, потому что мы переходим к метке улова, то есть все, что Aceto видит в этой части:

&



!' @
'N'U

Поскольку Uв настоящее время не предваряется одиночной кавычки , и поэтому не рассматривается в качестве символьного литерала, он получает интерпретируется как команда: Uпереворачивает все элементы в стеке (теперь это !, N, U, из верхней части), а также 'Nи '!выдвинуть более символы, означающие, что мы заканчиваем стеком [U, N, !, N, !].

Примечание: это первая программа Aceto, написанная (частично) с помощью нового редактора Aceto .


6

C 78 70 68 Bytes

Спасибо, Кристоф!

c;f(char*s){for(c=1;*s;)c^=!!strchr("!NU",*s++);s="!isChecked()"+c;}

Попробуйте онлайн

Выход:

isChecked() => isChecked()
isUnchecked() => !isChecked()
isNotChecked() => !isChecked()
!isNotChecked() => isChecked()
!!!isNotNotUnchecked() => isChecked()

1
c;f(char*s){for(c=1;*s;)c^=!!strchr("!NU",*s++);s="!isChecked()"+c;}использование xor для переворачивания cэкономит 2 байта.
Кристоф

6

Perl 5 , 31 байт

-2 байта благодаря @Dom Hastings .

30 байт кода + -pфлаг.

/c/i;$_="!"x(y/UN!//%2).isC.$'

Попробуйте онлайн!

y/UN!//подсчитывает количество вхождений Un, Notи !. Результатом является то, что многие !по модулю 2, а затем isChecked().


Еще одна попытка, основанная на регулярном выражении, для 38 байтов (Dom Hastings сэкономил на этом 1 байт):

s/isNot|isUn(c)/!is\u$1/?redo:s/!!//g

Попробуйте онлайн!


Ваша версия регулярного выражения не работает, потому что есть два cс Unchecked.
Нил

1
@Neil регулярное выражение заменяет только первое (поскольку я не использую /gфлаг). Тестовые примеры выглядят хорошо для меня (см. Ссылку TryItOnline). Так что я действительно не понимаю, что вы имеете в виду ...
Дада

К сожалению, правильный причина того, что ваш регулярное выражение версия не работает в том , что , хотя есть cв Uncheckedесть и один в Checked, так что, когда вы subsitute это вы в конечном итоге с CheCked.
Нил

1
Эй, надеюсь, у тебя все хорошо! Я не был здесь некоторое время, но я немного поиграл с ними для -2 на первом и -1 на втором
Dom Hastings

1
@DomHastings Эй! Круто, спасибо большое!
Dada

6

Scala , 39 30 байт

s=>"!"*(s.sum%2)+"isChecked()"

Попробуйте онлайн!

К сожалению, я не мог получить это, чтобы вывести тип s.

Редактировать: перенес объявление типа в заголовок (я думаю, что это разрешено, если нет, я верну его обратно).





3

Japt , 24 23 байта

o"!N" l u)ç'! +`‰C”×B()

объяснение

 o"!N" l u)ç'! +`‰C”×B()
Uo"!N" l u)ç'! +`‰C”×B()`
Uo"!N"                     # Only keep "!", "n" and "N" from the input
           ç'!             # Repeat the string "!" by
       l u)                # the parity of the length of the newly formed string
               +`‰C”×B()` # and concatenate with the string "isChecked()"

Попробуйте онлайн!


1
Подожди ... Как ... Почему ... Без oучета регистра? Я не знал, что ...
ETHproductions

Я тоже этого не знал, но узнал, когда проверил с "! NU". Строчная буква «n» в «Unchecked» также осталась, поэтому я мог опустить букву «U»
Лука,

3

PHP (5,5 - 5,6), 52 50 49 байт

<?='!'[count(spliti('!|N',$argn))%2]?>isChecked()

Попробуй это здесь .

-2 Bytes by @Titus. Ty :)
-1 Byte  by @ETHproductions. Ty :)

PHP (> = 5,5), 66 65 61

for($b=b;$a=$argn[$i++];)$b^=$a;echo$b&"!"|" ","isChecked()";

Без регулярных выражений это становится немного более убедительным :) Попробуйте это здесь .

-4 Bytes by @Titus. Ty :)

1
error_reportingЗначение по умолчанию E_ALL&~E_NOTICE&~E_STRICT&~E_DEPRECATED.
Тит

1
@ Титус побеждает Дж.С.
Кристоф

$b^=$aОчень хорошая находка! Вы также можете сделать это без тегов PHP того же размера.
Тит

1
61 байт, если разрешен for($b=b;$a=$argn[$i++];)$b^=$a;echo$b&"!"|" ","isChecked()";
Тит

@ Titus Я должен признать, что это был вдохновлен этим ответом .
Кристоф

3

Желе ,  16  15 байт

OSḂ⁾!iṫ⁾sCø³ṫ-7

Полная программа, которая принимает строку в качестве аргумента командной строки и печатает результат

Попробуйте онлайн!

OSḂ⁾!iṫ-7³ṫṭ⁾sCили OSḂ⁾!iṫ-7³ṫ⁾sC;оба будут работать на 15.

Как?

Использует ту же идею, что и мой ответ на Python , но сохраняет байты, используя другую конструкцию !isCили isCи неявную печать в Jelly ...

OSḂ⁾!iṫ⁾sCø³ṫ-7 - Main link: s
O               - cast to ordinals
 S              - sum
  Ḃ             - mod 2
   ⁾!i          - literal ['!','i']
      ṫ         - tail -> ['i'] if OSḂ was 0; ['!','i'] if OSḂ was 1
                - this is printed due to the following starting a new leading
                - constant chain. Printing smashes so either "i" or "!i" is printed.
       ⁾sC      - literal ['s','C']
                - this is printed (as "sC") due to the following niladic chain.
          ø     - start a new niladic chain
           ³    - program's first input (3rd command line argument), s
            ṫ-7 - tail from index -7 = ['h','e','c','k','e','d','(',')']
                - implicit print (of "hecked()")

предыдущий @ 16 байтов 9 (с использованием конкатенации и спаривания с одной и той же базовой идеей):

OSḂ⁾!iṫ;⁾sC,ṫ€-7

Ах, черт возьми, я думал, что у меня есть кое-что с трюком мод 2. Потом я нашел это: у PI было это на 18 байтов, может быть, это могло бы помочь:OS1&”!x;“isC”;ṫ-7$
Конор О'Брайен


2

Sed, 36 байт

Та же идея, что и у всех других ответов прямой замены.

:
s/Unc/NotC/
s/isNot/!is/
s/!!//
t

2

sed, 37 38 байт

:;s/is(Not|Un)/!is/;s/!!//;t;s/ch/Ch/

37 + 1 для -rвыключателя:

sed -r ':;s/is(Not|Un)/!is/;s/!!//;t;s/ch/Ch/'

1
Это последнее s/c/C/вызвало проблемы для ответа Perl 5 ...
Нейл

Да, похоже, что s/c/C/ловит второй «с» в случаях без «Ун»
Кевин

1
Кроме того, вы можете сохранить байт, опуская gи перемещая s/!!//внутри цикла.
Кевин

2

Mathematica, 82 61 60 байт

Небольшой твик, добавлен еще один инфиксный оператор:

"!"~Table~Mod[#~StringCount~{"o","n","!"},2]<>"isChecked()"&

Ранее:

"!"~Table~Mod[StringCount[#,{"o","n","!"}],2]<>"isChecked()"&

Подсчитайте все o, n и!, Затем мод 2 и поставьте так много! спереди.

Старая версия:

"!"~Table~Mod[StringCount[StringReplace[#,{{"o","n"}->"!"}],"!"],2]<>"isChecked()"&

2

Excel, 90 байт

=IF(ISODD(SEARCH("C",SUBSTITUTE(SUBSTITUTE(A1,"Un","!"),"Not","!"))),"","!")&"isChecked()"

2

Пакет Windows, 120 байт

Ранее 268 257 253 245 239 221 182 176 169 123 байта

@set a=%1
@set s=#%a:~,-2%
@set s=%s:!=N#%
@for %%a in (%s:N= %)do @set/ac+=5
@if %c:~-1%==0 cd|set/p=!
@echo isC%a:~-8%

Программы заменяют все !в N#. Поскольку теперь все знаки отрицания,! (Теперь оно есть N#) Notи Unсодержит N, программа может подсчитать количество появлений Nи определить, !требуется ли ведение .

Каждый раз, когда программа считает число N, счетчик прибавляется 5. Причиной добавления 5 является то, что каждое чередующееся значение при добавлении 5 заканчивается либо 0, либо 5. Это можно использовать для определения того, является ли значение нечетным или четным, и лидирующей !нас добавили, если требуется.

Кроме того, используется последний восьмисимвольный трюк xnor.


Казалось бы, программирование в пакетном режиме Windows было бы невозможно ...
NieDzejkob

Конечно ...... Пакетный скриптинг - это абсурд ....
stevefestl

1

Желе , 29 28 25 21 байт

f“NU!”LḂ”!x;“µịÆẹṠƊẹ»

Попробуйте онлайн!

f“NU!”LḂ”!x;“µịÆẹṠƊẹ»  Main link, argument is z
f“NU!”                 Filter to only keep "NU!"
      LḂ”!x            Repeat exclamation mark by the parity of the length
           ;“µịÆẹṠƊẹ»  Concatenate to "isChecked()"

-4 байта благодаря Джонатану Аллану!
-4 байта благодаря Джонатану Аллану! (используя сжатые строки)


Сохранить интерфейс Линн сделал здесь в качестве модуля (скажем , jellyCompress.py), то это был бы сформирован с jellyCompress.Compress().string("is").dictionary("Checked").string("()").go(). (Если вы используете Windows cmd, установите и переключитесь на шрифт DejaVu Sans Mono и измените кодовую страницу с помощью команды chcp 65001перед запуском Python, чтобы отобразить символы)
Джонатан Аллан

@JonathanAllan О, хорошо. Спасибо!
HyperNeutrino

1

PHP, 55 байт

<?=preg_match_all("#!|N#i",$argn)&1?"!":""?>isChecked()

Попробуйте онлайн!

PHP, 58 байт

<?=preg_match_all("#[!NU]#",$argn)%2?"!":"","isChecked()";

вместо этого "#[!NU]#"вы можете использовать"#[!N]#i"

Попробуйте онлайн!

PHP, 68 байт

Версия без регулярных выражений

for(;$c=$argn[$i++];)$d^=!trim($c,"UN!");echo"!"[!$d],"isChecked()";

Попробуйте онлайн!


3
<?=preg_match_all("#[!UN]#",$argn)&1?"!":""?>isChecked()-2 байта
Тит

Был точно такой же ответ, прежде чем я придумал count(split()): D @Titus хорошая идея!
Кристоф

1
" !"[$d&1]сохраняет другой байт, если начальные пробелы в порядке. $d^=!trim($c,"UN!")сохраняет 3 байта (потому что вам &1больше не нужно ).
Тит

1
@ Титус Да еще один пример, что у тебя больше знаний, чем у меня самого. Спасибо и за проблему с "!"[!$d]
Jörg Hülsermann

1
@ Кристоф, ты прав, я забыл об этом извините за это
Йорг Хюльсерманн

1

Japt , 19 байт

`‰C”×B()`i'!pU¬xc u

Попробуйте онлайн!

Распаковано и как это работает

`‰C”×B()`i'!pUq xc u

`‰C”×B()`   Compressed string for "isChecked()"
i     Insert the following string at the beginning...
'!p     "!" repeated the following number of times...
Uq        Split the input into chars
xc        Sum the charcodes
u         Modulo 2

Использование трюка с суммой кодов из решения Python Джонатана Аллана .


1

Паскаль (FPC) , 119 байт

var s:string;j:word;c:char;begin read(s);for c in s do j:=j+ord(c);if 1=j mod 2then write('!');write('isChecked()')end.

Попробуйте онлайн!

Используя метод, который используется почти в каждом ответе, суммируя кодовые точки символов на входе, затем проверяя четность суммы.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.