Tout le monde devrait avoir un ami

11

Un caractère isolé est un caractère (autre qu'un saut de ligne) qui n'a pas de caractère adjacent du même type. Les caractères adjacents peuvent être à gauche, à droite au-dessus ou en dessous, mais pas en diagonale. Par exemple dans le texte suivant Hest isolé:

Ybb
YH%
%%%%

Tous les autres personnages ne sont pas isolés car chacun d'eux a au moins un autre caractère du même type adjacent.

Votre tâche consiste à écrire un programme qui prend une chaîne en entrée et détermine le nombre de caractères isolés.

Notation

Votre réponse sera notée par deux mesures. Le premier est le nombre de caractères isolés dans votre programme. Vous devez viser à minimiser cela. Le second sera le nombre d'octets dans votre programme. Vous devez également minimiser cela. La taille du programme agira comme un bris d'égalité pour le premier critère.

Règles supplémentaires

  • Vous devez prendre en charge la saisie sur la plage ascii imprimable ainsi que tous les caractères que vous utilisez dans votre programme.

  • Vous pouvez considérer un saut de ligne comme un caractère de nouvelle ligne ou une nouvelle ligne suivie d'un saut de ligne.

  • Vous pouvez prendre des contributions dans n'importe quel format raisonnable. Cela comprend une liste de lignes.

Cas de test

Ybb
YH%
%%%%

1


Aaaab
uuu
yyybbb

2


A

1


qqWWaaww

0

Ad Hoc Garf Hunter
la source
2
Une chaîne vide est-elle une entrée valide et si oui, est-ce qu'elle marquerait 0? Le type d'entrée est-il également flexible? Liste des lignes très bien?
Veskah
Les nouvelles lignes peuvent-elles être isolées?
Jo King
1
@DimChtz Parce qu'il a un Ydessous.
Erik the Outgolfer
1
La première mesure peut être contournée dans n'importe quel langage de programmation et chaque réponse a maintenant un score de 0.
GB
1
@GB En effet. Je suppose qu'il n'est pas trop tard pour en faire un restricted-sourcedéfi et interdire complètement les personnages isolés.
Arnauld

Réponses:

7

Python 2 , 0 ( 350 344 314 309 301 298 291 octets)

def f(tt):11
def f(tt):
 tt=tt.split('\n')
 r =0#.split('\n')
#r  0#
#for
 for  ii,ll in enumerate(tt):
  for jj,cc in enumerate(ll):
##for+=1-(
    r+=1-(cc in ll[(jj or 2)-1:jj+2:2]    +''.join(ll[jj:
 jj+1]for ll in tt[(ii or 2)-1:ii+2:2]))##+''.join(ll[jj:
#  +1]for 
#print r
 print r
 

Essayez-le en ligne!

-7 octets, merci à Jo King

TFeld
la source
291 octets
Jo King
@JoKing Merci! :)
TFeld
5

Nettoyer , 0 ( 439 ... 415 octets)

-11 grâce à Ørjan Johansen

Enfin un défi où je peux marquer 0 avec Clean!
(et normalement c'est mauvais aux défis de mise en page source!)

//module 
  module d
import StdEnv,ArgEnv,Data.List,Data.Maybe
import StdEnv,ArgEnv,Data.List,Data.Maybe
Start=sum[1\\i<-l&v<-[0..],_<-i&u<-[0..]|all((<>)(?u v))[?(u-1)v,?(u+1)v,?u(v-1),?u(v+1)]]
Start=sum[1\\i<-l&v<-[0..],_<-i&u<-[0..]|all((<>)(?u v))[?(u-1)v,?(u+1)v,?u(v-1),?u(v+1)]] 
l=mklines[c\\c<-:getCommandLine.[1]]
l=mklines[c\\c<-:getCommandLine.[1]]
?x=mapMaybe(\k=k!?x)o(!?)l
?x=mapMaybe(\k=k!?x)o(!?)l

Essayez-le en ligne!

Le lien TIO utilise en module mainraison de la façon dont Clean est implémenté sur TIO, mais module dfonctionnera si vous nommez le fichier d.iclau lieu de le faire main.iclcomme TIO.

Une des anciennes lignes expliquée (la nouvelle version est la même chose dans un ordre différent):

Start                                       // entry point
 = let                                      // define locals
  l = mklines                               // `l` is argument split at newlines
   [c \\ c <-: getCommandLine.[1]];         // the second command-line arg turned into a [Char]
  ? x y                                     // function ? of coordinate (x,y)
   = mapMaybe                               // if the argument isn't Nothing
    (\k = k!?x)                             // try taking the `x`-th index
    (l!?y)                                  // of the `y`-th index of `l`
  in                                        // in the context of
   sum [                                    // the sum of
    1                                       // the integer one
    \\ i <- l & v <- [0..]                  // for every index in `l`
    , _ <- i & u <- [0..]                   // for every subindex in `l`
    | all (                                 // where all of the second argument
      (<>)(?u v)                            // doesn't equal the first argument
     ) [?(u-1)v, ?(u+1)v, ?u(v-1), ?u(v+1)] // over every adjacent element
   ]
Οurous
la source
1
Ne pas utiliserlet enregistre 11 octets.
Ørjan Johansen
@ ØrjanJohansen Merci! J'ai également changé l'en-tête du module car nous avons un doutil pratique adjacent
Οurous
5

JavaScript (ES6), 0 (154 octets)

Enregistré 2 4 octets grâce à @ ØrjanJohansen

Prend l'entrée comme un tableau de chaînes.

s  =>
s//=>(s,y,a
.map((s,y,a)=>[...s]
.map((c,x  )=>[...s]
&&//++c,x
 s[x+1]==c|
 s[x-1]==c|
(a[y-1]||0)[x]==c|
(a[y+1]||0)[x]==c||
  i++),i=0)
&&i//),i=

Essayez-le en ligne!

Arnauld
la source
156 octets
Ørjan Johansen
4

Gelée , 0 ( 41 27 25 octets)

ŒĠạþ`€Ẏ§CẠ€S
ŒĠạþ`€Ẏ§CẠ€S

Essayez-le en ligne!

Prend la saisie sous forme de liste de lignes. La première ligne du code ne fait jamais rien et n'est là que pour minimiser les caractères isolés.

ỴŒĠạþ`€Ẏ§1eⱮCS
Ỵ                 Split the text on newlines.
 ŒĠ               Group the multidimensional indices by their value.
      €           For each list of indices:
   ạ                Take the absolute difference...
    þ`              ...between each pair.
       Ẏ          Concatenate the lists of differences.
        §         Sum the x & y differences. This computes the Manhattan distance.
                  At this point we have a list for each character in the text of 
                  Manhattan distances between it and it's identical characters. 
         1eⱮ      Is there a 1 in each of the lists? None for isolated characters.
            C     Complement: 0 <-> 1.
             S    Sum. Counts the isolated characters
dylnan
la source
1

Python 3 , 0 (323 octets)

def f(s,e=enumerate):S={(x,y,c)for y,l in e(s.split("\n"))for x,c in e(l)};return-sum(~-any((x+u,y+v,c)in S for u,v in[(1,0),(~0,0),(0,~0),(0,1)])for x,y,c in S)
def f(s,e=enumerate):S={(x,y,c)for y,l in e(s.split("\n"))for x,c in e(l)};return-sum(~-any((x+u,y+v,c)in S for u,v in[(1,0),(~0,0),(0,~0),(0,1)])for x,y,c in S)

Essayez-le en ligne!

Jonathan Frech
la source
1

05AB1E , 0 (101 octets )

žGçU|€SXζζD"εγεDgDisëXи]"©.V˜sø®.V€Sø˜‚øʒË}ʒXå≠}gq
žGçU|€SXζζD"εγεDgDisëXи]"©.V˜sø®.V€Sø˜‚øʒË}ʒXå≠}gq

Essayez-le en ligne.

C'est l'un des programmes 05AB1E les plus laids et les plus longs que j'aie jamais écrits ..>.> Ce défi est trompeusement difficile dans 05AB1E. Je n'ai aucun doute sur le fait que le nombre d'octets peut au moins être divisé par deux ou même trois / quatre fois plus petit en utilisant une approche différente (ou même avec une approche similaire), mais je ne vois actuellement pas comment. Je suis juste content que ça fonctionne en ce moment .. Si quelqu'un d'autre poste une réponse 05AB1E beaucoup plus courte avec quelques astuces, je vais probablement supprimer cette réponse par honte ... xD

Explication:

žGç                # Character with unicode 32768 ('耀')
   U               # Pop and store it in variable `X`
                   # (This character is not part of the printable ASCII, nor of my 05AB1E code)
|                  # Take the multi-line input as list
                   #  i.e. "Ybb\nYH%\n%%%%" → ["Ybb","YH%","%%%%"]
 S                # Convert each string to a list of characters
                   #  i.e. ["Ybb","YH%","%%%%"] → [["Y","b","b"],["Y","H","%"],["%","%","%","%"]]
   Xζζ             # Zip with character `X` as filler twice to make the lines of equal length
                   #  i.e. [["Y","b","b"],["Y","H","%"],["%","%","%","%"]]
                   #   → [["Y","b","b","耀"],["Y","H","%","耀"],["%","%","%","%"]]
      D            # Duplicate this list
"             "    # Create a string
               ©   # Which we store in the register (without popping)
                .V # And execute that string as 05AB1E code
 ε                 #  Map each inner list to:
  γ                #   Split in chunks of the same characters
                   #    i.e. [["Y","b","b"],["Y","H","%"],["%","%","%","%"]]
                   #     → [[["Y"],["b","b"]],[["Y"],["H"],["%"]],[["%","%","%","%"]]]
   ε               #   Map each of those to:
    D              #    Duplicate the current inner list
     gDi           #    If its length is exactly 1:
        s          #     Swap so the mapping keeps the duplicated single character (as list)
       ë           #    Else:
        Xи         #     Take character `X` repeated the length amount of times
                   #      i.e. ["%","%","%","%"] (length 4) → ["耀","耀","耀","耀"]
          ]        #  Close the if-else and both maps
           ˜       #  Flatten the list to a single list of characters
                   #   i.e. [[["Y"],["耀","耀"],["耀"]],[["Y"],["H"],["%"],["耀"]],[["耀","耀","耀","耀"]]]
                   #    → ["Y","耀","耀","耀","Y","H","%","耀","耀","耀","耀","耀"]
s                  # Swap so the duplicate list is at the top of the stack
 ø                 # Swap its rows and columns
                   #  i.e. [["Y","b","b","耀"],["Y","H","%","耀"],["%","%","%","%"]]
                   #   → [["Y","Y","%"],["b","H","%"],["b","%","%"],["耀","耀","%"]]
  ®.V              # Execute the same piece of code again that we've stored in the register
     S            # Convert each to a list of characters
                   #  i.e. [[["耀","耀"],["%"]],[["b"],["H"],["%"]],[["b"],["耀","耀"]],[["耀","耀"],["%"]]]
                   #   → [["耀","耀","%"],["b","H","%"],["b","耀","耀"],["耀","耀","%"]]
       ø           # Swap its rows and columns back again
                   #  i.e. [["耀","b","b","耀"],["耀","H","耀","耀"],["%","%","耀","%"]]
        ˜          # Flatten this list as well
                  # Pair both lists together
                   #  i.e. [["Y","耀","耀","耀","Y","H","%","耀","耀","耀","耀","耀"],
                   #        ["耀","b","b","耀","耀","H","耀","耀","%","%","耀","%"]]
 ø                 # Swap its rows and columns to create pairs
                   #  i.e. [["Y","耀"],["耀","b"],["耀","b"],["耀","耀"],["Y","耀"],["H","H"],["%","耀"],["耀","耀"],["耀","%"],["耀","%"],["耀","耀"],["耀","%"]]
  ʒË}              # Filter out any inner lists where both characters are not equal
                   #  i.e. [["耀","耀"],["H","H"],["耀","耀"],["耀","耀"]]
     ʒXå≠}         # Filter out any inner lists that contain the character `X`
                   #  i.e. [["H","H"]]
g                  # Take the length as result
                   #  i.e. [["H","H"]] → 1
 q                 # Stop the program, making all other characters no-ops
                   # (and output the length above implicitly)
Kevin Cruijssen
la source
1

Ruby , score 0, 237 209 octets

##->a{['',*a,''].each_cons(3).sum{|a,b,c|(0..b.size).count{|x|[[x>0&&b[x-1],a[x],b[x+1],c[x]]&[b[x
  ->a{['',*a,''].each_cons(3).sum{|a,b,c|(0..b.size).count{|x|[[x>0&&b[x-1],a[x],b[x+1],c[x]]&[b[x]]]==[[]]}}}

Essayez-le en ligne!

GB
la source
0

JavaScript (Node.js) , 0 (279 octets)

  s=>(b=s.map(Buffer)).map((x,i)=>x.filter((y,j)=>y-(g=(x,y)=>~~(b[x]&&b[x][y]))(i,j-1)&&y-g(i,j+1)&&y-g(i-1,j)&&y-g(i+1,j))).join``.length
//s=>(b=s.map(Buffer)).map((x,i)=>x.filter((y,j)=>y-(g=(x,y)=>~~(b[x]&&b[x][y]))(i,j-1)&&y-g(i,j+1)&&y-g(i-1,j)&&y-g(i+1,j))).join``.length

Essayez-le en ligne!

Recevez l'entrée sous forme de tableau de lignes.

Shieru Asakoto
la source