Кожен повинен мати друга


11

Ізольований символ - це символ (крім нового рядка), який не має суміжного символу того ж типу. Суміжні символи можуть бути ліворуч, праворуч вгорі або внизу, але не по діагоналі. Наприклад, у наступному тексті Hвиділено:

Ybb
YH%
%%%%

Усі інші символи не є ізольованими, оскільки кожен з них має принаймні один сусідній символ одного типу.

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

Оцінка балів

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

Додаткові правила

  • Ви повинні підтримувати введення даних у діапазоні ascii для друку плюс будь-які символи, які ви використовуєте у своїй програмі.

  • Ви можете вважати перерив рядка символом нової лінії чи новим рядком, за яким слід подавати рядок.

  • Ви можете взяти інформацію в будь-якому розумному форматі. Сюди входить список рядків.

Випробування

Ybb
YH%
%%%%

1


Aaaab
uuu
yyybbb

2


A

1


qqWWaaww

0


2
Чи правильний рядок порожнього рядка, і якщо так, він набере 0? Також наскільки гнучким є тип введення? Список рядків тонкий?
Веська

Чи можна виділити нові лінії?
Джо Кінг

1
@DimChtz Тому що Yвнизу є.
Ерік Аутгольфер

1
Перший показник можна обійти будь-якою мовою програмування, і кожна відповідь має 0 балів.
ГБ

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 байт, завдяки Джо Кінгу



@JoKing Дякую! :)
TFeld

5

Очистити , 0 ( 439 ... 415 байт)

-11 завдяки rjan Johansen

Нарешті виклик, де я можу набрати 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
   ]

1
Не використовуєlet економію 11 байт.
Ørjan Johansen

@ ØrjanJohansen Дякую! Я також змінив заголовок модуля , так як у нас є суміжні dзручний
Οurous


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



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)


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.