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.