A caixa de seleção não está desmarcada?


65

Ao revisar o código, deparei-me com o código a seguir, que testa o status de uma caixa de seleção:

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

Eu tive que pensar por 30 minutos para descobrir qual o status real da caixa de seleção que o código estava esperando. Por favor, escreva-me um programa que possa simplificar essas expressões tolas!


O programa deve aceitar como entrada uma string representando a expressão para simplificar (por exemplo !isNotUnchecked():). O programa deve gerar uma expressão simplificada logicamente equivalente, isChecked()ou !isChecked().

O nome do método na expressão de entrada sempre começa com is, contém 0..n Note termina com Checked()ou Unchecked(). O método pode ser prefixado por qualquer número de !.

Exemplos

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

O texto sempre diferencia maiúsculas de minúsculas? A entrada seria notunischecked?
Stevefestl

11
@SteveFest Não, você pode assumir que a entrada está sempre no formato que eu descrevi acima. Você não precisa lidar com, isnotuncheckedpor exemplo.
Arnaud

6
Com um nome de função como esse, eu daria 10 a 1 de chances de nem sequer testar a condição verificada de acordo com a nomeação.
Caleb

2
Em outras palavras, você sabe o que é uma caixa desmarcada, o que é uma caixa não desmarcada (está marcada, se e somente se "marcada" e "desmarcada" são os dois únicos estados possíveis, caso contrário, pode haver algo em a caixa de seleção: int, assinar ...) e, para essa caixa de seleção específica, não é (não está "marcada", seja com uma marca de seleção ou algo assim). Se for verdade, então, você tem certeza de que a caixa de seleção não está "marcada" por nada. Se falso, bem, você sabe que a caixa de seleção é uma caixa não desmarcada, mas isso não significa necessariamente que está marcada, a menos que haja apenas dois estados possíveis (então está marcada).
J Doe

11
@J Doe obrigado pelo esclarecimento!
Arnaud

Respostas:


31

Python , 51 bytes

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

Experimente online!


Você é um gênio puro! Nunca teria pensado ems[-8:]
Sr. Xcoder

Certamente 'isC'+s[-8:]um byte é maior que 'isChecked'?
Neil

9
mas 1 byte menor que 'isChecked ()'
Andrew Smith

Alguém pode explicar o que s[-8:]é / faz?
ESR

11
@EdmundReed Leva os últimos 8 caracteres da entrada, que são sempre hecked().
Xnor

24

Retina , 23 bytes

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

Experimente online!

Explicação

Unc
!C

Transformar Uncheckedem !Checked.

Not
!

Transforme todos os Nots em !. Agora temos algo parecido !!!is!!!!Checked().

O`is|!

Classifique todas as correspondências de isou !. Como ! < isisso move tudo !para o início da string, o exemplo acima se tornaria !!!!!!!isChecked().

!!

Remova os pares de !para cancelar a negação repetida.



13

Python , 43 bytes

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

Uma função sem nome que pega a string se retorna uma string.

Experimente online!

Não há necessidade de verificar a existência de caracteres quando !, Note Untodos têm exatamente um ordinal estranho (e ce Csão ambos ímpar), então apenas resumir os ordinais e usar o valor do módulo 2 de decidir se queremos uma !ou não.

Fora isso, o formulário é o mesmo da resposta do xnor , pois não encontrei nada melhor. O seguinte também é 43:

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

10

JavaScript (ES6), 51 50 bytes

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

Funciona através da procura !, Ne npersonagens, que inverter o estado verificado. splitretorna um comprimento de matriz ímpar por padrão, então adicionamos !quando o splitcomprimento é par. Editar: salvou 1 byte graças a @ETHproductions. Versão alternativa, também para 50 bytes:

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

Agora eu volto e olho para as outras respostas, todos estão fazendo isso.
Neil

Você deve poder soltar o sinalizador global do RegEx para salvar um byte.
Shaggy

@ Shaggy Na verdade, o meu comprimento está correto, mas não consegui remover o gna edição mais recente.
1111 Neil

11
Eu acho que você pode salvar um byte com/!|N/i
ETHproductions

@ETHproductions Eu acho que você quis dizer /!|N/, sem o imodificador
SplittyDev


7

Java 7, 100 77 bytes

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

Expansão:

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

Código do teste:

Experimente aqui.

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()"));
  }
}

Resultado:

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

7

Aceto , 49 bytes

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

yadda yadda Curva de Hilbert.

Primeiro, colocamos os três caracteres importantes na pilha:

!'
'N'U

Em seguida, definimos uma marca de captura e começamos lendo um único caractere. Nós o dduplicamos e o negamos, e se o resultado for verdadeiro (por isso, se a string estiver vazia; a entrada terminou), pularemos para o final:

;`
d!
,@

Com a cópia restante do caractere de entrada, verificamos se ele está contido no restante da pilha (ou seja, se é um de!, N, U). Caso contrário, apresentamos um erro, lançando-nos de volta à nossa marca de captura, onde lemos outro personagem:

&c
`!

Caso contrário, carregamos o que está no armazenamento rápido (essencialmente um registro que é inicialmente uma string vazia; falsy), negamos e o enviamos de volta ao armazenamento rápido, e também aumentamos o erro (voltando à leitura dos caracteres):

&M
L!

Quando a entrada parou, somos enviados para o fim. Lá, invertemos a direção, pressionamos um ponto de exclamação, carregamos um armazenamento rápido e o negamos. Se isso é verdade (ou seja, tivemos um número ímpar de coisas de negação), imprimimos o ponto de exclamação que pressionamos:

p !'
`!Lu

Por fim, empurramos a sequência em duas partes e as imprimimos (por motivos de economia de espaço):

"pp"
)(de
  Che"
  sick
   "

Posteriormente, o programa ainda volta ao início original, mas como nenhum dos comandos gera nada ou possui comportamento em loop, isso não importa. Na verdade, o primeiro comando non-nopping que alcançamos gera uma exceção, pulando a maior parte do código porque saltamos para a marca de captura, o que significa que tudo o que Aceto vê nessa parte é:

&



!' @
'N'U

Desde Uagora não é precedido por um caractere de aspas simples e, portanto, não é visto como um caractere literal, ele é interpretado como um comando: Uinverte todos os elementos na pilha (agora é !, N, U, a partir do topo), e 'Ne '!empurrar mais caracteres, o que significa que terminamos com a pilha [U, N, !, N, !].

Nota lateral: Este é o primeiro programa do Aceto escrito (em parte) com a ajuda do novo editor do Aceto .


6

C, 78 70 68 bytes

Obrigado Christoph!

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

Experimente online

Resultado:

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

11
c;f(char*s){for(c=1;*s;)c^=!!strchr("!NU",*s++);s="!isChecked()"+c;}usar xor para inverter ceconomiza 2 bytes.
Christoph

6

Perl 5 , 31 bytes

-2 bytes graças a @Dom Hastings .

30 bytes de código + -psinalizador.

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

Experimente online!

y/UN!//conta o número de ocorrências de Un, Note !. O resultado é que muitos !módulos 2, seguidos por isChecked().


Outra tentativa, com base no regex, de 38 bytes (Dom Hastings salvou 1 byte nesse):

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

Experimente online!


Sua versão regex não funciona porque existem dois cs Unchecked.
1111 Neil

11
@ Neil, o regex substitui apenas o primeiro (já que não estou usando /gflag). Os casos de teste parecem bons para mim (consulte o link TryItOnline). Então, eu realmente não vejo o que quer dizer ...
Dada

Desculpe, o motivo correto que a sua versão regex não funciona é que, embora haja um cem Uncheckedhá também um em Checked, então quando você subsitute que você acabar com CheCked.
Neil

11
Ei, espero que você esteja bem! Eu não estive aqui em um tempo, mas eu tive um pouco de jogar com estes para -2 no primeiro e -1 no segundo
Dom Hastings

11
@DomHastings Hey! Impressionante, muito obrigado! Feliz em vê-lo de volta :-)
Dada

6

Scala , 39 30 bytes

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

Experimente online!

Infelizmente não consegui deduzir o tipo de s.

Edit: Moveu a declaração de tipo para o cabeçalho (acho que isso é permitido, se não, vou colocá-lo de volta).




3

05AB1E , 16 bytes

ÇOÉ'!×…isCyR8£RJ

Experimente online!

Usa o truque de somar os ordinais da resposta em python de Jonathan Allan .

Explicação

 ÇO                # sum of ascii values of input
   É               # is odd
    '!×            # repeat "!" that many times
       …isC        # push the string "isC"
           IR8£R   # push the last 8 chars of input
                J  # join everything to string

3

Japonês , 24 23 bytes

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

Explicação

 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()"

Experimente online!


11
Espere ... Como ... Por que ... Não odiferencia maiúsculas de minúsculas? Eu não sabia o que ... #
511 ETHproductions

Também não sabia, mas descobri quando testei com "! NU". A letra minúscula "n" em "Unchecked" também permaneceu, para que eu pudesse largar o "U"
:)

3

PHP (5.5 - 5.6), 52 50 49 bytes

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

Experimente aqui .

-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()";

Sem regex, fica um pouco mais compex :) Experimente aqui .

-4 Bytes by @Titus. Ty :)

11
error_reportingvalor padrão é E_ALL&~E_NOTICE&~E_STRICT&~E_DEPRECATED.
Titus

11
@Titus batendo JS em um desafio regex yay!
Christoph

$b^=$aVery nice find! Você também pode fazer isso sem as tags PHP do mesmo tamanho.
Titus

11
61 bytes se o espaço em branco à esquerda for permitido:for($b=b;$a=$argn[$i++];)$b^=$a;echo$b&"!"|" ","isChecked()";
Titus

@Titus Eu tenho que admitir que foi inspirado por esta resposta .
Christoph

3

Geléia ,  16  15 bytes

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

Um programa completo que usa a string como argumento de linha de comando e imprime o resultado

Experimente online!

OSḂ⁾!iṫ-7³ṫṭ⁾sCou OSḂ⁾!iṫ-7³ṫ⁾sC;ambos também trabalhariam para 15.

Quão?

Utiliza a mesma ideia da minha resposta Python , mas salva bytes usando uma construção diferente de !isCou isCe alguma impressão implícita no 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()")

previous @ 16 bytes 9 (usando concatenação e emparelhamento com a mesma ideia subjacente):

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

Ah, caramba, eu pensei em algo com o truque mod 2. Então eu encontrei este: PI teve isso por 18 bytes, talvez ele poderia ajudar:OS1&”!x;“isC”;ṫ-7$
Conor O'Brien

2

Perl 6 ,  35  31 bytes

{'!'x m:g/<[!NU]>/%2~'isChecked()'}

Tente

{'!'x tr/!NU//%2~'isChecked()'}

Experimente
(requer uma sequência de entrada mutável que será mutilada)

Expandido:

{
  #(
    '!'
  x               # string repeat

    # m:g/<[!NU]>/
    tr/!NU//      # find the number of negatives
      % 2         # modulus 2
  #)

  ~                # string concat

    'isChecked()'
}

2

Sed, 36 bytes

A mesma idéia que todas as outras respostas de substituição direta.

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

2

sed, 37 38 bytes

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

37 + 1 para o -rcomutador:

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

11
Essa última s/c/C/problemas causados pela resposta Perl 5 ...
Neil

Sim, parece que o s/c/C/é pegar o segundo "c" em casos sem "Un"
Kevin

11
Além disso, você pode salvar um byte, soltando ge movendo o s/!!//interior do loop.
11557 Kevin

2

Mathematica, 82 61 60 Bytes

Pequenos ajustes, adicionado mais um operador de infix:

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

Anteriormente:

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

Contar todos os o's, n's e! 'S então mod 2 e colocar tantos! em frente.

Versão antiga:

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

2

Excel, 90 bytes

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

2

Lote do Windows, 120 bytes

Anteriormente, 268 257 253 245 239 221 182 176 169 123 bytes

@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%

Os programas substituem todo o !conteúdo N#. Como agora todos os sinais de negação,! (Agora é N#), Note Uncontém N, o programa pode contar o número de aparências Ne determinar se uma liderança !é necessária.

Cada vez que o programa conta um N, o contador é adicionado por 5. O motivo da adição de 5 é porque cada valor alternativo ao adicionar 5 termina em 0 ou 5. Isso pode ser usado para determinar se o valor é ímpar ou par e o principal !adicionado se necessário.

Além disso, o truque dos últimos oito caracteres do xnor é utilizado.


Alguém poderia pensar programação em janelas lote seria impossível ...
NieDzejkob

É claro ...... Batch scripting é um absurdo ....
stevefestl

1

Geléia , 29 28 25 21 bytes

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

Experimente online!

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 bytes graças a Jonathan Allan!
-4 bytes graças a Jonathan Allan! (usando cadeias compactadas)


Salve a interface que Lynn criou aqui como um módulo (por exemplo, jellyCompress.py), para que isso fosse formado jellyCompress.Compress().string("is").dictionary("Checked").string("()").go(). (Se você estiver executando em um Windows cmd instalar e mudar para a fonte DejaVu Sans Mono e alterar a página de código com o comando chcp 65001antes de lançar Python para obter os caracteres para exibir)
Jonathan Allan

@JonathanAllan Oh okay. Obrigado!
HyperNeutrino

1

PHP, 55 bytes

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

Experimente online!

PHP, 58 bytes

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

em vez disso, "#[!NU]#"você pode usar"#[!N]#i"

Experimente online!

PHP, 68 bytes

Versão sem Regex

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

Experimente online!


3
<?=preg_match_all("#[!UN]#",$argn)&1?"!":""?>isChecked()-2 bytes
Titus

Tinha exatamente a mesma resposta antes de me apresentar count(split()): D @Titus boa ideia!
Christoph

11
" !"[$d&1]salva outro byte se o espaço em branco à esquerda estiver ok. $d^=!trim($c,"UN!")economiza 3 bytes (porque você não precisa &1mais).
Titus

11
@ Titus Sim, um exemplo a mais que você tem mais conhecimento do que eu. Obrigado e para o problema de espaço em branco à direita eu tenho fazer "!"[!$d]em vez
Jörg Hülsermann

11
@ Christoph você está certo eu tenho esquecê-lo muito por isso
Jörg Hülsermann

1

Japonês , 19 bytes

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

Experimente online!

Descompactado e como funciona

`‰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

Usando o truque de soma de código de código da solução Python de Jonathan Allan .


1

Pascal (FPC) , 119 bytes

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.

Experimente online!

Usando o método que quase todas as respostas fazem, somando pontos de código de caracteres na entrada e verificando a paridade da soma.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.