Daha Fazla Sert Nesne veya Yumuşak Nesne Var Mı


19

What-If kitabının açılmasıyla teğetsel olarak ilham aldı.

Girdi, içinde nesnelerin bulunduğu dize, dize listesi vb. Gibi boşluklardan oluşan bir dikdörtgendir #:

########          
#      #          
########          

   ###        ####
   ###        ####
   ###             

Nesneler her zaman kesişmeyen, dokunmayan dikdörtgenler olacaktır. Yumuşak bir nesne #, ortada 's ile doldurulmamış ve yalnızca bir sınır olan bir nesne olarak tanımlanır, sert bir nesne ise doldurulmuş olan bir nesnedir. Genişlik veya yükseklikteki bir nesne <=2zor kabul edilir. Tüm nesneler sert veya yumuşaktır.

Girişte daha fazla sert nesne "Hard"varsa , çıktı , daha yumuşaksa, çıktı "Soft", eşitse çıktı "Equal".

Bu , bayt en kısa kod kazanır!

Test Durumları

Bu durumlar tam girdiler değil, her bir nesnenin neyi karakterize etmesi gerektiği. Gerçek girdi sorunun üstündeki ascii-art gibi olacak.

Zor

#

####

##
##

##########
##########
##########

Yumuşak

###
# #
###

###################
#                 #
#                 #
#                 #
###################

####
#  #
#  #
#  #
#  #
#  #
#  #
#  #
####

Gerçek Test Durumları

########          
#      #          
########          

   ###        ####
   ###        ####
   ###             

Hard

###                
###                
###                

###################
#                 #
#                 #
#                 #
###################

Equal

   ######    
   #    #    
   ######    
          ###
   ##  #  # #
          ###


 ########    
 #      #    
 ########  

Soft

2
Çıkışlar katı mı, yoksa 3 kesin olmayan çıkış kullanılabilir mi (H / S / E veya -1/0/1 gibi)?
trichoplax

@trichoplax onlar are strict
Maltysen

3
Hantal I / O formatlarında meta cevap (seçtiğiniz şeyi yapamayacağınızı söylememek, sadece insanların istedikleri takdirde daha ince bir görüş bildirmeleri için bir yer vermek).
trichoplax

@Doğru olduğundan emin olun, ekleyin.
Maltysen

@LuisMendo hayır, ekliyor.
Maltysen

Yanıtlar:


8

Matl , 105 104 58 50 49 bayt

46 bayt kaldırmamı sağlayan bir öneri için @Neil'e teşekkürler!

2\TTYaEq4:HeqgEqZ+K/Zot0>+ss'Soft Hard Equal'Ybw)

Giriş, satırlarla ayrılmış bir 2B karakter dizisidir ;. Meydan okumadaki örnek

['########          ';'#      #          ';'########          ';'                  ';'   ###        ####';'   ###        ####';'   ###            ']

İşte başka bir örnek:

['###                ';'###                ';'###                ';'                   ';'###################';'#                 #';'#                 #';'#                 #';'###################']

Bu karşılık gelir

###                
###                
###                

###################
#                 #
#                 #
#                 #
###################

ve böylece vermelidir 'Equal'.

Üçüncü bir örnek olarak 'Soft',

['   ######    ';'   #    #    ';'   ######    ';'          ###';'   ##  #  # #';'          ###';'             ';'             ';' ########    ';' #      #    ';' ########    ']

yani,

   ######    
   #    #    
   ######    
          ###
   ##  #  # #
          ###


 ########    
 #      #    
 ########  

Çevrimiçi deneyin!

açıklama

Bu, şekilleri algılamak için 2B evrişim kullanır. Giriş ile 2D dizisine dönüştürülür 1gösteren# ve -1alanı için; ve bir değer çerçevesi ile doldurulur -1. Bu, orijinal alanın kenarındaki şekillerin de algılanmasını sağlar.

Bir yumuşak bir amacı maske tarafından algılanır

 1   1
 1  -1

boş bir iç nokta ile nesnenin sol üst köşesine karşılık gelir. Evrişimin maskeyi tersine çevirdiğini unutmayın, böylece [-1 1; 1 1]kodda olduğu gibi tanımlanır . NumaraEvrişimin eşit 4olduğu konumların S , toplam yumuşak nesne sayısıdır.

Maske tarafından bir nesne (yumuşak veya sert) algılanıyor

-1  -1
-1   1

boş dış noktalar ile birlikte nesnenin sol üst köşesine karşılık gelir. Bu maske bir öncekinin reddedilmiş versiyonudur, bu nedenle önceki evrişim sonucu tekrar kullanılabilir. Özellikle, T sayısı sonucun eşit -4olduğu konumların sayısı toplam nesne sayısıdır.

Sert cisimlerin H sayısı T - S'dir . Çıkış dizesi S - H = 2 * S - T işareti ile belirlenir .

2\                 % Input. Modulo 2: '#' gives 1, ' ' gives 0
TTYa               % Add a frame of zeros
Eq                 % Convert 0 to -1
4:HeqgEq           % Generate mask [-1 1; 1 1], for soft objects
Z+                 % 2D convolution, preserving size
K/Zo               % Divide by 4 and round towards 0. Gives 1 or -1 for 4 or -4
t0>                % Duplicate. 1 for positive entries (soft objects), 0 otherwise
+                  % Add. This corresponds to the factor 2 that multiplies number S
ss                 % Sum of 2D array. Gives 2*S-T
'Soft Hard Equal'  % Push this string
Yb                 % Split by spaces. Gives cell array
w)                 % Swap. Apply (modular) index to select one string

1
Yani, bir kıvrımın ne olduğu hakkında hiçbir fikrim yok, ama sadece tüm nesneleri sayamaz mıydınız (örneğin sol üst köşeyi bularak) ve yumuşak nesnelerin iki katıyla karşılaştırarak?
Neil

@Neil çok umut verici görünüyor, teşekkürler! Bu şekilde 5'den 2'ye kıvrımları azaltabilirim. (Bir kıvrım temelde belirli bir örüntünün bir konumda eşleşip eşleşmediğini görüyor). Daha sonra deneyeceğim
Luis Mendo

... hatta sadece 1 evrişim! Çok teşekkürler! 46 bayt kapalı :-) @Neil
Luis Mendo

3
JS ile neredeyse eşitti ... @Neil ;-)
edc65 19:16

6

JavaScript (ES6), 123 121 118 bayt

s=>s.replace(/#+/g,(m,i)=>s[i+l]>" "?0:n+=!m[1]|s[i-l+1]==s[i-l]||-1,n=l=~s.search`
|$`)|n>l?"Hard":n<l?"Soft":"Equal"

@ Edc65 sayesinde 2 bayt kaydedildi!

Girdi, bir ızgara oluşturmak için boşluklarla doldurulmuş çok satırlı bir dize olarak alınır.

Açıklama / Test

MATL uzunluğuna çok yakın! Temel olarak, #her bir nesnenin üst satırını arar ve üst satırın uzunluğu 2'den azsa veya üst satırın altındaki ilk 2 karakter aynı ise, serttir, aksi takdirde yumuşaktır.

var solution =

s=>
  s.replace(/#+/g,(m,i)=>        // for each run of consecutive # characters
    s[i+l]>" "?                  // if the position above the match contains a #
      0                          // do nothing (this object has already been counted)
    :n+=                         // add 1 to the counter (hard) if
      !m[1]                      // the match is only 1 # wide
      |s[i-l+1]==s[i-l]          // or the characters below are the same
      ||-1,                      // else decrement the counter (soft)
    n=                           // n = counter, hard objects increase n, soft decrease
    l=~s.search`\n|$`            // l = (negative) line length
  )
  |n>l?"Hard":n<l?"Soft":"Equal" // return the result string

// Test
document.write("<pre>" + [`

########          
#      #          
########          
                  
   ###        ####
   ###        ####
   ###            

`,`

###                
###                
###                
                   
###################
#                 #
#                 #
#                 #
###################

`,`

   ######    
   #    #    
   ######    
          ###
   ##  #  # #
          ###
             
             
 ########    
 #      #    
 ########    

`,`

########          
#      #          
########          
                  
   ###        ####
   # #        ####
   ###            

`,`

########          
#      #          
########          
                  
   ###  ###   ####
   ###  # #   ####
   ###  ###       

`,`

#

`,`

##

`,`

#
#

`,`

###
# #
###

`].map((test) => solution(test.slice(2, -2))).join("\n")
)


Tek satırlık girdi ile ilgili bir sorun var gibi görünüyor; ###döner Equal.
Dennis

@Dennis Haklısın. Görünüşe göre tek satır girişi için önceki kodum düzelttiğim hataya dayanıyordu. Şimdi düzeltildi.
user81655

IMHO ~g.search(/$/m)biraz daha okunabilir ~g.search`\n`||-1.
Neil

@Neil True. Bu yüzden aceleyle ||-1düzeltmek için tacked bir hata vardı, ama öneri bana |$regex ekleyerek zaten 2 bayt tasarruf olacağını fark yaptı . Teşekkürler!
user81655

Sadece 1 sayacı kullanabilirsinizn=l=... n>l?...:n<l?...:...
edc65

4

Jöle, 50 49 46 43 38 34 33 32 bayt

Ḥ+ḊZ
>⁶ÇÇFµċ7_ċ4$Ṡị“¤Ỵf“¢*ɦ“¡⁺ƒ»

Çevrimiçi deneyin! veya tüm test durumları doğrulamak .

Arka fon

Var 16 farklı 2 × 2 blok ve boşlukların desenler

|  |  |  | #|  | #| #|# | #|# |# |##|# |##|##|##|
|  | #|# |  |##| #|# |  |##| #|# |  |##| #|# |##|

Bunlardan, iki nesne asla dokunmayacağından,

| #|# |
|# | #|

girişte asla gerçekleşmeyecek, bizi 14 ile terk edecek olası kalıp .

Atama    değeri 0 ve #bir değeri 1 , bir kodlayabilir 2 × 2 desen

|ab|
|cd|

olarak 2 (2a + c) + (2b + d) = 4a + 2b + 2c + d , için aşağıdaki değerleri bırakarak 14 desenleri.

|  |  |  | #|  | #|# | #|# |##|# |##|##|##|
|  | #|# |  |##| #|  |##|# |  |##| #|# |##|
  0  1  2  2  3  3  4  5  6  6  7  7  8  9

Kısmi için 2 x 1 , 1 x 2 veya 1 x 1 boşluklarla takviye edilmiş gibi alt ve / veya sağ sınır desenler, biz bunları kodlayan, onları tedavi olacak 4a + 2b , 4a + 2c ve 4a sırasıyla .

Bu şekilde, her nesnenin (yumuşak veya sert) tam olarak bir 4 deseni olacaktır (sağ alt köşesi); her yumuşak nesnenin tam olarak iki 7 deseni olacaktır (sol alt ve sağ üst köşesi).

Böylece, bir miktar çıkartılarak 4 sayısından kalıpları 7 giriş karşılaşılan desen verecektir (+ H) - 2s = h - s: d = , s ve s oluşturdukları sert ve yumuşak nesnelerin miktarı vardır.

Biz baskı Zor eğer d> 0 , Yumuşak eğer d <0 ve Eşit eğer d = 0 .

Nasıl çalışır

Ḥ+ḊZ                         Helper link. Input: M (n×m matrix)

Ḥ                            Unhalve; multiply all entries of M by 2.
  Ḋ                          Dequeue; remove the first row of M.
 +                           Perform vectorized addition.
                             This returns 2 * M[i] + M[i + 1] for each row M[i].
                             Since the M[n] is unpaired, + will not affect it,
                             as if M[n + 1] were a zero vector.
   Z                         Zip; transpose rows with columns.


>⁶ÇÇFµċ7_ċ4$Ṡị“¤Ỵf“¢*ɦ“¡⁺ƒ»  Main link. Input: G (character grid)

>⁶                           Compare each character with ' ', yielding 1 for '#'
                             and 0 for ' '.
  Ç                          Call the helper link.
                             This will compute (2a + c) for each pattern, which is
                             equal to (2b + d) for the pattern to its left.
   Ç                         This yields 2(2a + c) + (2b + d) for each pattern.
    F                        Flatten; collect all encoded patterns in a flat list.

     µ                       Begin a new, monadic link. Argument: A (list)
      ċ7                     Count the amount of 7's.
         ċ4$                 Count the amount of 4's.
        _                    Subtract the latter from the former.
            Ṡ                Yield the sign (1, -1 or 0) of the difference.
              “¤Ỵf“¢*ɦ“¡⁺ƒ»  Yield ['Hard', 'Soft', Equal'] by indexing into a
                             built-in dictionary.
             ị               Retrieve the string at the corresponding index.

1

Julia, 99 95 93 bayt

~=t->2t'+[t[2:end,:];0t[1,:]]'
!x=("Hard","Equal","Soft")[sign(~~(x.>32)∩(4,7)-5.5|>sum)+2]

!bağımsız değişken olarak iki boyutlu bir Char dizisi bekler. Çevrimiçi deneyin!

Nasıl çalışır

Bu , tek bir iyileştirmeyle Jelly cevabımla neredeyse aynı fikri kullanıyor :

Miktarını saymak yerine 4 'ler ve 7 ' nin, çıkartmanın daha sonra, diğer tüm numaraları kaldırmak 5.5 harita (4, 7) için (-1.5, 1.5) . Bu şekilde, ortaya çıkan farklılıkların toplamının işareti doğru çıktıyı belirler.


0

TSQL, 328249 bayt

Değişkenleri ve test verilerini bildirme:

DECLARE @l int = 20
DECLARE @ varchar(max)=''
SELECT @+=LEFT(x + replicate(' ', @l), @l)
FROM (values
(' xxxx'),
(' xxxx'),
(' xxxx'),
('x'),
(''),
('xxx'),
('x x  xxx'),
('xxx  x x'),
('     xxx    ')) x(x)

Kod:

SELECT substring('Soft EqualHard',sign(sum(iif(substring(@,N,@l+2)like'xx'+replicate('_', @l-2)+'x ',-1,1)))*5+6,5)FROM(SELECT row_number()OVER(ORDER BY Type)N FROM sys.all_objects)x WHERE n<=len(@)AND' x'=substring(@,N-1,2)AND''=substring(@,N-@l,1)

Kod sönük:

SELECT
  substring('Soft EqualHard',
    sign(sum(iif(substring(@,N,@l+2)like'xx'+replicate('_', @l-2)+'x ',-1,1)))*5+6,5)
FROM(SELECT row_number()OVER(ORDER BY Type)N FROM sys.all_objects)x
WHERE n<=len(@)AND' x'=substring(@,N-1,2)AND''=substring(@,N-@l,1)

Açıklama:

Komut dosyası desen metnini tarıyor:

      space
space x

Bunların her biri bir kutunun başlangıcıdır

Bu konumlar için komut dosyası kalıbı kontrol eder, ilk x'i kontrol etmenize gerek yoktur:

  x
x space 

Bu olduğunda yumuşak bir nesnedir, aksi takdirde sert bir nesnedir.

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.