Todos deben tener un amigo

11

Un carácter aislado es un carácter (que no sea una nueva línea) que no tiene un carácter adyacente del mismo tipo. Los caracteres adyacentes pueden estar a la izquierda, arriba o abajo a la derecha, pero no diagonales. Por ejemplo, en el siguiente texto Hestá aislado:

Ybb
YH%
%%%%

Todos los demás caracteres no están aislados porque cada uno de ellos tiene al menos otro carácter del mismo tipo adyacente.

Su tarea es escribir un programa que tome una cadena como entrada y determine la cantidad de caracteres aislados.

Puntuación

Su respuesta será puntuada por dos métricas. El primero es el número de caracteres aislados en su programa. Debes tratar de minimizar esto. El segundo será el número de bytes en su programa. Debes minimizar esto también. El tamaño del programa actuará como un desempate para el primer criterio.

Reglas Adicionales

  • Debe admitir la entrada en el rango de ascii imprimible más cualquier carácter que use en su programa.

  • Puede considerar un salto de línea como un carácter de nueva línea o una nueva línea seguida de un salto de línea.

  • Puede tomar información en cualquier formato razonable. Esto incluye una lista de líneas.

Casos de prueba

Ybb
YH%
%%%%

1


Aaaab
uuu
yyybbb

2


A

1


qqWWaaww

0

Ad Hoc Garf Hunter
fuente
2
¿Es una entrada vacía de cadena válida y, de ser así, obtendría 0? ¿También qué tan flexible es el tipo de entrada? Lista de líneas bien?
Veskah
¿Se pueden aislar las nuevas líneas?
Jo King
1
@DimChtz Porque tiene un Ydebajo de él.
Erik the Outgolfer
1
La primera métrica se puede eludir en cualquier lenguaje de programación y cada respuesta tiene una puntuación de 0 ahora.
GB
1
@GB De hecho. Supongo que no es demasiado tarde para convertirlo en un restricted-sourcedesafío y no permitir personajes aislados por completo.
Arnauld

Respuestas:

7

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

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
 

Pruébalo en línea!

-7 bytes, gracias a Jo King

TFeld
fuente
291 bytes
Jo King
@JoKing ¡Gracias! :)
TFeld
5

Limpio , 0 ( 439 ... 415 bytes)

-11 gracias a Ørjan Johansen

Finalmente, un desafío donde puedo marcar 0 con Clean!
(¡y normalmente es malo en los desafíos de diseño de fuente!

//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

Pruébalo en línea!

El enlace TIO se usa module maindebido a la forma en que Clean se implementa en TIO, pero module dfuncionará si nombra el archivo en d.icllugar de main.iclcomo lo hace TIO.

Una de las viejas líneas explicadas (la nueva versión es la misma en un orden diferente):

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
fuente
1
No usarlet ahorra 11 bytes.
Ørjan Johansen
@ ØrjanJohansen ¡Gracias! También he cambiado la cabecera del módulo ya que disponemos de un lado da mano
Οurous
5

JavaScript (ES6), 0 (154 bytes)

Guardado 2 4 bytes gracias a @ ØrjanJohansen

Toma la entrada como una matriz de cadenas.

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=

Pruébalo en línea!

Arnauld
fuente
156 bytes
Ørjan Johansen
4

Jalea , 0 ( 41 27 25 bytes)

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

Pruébalo en línea!

Toma entrada como lista de líneas. La primera línea del código nunca hace nada y solo está allí para minimizar los caracteres aislados.

ỴŒĠạþ`€Ẏ§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
fuente
1

Python 3 , 0 (323 bytes)

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)

Pruébalo en línea!

Jonathan Frech
fuente
1

05AB1E , 0 (101 bytes )

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

Pruébalo en línea.

Este es uno de los programas 05AB1E más feos y largos que he escrito ..>.> Este desafío es engañosamente difícil en 05AB1E. No tengo ninguna duda en mente que el conteo de bytes se puede reducir al menos a la mitad o incluso tres o cuatro veces más pequeño utilizando un enfoque diferente (o incluso con un enfoque similar), pero actualmente no veo cómo. Me alegra que esté funcionando en este momento ... Si alguien más publica una respuesta 05AB1E mucho más corta con algunos trucos inteligentes, probablemente eliminaré esta respuesta por vergüenza ... xD

Explicación:

ž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
fuente
1

Ruby , puntaje 0, 237 209 bytes

##->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]]]==[[]]}}}

Pruébalo en línea!

GB
fuente
0

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

  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

Pruébalo en línea!

Recibir entrada como conjunto de líneas.

Shieru Asakoto
fuente