У каждого должен быть друг

11

Изолированный символ - это символ (кроме новой строки), который не имеет смежного символа того же типа. Смежные символы могут быть слева, справа вверху или внизу, но не по диагонали. Например, в следующем тексте Hизолирован:

Ybb
YH%
%%%%

Все остальные символы не являются изолированными, потому что у каждого из них есть по крайней мере еще один символ того же типа рядом.

Ваша задача - написать программу, которая принимает строку в качестве входных данных и определяет количество изолированных символов.

счет

Ваш ответ будет оцениваться по двум метрикам. Первый - это количество изолированных символов в вашей программе. Вы должны стремиться минимизировать это. Вторым будет количество байтов в вашей программе. Вы должны минимизировать это также. Размер программы будет действовать как разрыв связи по первому критерию.

Дополнительные правила

  • Вы должны поддерживать ввод для диапазона печати ascii плюс любые символы, которые вы используете в своей программе.

  • Вы можете считать разрыв строки либо символом новой строки, либо новой строкой, за которой следует перевод строки.

  • Вы можете принять участие в любом разумном формате. Это включает в себя список строк.

Тестовые случаи

Ybb
YH%
%%%%

1


Aaaab
uuu
yyybbb

2


A

1


qqWWaaww

0

Специальный охотник за гарфами
источник
2
Является ли пустая строка допустимым входным параметром, и если да, то будет ли он равен 0? Также насколько гибок тип ввода? Список строк нормально?
Веска
Можно ли изолировать переводы строки?
Джо Кинг,
1
@DimChtz Потому что это Yниже.
Эрик Outgolfer
1
Первая метрика может быть обойдена на любом языке программирования, и каждый ответ теперь имеет 0 баллов.
GB
1
@ GB Действительно. Полагаю, еще не поздно превратить это в restricted-sourceиспытание и вообще запретить изолированных персонажей.
Арно

Ответы:

7

Python 2 , 0 ( 350 344 314 309 301 298 291 байт)

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
 

Попробуйте онлайн!

-7 байт, спасибо Джо Кингу

TFeld
источник
291 байт
Джо Кинг,
@ JoKing Спасибо! :)
TFeld
5

Чисто , 0 ( 439 ... 415 байт)

-11 благодаря Орджану Йохансену

Наконец, испытание, где я могу набрать 0 с Чистым!
(и, как правило, это плохо при сложностях с исходным кодом!)

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

Попробуйте онлайн!

Ссылка TIO используется module mainблагодаря тому, что Clean реализован на TIO, но module dбудет работать, если вы назовете файл, d.iclа не main.iclкак TIO.

Одна из старых строк объяснила (новая версия - это то же самое в другом порядке):

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
источник
1
Не использоватьlet сохраняет 11 байтов.
Эрджан Йохансен
@ ØrjanJohansen Спасибо! Я также изменил заголовок модуля, так как у нас есть dудобный под рукой
Sepurous
5

JavaScript (ES6), 0 (154 байта)

Сохранено 2 4 байта благодаря @ ØrjanJohansen

Принимает ввод в виде массива строк.

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=

Попробуйте онлайн!

Arnauld
источник
156 байт
Орджан Йохансен,
4

Желе , 0 ( 41 27 25 байт)

ŒĠạþ`€Ẏ§CẠ€S
ŒĠạþ`€Ẏ§CẠ€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
источник
1

Python 3 , 0 (323 байта)

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)

Попробуйте онлайн!

Джонатан Фрех
источник
1

05AB1E , 0 (101 байт )

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

Попробуйте онлайн.

Это одна из самых уродливых и самых длинных программ 05AB1E, которые я когда-либо писал ..>.> Эта задача обманчиво сложна в 05AB1E. Я не сомневаюсь, что счетчик байтов может быть, по крайней мере, уменьшен вдвое или даже в три / четыре раза меньше, если использовать другой подход (или даже с похожим подходом), но в настоящее время я не понимаю, как это сделать. Я просто рад, что это работает прямо сейчас .. Если кто-то еще отправит намного более короткий ответ 05AB1E с некоторыми умными трюками, я, вероятно, удалю этот ответ из позора ... xD

Объяснение:

ž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)
Кевин Круйссен
источник
1

Ruby , оценка 0, 237 209 байт

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

Попробуйте онлайн!

гигабайт
источник
0

JavaScript (Node.js) , 0 (279 байт)

  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

Попробуйте онлайн!

Получите входные данные в виде массива строк.

Сиеру Асакото
источник