La case à cocher n'est-elle pas décochée?

65

En faisant l'examen du code, je suis tombé sur le code suivant, qui teste le statut d'une case à cocher:

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

J'ai dû faire un brainstorming pendant 30 minutes pour savoir quel statut de case à cocher le code attendait. S'il vous plaît écrivez-moi un programme qui peut simplifier ces expressions stupides!


Le programme doit accepter en entrée une chaîne représentant l'expression à simplifier (par exemple:) !isNotUnchecked(). Le programme doit générer une expression simplifiée logiquement équivalente, isChecked()ou !isChecked().

Le nom de la méthode dans l'expression d'entrée commence toujours par is, contient 0..n Notet se termine par Checked()ou Unchecked(). La méthode peut être préfixée par un nombre quelconque de !.

Exemples

isChecked() => isChecked()
isUnchecked() => !isChecked()
isNotChecked() => !isChecked()
!isNotChecked() => isChecked()
!!!isNotNotUnchecked() => isChecked()
Arnaud
la source
Le texte est-il toujours sensible à la casse? L'entrée serait-elle notunischecked?
stevefestl
1
@SteveFest Non, vous pouvez supposer que l'entrée est toujours dans le format que j'ai décrit ci-dessus. Vous n'avez pas besoin de gérer isnotuncheckedpar exemple.
Arnaud
6
Avec un nom de fonction comme celui-là, je lui donnerais 10 chances sur 1 de ne pas même tester la condition vérifiée de manière cohérente avec son nom.
Caleb
2
En d’autres termes, vous savez ce qu’est une case non cochée, vous savez ce qu’est une case non-cochée (elle est cochée, si et seulement si "coché" et "non coché" sont les deux seuls états possibles, sinon ce pourrait être n'importe quoi dans la case à cocher: int, signe ...) et pour cette case à cocher spécifique, ce n'est pas (ce n'est pas "coché", que ce soit avec une coche ou quoi que ce soit). Si la valeur est true, vous êtes sûr que la case à cocher n'est "cochée" par rien. Si la valeur est false, vous savez que la case à cocher est une case non décochée, mais cela ne signifie pas nécessairement qu'elle est cochée sauf s'il n'y a que deux états possibles (elle est alors cochée).
J Doe
1
@J Doe merci pour la clarification!
Arnaud

Réponses:

31

Python , 51 octets

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

Essayez-le en ligne!

Xnor
la source
Vous êtes un pur génie! N'aurait jamais pensé às[-8:]
M. Xcoder
Sûrement 'isC'+s[-8:]est un octet plus que 'isChecked'?
Neil
9
mais 1 octet plus court que 'isChecked ()'
Andrew Smith
Quelqu'un peut-il expliquer ce qui s[-8:]est / fait?
ESR
1
@ EdmundReed Il prend les 8 derniers caractères de l'entrée, qui sont toujours hecked().
xnor
24

Retina , 23 octets

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

Essayez-le en ligne!

Explication

Unc
!C

Tourner Uncheckeddans !Checked.

Not
!

Mettez tous Nots en !. Nous avons maintenant quelque chose comme !!!is!!!!Checked().

O`is|!

Trier toutes les correspondances de isou !. Depuis ! < is, cela déplace tout le !début de la chaîne, ainsi l'exemple ci-dessus deviendrait !!!!!!!isChecked().

!!

Supprimez les paires de !pour annuler la négation répétée.

Martin Ender
la source
13

Python , 43 octets

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

Une fonction sans nom qui prend la chaîne set renvoie une chaîne.

Essayez-le en ligne!

Il n'est pas nécessaire de vérifier l'existence de caractères quand !, Notet Unils ont tous exactement un ordinal impair (et cet Csont tous les deux impairs). Il vous suffit donc de résumer les ordinaux et d'utiliser la valeur modulo 2 pour décider si nous en voulons un !ou non.

À part cela, le formulaire est identique à la réponse de xnor , car je n'ai rien trouvé de mieux. Ce qui suit est également 43:

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

JavaScript (ES6), 51 50 octets

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

Fonctionne en recherchant !, Net des npersonnages qui inversent l'état vérifié. splitretourne une longueur de tableau impair par défaut, donc nous ajoutons le !lorsque la splitlongueur est paire. Edit: 1 octet enregistré grâce à @ETHproductions. Version alternative, également pour 50 octets:

s=>`${s.split(/!|n/i).length%2?``:`!`}isChecked()`
Neil
la source
Euh, maintenant je reviens en arrière et regarde les autres réponses, ils le font tous.
Neil
Vous devriez pouvoir supprimer l'indicateur global du RegEx pour enregistrer un octet.
Shaggy
@Shaggy En fait, ma longueur est correcte, je n’ai tout simplement pas réussi à supprimer gle dernier montage.
Neil
1
Je pense que vous pouvez économiser un octet avec/!|N/i
ETHproductions
@ETHproductions Je pense que vous vouliez dire /!|N/sans le imodificateur
SplittyDev
7

Java 7, 100 77 octets

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

Code de test:

Essayez-le ici.

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

Sortie:

isChecked()
!isChecked()
!isChecked()
isChecked()
isChecked()
Kevin Cruijssen
la source
7

Aceto , 49 octets

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

yadda yadda Hilbert courbe.

Tout d’abord, nous plaçons les trois personnages importants sur la pile:

!'
'N'U

Ensuite, nous mettons un crochet et commençons par lire un seul caractère. Nous l' dupliquons et le nions, et si le résultat est vrai (si la chaîne était vide; l'entrée est donc terminée), nous sautons à la fin:

;`
d!
,@

Avec la copie restante du caractère saisi, nous vérifions s'il est contenu dans le reste de la pile (c'est-à-dire s'il s'agit de!, N, U). Si ce n'est pas le cas, nous générons une erreur et nous renvoyons à notre cible où nous lisons un autre personnage:

&c
`!

Sinon, nous chargeons ce qui est sur le stockage rapide (essentiellement un registre qui est initialement une chaîne vide; falsy), le nions et le renvoyons à un stockage rapide, puis nous soulevons aussi l'erreur (retour à la lecture des caractères):

&M
L!

Lorsque l'entrée est arrêtée, nous sommes envoyés à la fin. Là, nous inversons la direction, poussons un point d’exclamation, chargeons un stockage rapide et le nions. Si cela est vrai (c'est-à-dire que nous avons eu un nombre impair de choses négatives), nous imprimons le point d'exclamation que nous avons poussé:

p !'
`!Lu

Enfin, nous poussons la chaîne en deux parties et les imprimons (pour des raisons de gain de place):

"pp"
)(de
  Che"
  sick
   "

Par la suite, le programme revient toujours au début d'origine, mais comme aucune commande ne génère quoi que ce soit ou n'a un comportement bouclé, cela n'a pas d'importance. En fait, la première commande non-invasive que nous atteignons lève une exception, ignorant la majorité du code car nous sautons à la cible, ce qui signifie que tout ce que Aceto voit dans cette partie est:

&



!' @
'N'U

Depuis Umaintenant n'est pas précédée par un guillemet simple et est donc pas considéré comme un caractère littéral, il est interprété comme une commande: Uinverse tous les éléments sur la pile (il est maintenant !, N, U, du haut), et 'Net '!pousser plus caractères, ce qui signifie que nous terminons avec la pile [U, N, !, N, !].

Note latérale: Ceci est le premier programme Aceto écrit (en partie) avec l'aide du nouvel éditeur d' Aceto .

L3viathan
la source
6

C, 78 70 68 octets

Merci Christoph!

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

Essayez-le en ligne

Sortie:

isChecked() => isChecked()
isUnchecked() => !isChecked()
isNotChecked() => !isChecked()
!isNotChecked() => isChecked()
!!!isNotNotUnchecked() => isChecked()
Johan du Toit
la source
1
c;f(char*s){for(c=1;*s;)c^=!!strchr("!NU",*s++);s="!isChecked()"+c;}utiliser xor pour retourner cenregistre 2 octets.
Christoph
6

Perl 5 , 31 octets

-2 octets grâce à @Dom Hastings .

30 octets de code + -pdrapeau.

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

Essayez-le en ligne!

y/UN!//compte le nombre d'occurrences Un, Notet !. Le résultat est que de nombreux !modulo 2, suivis de isChecked().


Une autre tentative, basée sur regex, pour 38 octets (Dom Hastings a sauvegardé 1 octet sur celui-ci):

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

Essayez-le en ligne!

Dada
la source
Votre version regex ne fonctionne pas parce qu'il ya deux cs dans Unchecked.
Neil
1
@Neil the regex ne remplace que le premier (puisque je n'utilise pas /gflag). Les cas de test me semblent intéressants (voir le lien TryItOnline). Donc, je ne vois pas vraiment ce que vous voulez dire ...
Dada,
Désolé, la bonne raison pour laquelle votre version de regex ne fonctionne pas est que, bien qu’il y ait un cdans, Uncheckedil y en a aussi un dans Checked, donc lorsque vous le modifiez, vous vous retrouvez CheCked.
Neil
1
Hey, j'espère que tu vas bien! Je ne suis pas ici depuis un moment, mais j'ai eu un petit jeu avec ceux-ci pour -2 le premier et -1 pour le second
Dom Hastings
1
@DomHastings Hé! Génial, merci beaucoup! Heureux de te revoir :-)
Dada,
6

Scala , 39 à 30 octets

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

Essayez-le en ligne!

Malheureusement, je n'ai pas réussi à en déduire le type de s.

Edit: Déplacé la déclaration de type dans l'en-tête (je pense que cela est autorisé, sinon je le remettrai).

musicman523
la source
5

Ruby , 40 octets

->x{?!*(x.count('!UN')%2)+'isChecked()'}

Essayez-le en ligne!

Alex
la source
Bienvenue chez PPCG! Bonne réponse. :)
Martin Ender
@MartinEnder merci!
Alex
3

05AB1E , 16 octets

ÇOÉ'!×…isCyR8£RJ

Essayez-le en ligne!

Utilise l’astuce pour résumer les ordinaux de la réponse en python de Jonathan Allan .

Explication

 Ç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
Emigna
la source
3

Japt , 24 23 octets

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

Explication

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

Essayez-le en ligne!

Luke
la source
1
Attendez ... Comment ... Pourquoi ... La ocasse est -elle sensible? Je ne savais pas que ...
ETHproductions
Je ne le savais pas non plus, mais j'ai découvert quand j'ai testé avec "! NU". Le "n" minuscule dans "Décoché" est également resté, ainsi je pourrais laisser tomber le "U"
:)
3

PHP (5.5 - 5.6), 52 50 49 octets

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

Essayez-le ici .

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

Sans regex, cela devient un peu plus complexe :) Essayez-le ici .

-4 Bytes by @Titus. Ty :)
Christoph
la source
1
error_reportingLa valeur par défaut est E_ALL&~E_NOTICE&~E_STRICT&~E_DEPRECATED.
Tite
1
@Titus battant JS dans un défi de regex yay!
Christoph
$b^=$aTrès belle trouvaille! Vous pouvez également le faire sans les balises PHP de même taille.
Tite
1
61 octets si l'espace au début est autorisé:for($b=b;$a=$argn[$i++];)$b^=$a;echo$b&"!"|" ","isChecked()";
Titus
@ Titus, je dois admettre que cette réponse a été inspirée .
Christoph
3

Gelée ,  16 à  15 octets

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

Un programme complet qui prend la chaîne comme argument de ligne de commande et affiche le résultat

Essayez-le en ligne!

OSḂ⁾!iṫ-7³ṫṭ⁾sCou OSḂ⁾!iṫ-7³ṫ⁾sC;les deux travailleraient aussi pendant 15 ans.

Comment?

Utilise la même idée que ma réponse Python , mais enregistre des octets en utilisant une construction différente de !isCou isCet certaines impressions implicites dans 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 octets 9 (utilisant la concaténation et l'appariement avec la même idée sous-jacente):

OSḂ⁾!iṫ;⁾sC,ṫ€-7
Jonathan Allan
la source
Ah, zut, je pensais avoir quelque chose avec le truc du mod 2. Puis j'ai trouvé ceci: PI avait ceci pour 18 octets, peut-être que ça pourrait aider:OS1&”!x;“isC”;ṫ-7$
Conor O'Brien
2

Perl 6 ,  35  31 octets

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

L'essayer

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

Essayez-le
(nécessite une chaîne d'entrée mutable qui sera mutilée)

Étendu:

{
  #(
    '!'
  x               # string repeat

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

  ~                # string concat

    'isChecked()'
}
Brad Gilbert b2gills
la source
2

Sed, 36 octets

Même idée que toutes les autres réponses de substitution directe.

:
s/Unc/NotC/
s/isNot/!is/
s/!!//
t
Kevin
la source
2

sed, 37 38 octets

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

37 + 1 pour le -rcommutateur:

sed -r ':;s/is(Not|Un)/!is/;s/!!//;t;s/ch/Ch/'
F. Hauri
la source
1
Cette dernière a s/c/C/posé problème pour la réponse à Perl 5 ...
Neil
Ouais, on dirait qu'ils s/c/C/attrapent le second "c" dans les cas sans "Un"
Kevin
1
En outre, vous pouvez enregistrer un octet en lâchant get en déplaçant l' s/!!//intérieur de la boucle.
Kevin
2

Mathematica, 82 61 60 octets

Petit tweak, ajouta un autre opérateur infixe:

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

Précédemment:

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

Comptez tous les o, n et! Puis mod 2 et mettez-en autant! devant.

Ancienne version:

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

Excel, 90 octets

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

Lot Windows, 120 octets

Auparavant 268 257 253 245 239 221 182 176 169 123 octets

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

Les programmes remplace tous les !en N#. Parce que maintenant tous les signes de négation,! (Maintenant c'est N#), Notet Uncontient N, le programme peut compter le nombre de comparutions Net déterminer si un interligne !est requis.

Chaque fois que le programme compte un an N, le compteur est ajouté par 5. La raison de l'ajout de 5 est que chaque valeur alternée lors de l'ajout de 5 se termine par 0 ou 5. Cela peut être utilisé pour déterminer si la valeur est impair ou pair et le premier !nous avons ajouté si nécessaire.

De plus, l'astuce des huit derniers caractères de xnor est utilisée.

stevefestl
la source
On pourrait penser que programmer dans Windows batch serait impossible ...
NieDzejkob
Bien sûr ...... Le script batch est absurde ....
stevefestl
1

Jelly , 29 28 25 21 octets

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

Essayez-le en ligne!

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 octets merci à Jonathan Allan!
-4 octets merci à Jonathan Allan! (en utilisant des chaînes compressées)

HyperNeutrino
la source
Enregistrez l'interface que Lynn a créée ici en tant que module (disons jellyCompress.py), elle aurait alors été formée avec jellyCompress.Compress().string("is").dictionary("Checked").string("()").go(). (Si vous exécutez une installation cmd sous Windows, passez à la police DejaVu Sans Mono et modifiez la page de codes avec la commande chcp 65001avant de lancer Python pour que les caractères s'affichent)
Jonathan Allan
@ JonathanAllan Oh okay. Merci!
HyperNeutrino
1

PHP, 55 octets

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

Essayez-le en ligne!

PHP, 58 octets

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

à la place, "#[!NU]#"vous pouvez utiliser"#[!N]#i"

Essayez-le en ligne!

PHP, 68 octets

Version sans regex

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

Essayez-le en ligne!

Jörg Hülsermann
la source
3
<?=preg_match_all("#[!UN]#",$argn)&1?"!":""?>isChecked()-2 octets
Titus
Avait exactement la même réponse avant que je vienne avec count(split()): D @Titus bonne idée!
Christoph
1
" !"[$d&1]enregistre un autre octet si l’espace blanc est correct. $d^=!trim($c,"UN!")enregistre 3 octets (parce que vous n'en avez plus besoin &1).
Tite
1
@ Titus Oui un exemple de plus que vous avez plus de connaissances que moi-même. Merci et pour le problème de l'espace que j'ai à la "!"[!$d]place
Jörg Hülsermann
1
@Christoph tu as raison j'oublie ça désolé
Jörg Hülsermann
1

Japt , 19 octets

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

Essayez-le en ligne!

Déballé et comment ça marche

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

Utilisation de l'astuce somme-code de la solution Python de Jonathan Allan .

Barboteur
la source
1

Pascal (FPC) , 119 octets

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.

Essayez-le en ligne!

En utilisant la méthode utilisée par presque toutes les réponses, en additionnant les points de code des caractères puis en vérifiant la parité de la somme.

AlexRacer
la source