Wszyscy powinni mieć przyjaciela

11

Izolowany znak to znak (inny niż nowy wiersz), który nie ma sąsiadującego znaku tego samego typu. Sąsiednie postacie mogą znajdować się po lewej stronie, po prawej stronie powyżej lub poniżej, ale nie po przekątnych. Na przykład w poniższym tekście Hjest izolowany:

Ybb
YH%
%%%%

Wszystkie pozostałe postacie nie są izolowane, ponieważ każda z nich sąsiaduje z co najmniej jedną inną postacią tego samego typu.

Twoim zadaniem jest napisanie programu, który pobiera ciąg znaków jako dane wejściowe i określa liczbę izolowanych znaków.

Punktacja

Twoja odpowiedź będzie oceniana na podstawie dwóch wskaźników. Pierwszy to liczba izolowanych znaków w twoim programie. Powinieneś dążyć do zminimalizowania tego. Drugi będzie liczbą bajtów w twoim programie. Powinieneś to również zminimalizować. Rozmiar programu będzie działał jako wyłącznik remisu dla pierwszego kryterium.

Dodatkowe zasady

  • Powinieneś wspierać wprowadzanie zakresu drukowanego zakresu ascii oraz wszelkie znaki, których używasz w swoim programie.

  • Możesz rozważyć podział linii jako znak nowej linii lub znak nowej linii, po której następuje przejście do nowej linii.

  • Możesz przyjmować dane wejściowe w dowolnym rozsądnym formacie. Obejmuje to listę linii.

Przypadki testowe

Ybb
YH%
%%%%

1


Aaaab
uuu
yyybbb

2)


A

1


qqWWaaww

0

Ad Hoc Garf Hunter
źródło
2
Czy pusty ciąg znaków jest prawidłowy, a jeśli tak, to czy uzyska 0? Jak elastyczny jest typ danych wejściowych? Lista linii w porządku?
Veskah
Czy można izolować nowe linie?
Jo King,
1
@DimChtz Ponieważ ma Yponiżej.
Erik the Outgolfer,
1
Pierwszą metrykę można obejść w dowolnym języku programowania, a każda odpowiedź ma teraz wynik 0.
GB
1
@GB Rzeczywiście. Wydaje mi się, że nie jest za późno na przekształcenie go w restricted-sourcewyzwanie i całkowite wykluczenie izolowanych postaci.
Arnauld,

Odpowiedzi:

7

Python 2 , 0 ( 350 344 314 309 301 298 291 bajtów)

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
 

Wypróbuj online!

-7 bajtów, dzięki Jo King

TFeld
źródło
291 bajtów
Jo King
@JoKing Thanks! :)
TFeld
5

Wyczyść , 0 ( 439 ... 415 bajtów)

-11 dzięki Ørjan Johansen

Wreszcie wyzwanie, w którym mogę zdobyć 0 za pomocą Clean!
(i zwykle źle radzi sobie z układami źródłowymi!)

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

Wypróbuj online!

Link TIO używa module mainze względu na sposób, w jaki Clean jest implementowany w TIO, ale module dbędzie działał, jeśli nazwiesz plik d.iclzamiast main.icltak jak TIO.

Wyjaśniono jedną ze starych linii (nowa wersja to ta sama rzecz w innej kolejności):

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
   ]
Obrzydliwe
źródło
1
Nieużywanielet zapisuje 11 bajtów.
Ørjan Johansen
@ ØrjanJohansen Thanks! Zmieniłem także nagłówek modułu, ponieważ mamy przy sobie dprzydatny
Οurous
5

JavaScript (ES6), 0 (154 bajtów)

Zaoszczędzono 2 4 bajty dzięki @ ØrjanJohansen

Pobiera dane wejściowe jako tablicę ciągów.

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=

Wypróbuj online!

Arnauld
źródło
156 bajtów
Ørjan Johansen
4

Galaretka , 0 ( 41 27 25 bajtów)

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

Wypróbuj online!

Pobiera dane wejściowe jako listę linii. Pierwszy wiersz w kodzie nigdy nic nie robi i jest tam tylko po to, aby zminimalizować pojedyncze znaki.

ỴŒĠạþ`€Ẏ§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
źródło
1

Python 3 , 0 (323 bajty)

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)

Wypróbuj online!

Jonathan Frech
źródło
1

05AB1E , 0 (101 bajtów )

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

Wypróbuj online.

Jest to jeden z najbrzydszych i najdłuższych programów 05AB1E, jakie kiedykolwiek napisałem ..>.> To wyzwanie jest zwodniczo trudne w 05AB1E. Nie mam wątpliwości, że liczbę bajtów można przynajmniej zmniejszyć o połowę, a nawet trzy / cztery razy mniej, stosując inne podejście (lub nawet z podobnym podejściem), ale obecnie nie wiem, jak to zrobić. Cieszę się, że teraz działa. Jeśli ktoś inny opublikuje krótszą odpowiedź 05AB1E z pewnymi inteligentnymi sztuczkami, prawdopodobnie usunę tę odpowiedź ze wstydu ... xD

Wyjaśnienie:

ž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
źródło
1

Rubinowy , wynik 0, 237 209 bajtów

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

Wypróbuj online!

GB
źródło
0

JavaScript (Node.js) , 0 (279 bajtów)

  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

Wypróbuj online!

Odbierz dane wejściowe jako tablicę wierszy.

Shieru Asakoto
źródło