Todo mundo deveria ter um amigo

11

Um caractere isolado é um caractere (que não seja uma nova linha) que não possui um caractere adjacente do mesmo tipo. Os caracteres adjacentes podem estar à esquerda, à direita acima ou abaixo, mas não nas diagonais. Por exemplo, no seguinte texto Hé isolado:

Ybb
YH%
%%%%

Todos os outros caracteres não são isolados porque cada um deles tem pelo menos um outro caractere do mesmo tipo adjacente.

Sua tarefa é escrever um programa que use uma string como entrada e determine o número de caracteres isolados.

Pontuação

Sua resposta será pontuada por duas métricas. O primeiro é o número de caracteres isolados no seu programa. Você deve tentar minimizar isso. O segundo será o número de bytes no seu programa. Você deve minimizar isso também. O tamanho do programa atuará como desempate para o primeiro critério.

Regras adicionais

  • Você deve oferecer suporte à entrada no intervalo ascii imprimível, além dos caracteres que você usa no seu programa.

  • Você pode considerar que uma quebra de linha seja um caractere de nova linha ou uma nova linha seguida por um feed de linha.

  • Você pode receber informações em qualquer formato razoável. Isso inclui uma lista de linhas.

Casos de teste

Ybb
YH%
%%%%

1


Aaaab
uuu
yyybbb

2


A

1


qqWWaaww

0

Caçador Ad Hoc Garf
fonte
2
Uma string vazia é uma entrada válida e, se sim, seria 0? Também quão flexível é o tipo de entrada? Lista de linhas bem?
Veskah 13/09/18
As novas linhas podem ser isoladas?
Jo rei
1
@DimChtz Porque tem um Yabaixo dele.
Erik the Outgolfer
1
A primeira métrica pode ser contornada em qualquer linguagem de programação e todas as respostas têm uma pontuação 0 agora.
GB
1
@GB Realmente. Acho que não é tarde demais para transformá-lo em um restricted-sourcedesafio e não permitir personagens isolados por completo.
Arnauld

Respostas:

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
 

Experimente online!

-7 bytes, graças a Jo King

TFeld
fonte
291 bytes
Jo King
@JoKing Thanks! :)
TFeld
5

Limpo , 0 ( 439 ... 415 bytes)

-11 graças a Ørjan Johansen

Finalmente, um desafio em que eu posso marcar 0 com o Clean!
(e normalmente é ruim em desafios de layout de origem!)

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

Experimente online!

O link do TIO usa module maindevido à maneira como o Clean é implementado no TIO, mas module dfuncionará se você nomear o arquivo em d.iclvez de main.iclcomo o TIO.

Uma das linhas antigas explicadas (nova versão é a mesma coisa em uma ordem 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
   ]
Furioso
fonte
1
Não usarlet salva 11 bytes.
Ørjan Johansen
@ ØrjanJohansen Obrigado! Eu também mudou o cabeçalho do módulo uma vez que temos um lado dprático
Οurous
5

JavaScript (ES6), 0 (154 bytes)

Guardado 2 4 bytes graças a @ ØrjanJohansen

Recebe entrada como uma matriz de seqüências de caracteres.

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=

Experimente online!

Arnauld
fonte
156 bytes
Ørjan Johansen
4

Geléia , 0 ( 41 27 25 bytes)

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

Experimente online!

Aceita entrada como lista de linhas. A primeira linha do código nunca faz nada e existe apenas para minimizar caracteres isolados.

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

Experimente online!

Jonathan Frech
fonte
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

Experimente online.

Este é um dos programas 05AB1E mais feios e mais longos que eu já escrevi ..>.> Esse desafio é enganosamente difícil no 05AB1E. Não tenho dúvidas de que a contagem de bytes pode ser reduzida pela metade ou até três / quatro vezes menor usando uma abordagem diferente (ou mesmo com uma abordagem semelhante), mas atualmente não vejo como. Estou feliz que esteja funcionando agora. Se alguém postar uma resposta 05AB1E muito mais curta com alguns truques inteligentes, provavelmente vou excluir essa resposta por vergonha ... xD

Explicação:

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

Ruby , pontuação 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]]]==[[]]}}}

Experimente online!

GB
fonte
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

Experimente online!

Receba entrada como matriz de linhas.

Shieru Asakoto
fonte