Herkesin Bir Arkadaşı Olmalı


11

Yalıtılmış bir karakter, aynı türde bitişik bir karaktere sahip olmayan bir karakterdir (yeni satırdan başka). Bitişik karakterler sola, sağa veya aşağıya doğru olabilir, ancak köşegenler olamaz. Örneğin, aşağıdaki metinde Hizole edilmiştir:

Ybb
YH%
%%%%

Diğer tüm karakterler izole edilmez, çünkü her birinin yanında aynı tipte en az bir başka karakter bulunur.

Göreviniz, bir dizeyi girdi olarak alan ve izole karakter sayısını belirleyen bir program yazmaktır.

puanlama

Yanıtınız iki metrik tarafından puanlanacaktır. Birincisi, programınızdaki izole karakterlerin sayısıdır. Bunu en aza indirmeyi hedeflemelisiniz. İkincisi, programınızdaki bayt sayısıdır. Bunu da en aza indirmelisiniz. Program boyutu ilk kriter için bir bağlayıcı kırıcı görevi görecektir.

Ek Kurallar

  • Yazdırılabilir ASCII aralığındaki girişi ve programınızda kullandığınız karakterleri desteklemelisiniz.

  • Satır sonunu yeni satır karakteri veya yeni satır ve ardından satır beslemesi olarak düşünebilirsiniz.

  • Herhangi bir makul biçimde girdi alabilirsiniz. Buna bir satır listesi de dahildir.

Test Durumları

Ybb
YH%
%%%%

1


Aaaab
uuu
yyybbb

2


A

1


qqWWaaww

0


2
Boş bir dize geçerli bir giriş midir ve eğer öyleyse 0 olur mu? Ayrıca giriş tipi ne kadar esnektir? Satır listesi iyi mi?
Veskah

Yeni satırlar izole edilebilir mi?
Jo King

1
@DimChtz Çünkü Yaltında bir var.
Outgolfer Erik

1
İlk metrik herhangi bir programlama dilinde aşılabilir ve şimdi her cevabın 0 puanı vardır.
GB

1
@GB Gerçekten. Sanırım bunun restricted-sourceyerine bir meydan okumaya dönüştürmek için çok geç değil ve izole karakterlere tamamen izin vermeyin .
Arnauld

Yanıtlar:


7

Piton 2 , 0 ( 350 344 314 309 301 298 291 bayt)

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
 

Çevrimiçi deneyin!

-7 bayt, Jo King sayesinde



@JoKing Teşekkürler! :)
TFeld

5

Temiz , 0 ( 439 ... 415 bayt)

-11 sayesinde Ørjan Johansen

Sonunda Clean!
(ve normalde kaynak düzeni zorluklarında kötüdür !)

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

Çevrimiçi deneyin!

TIO bağlantısı module main, TIO'da Clean'in uygulanma şekli nedeniyle kullanılır , ancak module ddosyayı TIO d.iclyerine adlandırırsanız çalışır main.icl.

Açıklanan eski satırlardan biri (yeni sürüm farklı bir sırayla aynı şeydir):

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
Kullanmamaklet 11 bayt kaydeder.
Ørjan Johansen

@ ØrjanJohansen Teşekkürler! Ayrıca, bitişik bir dkullanışlıya sahip olduğumuzdan modül başlığını değiştirdim
Οurous

5

JavaScript (ES6), 0 (154 bayt)

Kaydedildi 2 4 @ ØrjanJohansen sayesinde bayt

Girdiyi dizeler dizisi olarak alır.

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=

Çevrimiçi deneyin!



4

Jöle , 0 ( 41 27 25 bayt)

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

Çevrimiçi deneyin!

Girişi satır listesi olarak alır. Koddaki ilk satır hiçbir şey yapmaz ve yalnızca yalıtılmış karakterleri en aza indirmek için vardır.

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

Python 3 , 0 (323 bayt)

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)

Çevrimiçi deneyin!


1

05AB1E , 0 (101 bayt )

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

Çevrimiçi deneyin.

Bu şimdiye kadar yazdığım en çirkin ve en uzun 05AB1E programlarından biri ..>.> Bu zorluk 05AB1E'de aldatıcı bir şekilde zor. Bayt sayımının farklı bir yaklaşım (hatta benzer bir yaklaşımla) kullanarak en azından yarıya, hatta üç / dört kat daha küçük olabileceğine hiç şüphe yok, ama şu anda nasıl olduğunu göremiyorum. Şu anda çalıştığına sevindim .. Birisi bazı akıllı hilelerle çok daha kısa bir 05AB1E yanıtı gönderirse, muhtemelen bu cevabı utançtan sileceğim ... xD

Açıklama:

ž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 , skor 0, 237209 bayt

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

Çevrimiçi deneyin!


0

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

  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

Çevrimiçi deneyin!

Girişi satır dizisi olarak alır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.