Koşulsuz!


42

giriş

Duvarda 3 çivi var. Her iki ucu da olan resim çerçevesine sabitlenmiş bir ip parçanız var. Resmi asmak için, ipi tırnaklarla dolaştırdınız. Ancak resmin gitmesine izin vermeden önce: Resmin düşüp düşmeyeceğini tahmin edebilirsiniz, sadece ipin tırnakların etrafına nasıl sarıldığına bakarak.

İlk örnekte resim düşmeyecek. İkinci örnekte, resim düşecek.

Meydan okuma

İpin Nçivilerin etrafındaki yolu göz önüne alındığında, resmin düşüp düşmeyeceğini belirleyin. Bir İade truthy resim düştü düşecek olursa değerini, aksi takdirde bir falsy değer.

ayrıntılar

  • Çivilerin ve resmin N+1, resmin altındaki en altta olacak şekilde düzenli aralıklarla yerleştirildiğini varsayabilirsiniz.
  • İpte düğüm olmadığından, yani ipin iki ucundan birinden sürekli olarak çekilebileceğini varsayabilirsiniz.
  • Her tırnak saat yönünde alfabenin bir harfiyle numaralandırılır. En fazla 26 çivi (AZ) olduğunu varsayabilirsiniz.
  • Bir çivinin etrafındaki saat yönünde bir sargı, küçük harfle, saat yönünün tersine sarılmış bir harf, büyük harf ile belirtilir.

Yukarıdan birinci örnek BcA, ikinci örnek olarak kodlanmış olarak kodlanacaktır CAbBac.

Eğimli okuyucu için: Bu sorun, serbest grubun - çivi seti tarafından oluşturulan - bir öğenin kimlik olup olmadığını belirlemeye eşdeğerdir . O yeterlidir Bu araçlar tekrar tekrar altdizgelerin gibi iptal aAveya Aasabit bir noktaya ulaşana kadar. Sabit nokta boş bir dize ise, bu nötr elemandır, aksi halde değildir.

Örnekler

Picture will fall:
Aa
CAbBac
aBbA
DAacAaCdCaAcBCBbcaAb
ARrQqRrUuVHhvTtYyDdYyEKRrkeUWwua
AKkQqEeVvBESWwseYQqyXBbxVvPpWwTtKkVHLlWwNBbAanYYyyhWwEJZUuNnzjYyBLQqQqlEGgebeEPLlTtZzpUuevZzSsbXSGgsUuLlHhUQquPpHUuFfhTZzIitGgFAaBRrBbbYXxOoDZTDdtzVvXxUudHhOVvoUuXKkxyBEeLlbFfKkHhfVAaQqHAaJjODdoVvhSsZzMZzmPpXNBbnxBbUuSSsUuDRrdNnUusJDIiUuIidCEGgeMmcLlDPOopdTEeQqCAETtNnYyeGUuPEFfSsWwHheAaBbpgCcOHUuhAaCcoEFBbfeaFHhfcCFFffNncGFfgtjMVUuKAakvKkXxLlTMmtmOFfoUuXSsYZzLXxlyxUuRPZzTtprSsWwRrPLlpGgMmKRrDHhdRCcUurYNnKCckykXJjxWwUSsJjKkLlKkuBbBbOoWwWwIiUuPDdBbCcWHBbCFfcDdYBbLlyVvSsWGgEewCchDdYywAaJjEepPpPpQXxZzFfLGXxglNnZzYDdyqCcKWXxwXxQqXTtxkFfBSSAasTFftZzsXGgxSsLlLlbZzAaCCccXVvYyxTIiOoBbFftCVQqDdBbGgAavQqKkDPpKTCctRrkdcvAaQWOowLOolqVMmvZAaHCBbcPphIiRKkrLlzFMOomDIiXJjIixMmdNnMHhmfNTtIiKkSDdTtsVvHhnAaNSVvTUutNnXxsGIiXxPpPHhUupgNnAaAAOoaaIiHJjhVvLlnYyXxQqSsTtKJjkBbNnVvEYCcFfMHGghBbmNnEeJTtjJjWYywyeNWwDIiZYyzOodnMQqmVvCcQqxVvGNnEeNBbngVvUGgYyBbDdVvIiAAaauPpQKDdEekNnVLlvHhGSDIidPZzpsPCcpgQqKkQqNOonLlIiLlJjqPAaPXxTtppYyCPpHhCIicARBbracXxWwXEVUuUuGgZHhzBSsbvGgFfeVvxLlNKknWwBLlIibWOowNnRSsrSEeKAakOosLZzZRrHhzTtTFfUuNnOKkotXxTtla


Picture will not fall:
A
BcA
ABCD
aBaA
bAaBcbBCBcAaCdCaAcaCAD
ARrQqRrUatuVHhvTYyDdYyEKRrkeUAua
AEEeQqNneHhLlAIiGgaECXxcJjZzeJFfVWwDdKkvYWwyTJjtCXxANIinaXWwxcTWwtUuWwMmTBbVWIiFLlWwZzfwPLlEepvWZzwKkEYEeWXxwySXTtEexRIiNBbnWAaTtQqNnBMSsWwOombwWwPVPpGPpgYyvDdpBbrQqHhUusKRrDAVvadLlWwOZzokGJCXSSssXxxJPpGIigZzjJjLlOoNRrnPpcMZzmjgJjNDEeQqWKkNTtnSswIidCcnYBGgbyJSsjPpIiMmMmMmSNnWVvwZzIQqLXHhxTPptlisOoeTtTtYMmVvPpyKNnMFfmkXxSVvsCGJjXxgXYJPpjWwQIiXxqyDdxFfDdAaRNnJjrctHBbZzhEQqMmeCcRBbrGgAaAaJNnRrYyWwSDdVvsJOojQGgWWwIBbiwRrqJjjWwOoFPMmDdRrQOoqNnRrDPJjpMmdPpGFfVvWUuwgpWCcNnPpwfUXCcZzJjUSsuXxxUuuRGgHhrSQqJjOosMMTtmHhmKkXxDdLlWwjSUuAaMmKYyksZzVvPZzVEeVvvHhZZOozBbzMmZCczYyGgISsiQqpXxMmXxEMmeRrAGgaGgMOGgomZFfDdzSSssBGPpgbTtBbOoRWWwGgLJjlEeGgLDdRrUulNnZzJjJjUKkuXxFfwATtaZzLVvlWwSsMmrBAaELleGBLFflbgHhbIFfiBbPpTWZzwKkKLASsaTJYyjtBbBbWwIiZCcWwzIiZLlUTtuBbYyBbIizTJjtLTtDOOoBbodBbllSsUGgLlAKkauYykUuUNnPpuDFfAaLNVvnVvlHhdMmBAaBbIiVRrGWOoPpwgWXwKkvJjOoTtYCUucVGgYyLlVvFfvRrMmySsDdbtICZzcNnINSOosDQAaXoxRGgKkrqdZznDdXxZzMGgmiJjNnACcMQqmaNnWZzUOuwTVvAJjSsaRrGgSsTtOMmRroVvRrtAVGgvMmaINniDGCcOogRrWwMVvYFfyTtmTtVvOoOIiodRrGgAxaSsGgiJja

3
Görünüşe göre dize yolunu yazmak için birinin ellerini serbest bırakırken, resmin yine de düşeceği görülüyor. O zaman bu meydan okuma gerçekten kolaylaşıyor.
owacoder

@owacoder Sadece yeterince hızlı olmanız gerekiyor: D
kusur

Yanıtlar:


11

Retina , 21 bayt

+`(.)(?!\1)(?i)\1

^$

Çevrimiçi deneyin!

Kusurun çözümü gibi, bu da bitişik büyük harf / küçük harf çiftlerini tekrar tekrar siler ve daha sonra sonucun boş olup olmadığını kontrol eder.

Bir büyük harf / küçük harf çifti ile nasıl eşleşir gelince:

(.)     # Match and capture a letter.
(?!\1)  # Ensure that the next character is not the same, to avoid matching
        # "aa" and "AA".
(?i)    # Turn on case-insensitivity.
\1      # Match the backreference. In .NET, when using case insensitivity,
        # backreferences also get case-insensitive, so this *can* still match
        # iff the cases of the two letters are different.

7

MATLAB, 76 bayt Octave, 82 79 77 bayt

Bu, ilk kez MATLAB'ın Octave'den (tüm byte ile) daha kısa olduğunu ilk gördüğüm zaman olabilir !

MATLAB'daki yeni cevap:

c=input('');k='Aa';while k<1e5,k=k+1;c=strrep(c,65+mod(k,64),'');end;~nnz(c)

Octave dilinde cevap:

c=input('');k='Aa';while k++<1e5,c=strrep(c,['',65+mod(k,64)],'');end;~nnz(c)

Kaydedilen üç flawr beş bayt sayesinde. ~nnz(c)daha kısa isempty(c)ve 'Aa'iki byte daha kısa [0,32].

Çevrimiçi Octave sürümünü deneyin!


Açıklama:

c=input('')kullanıcıdan giriş yapmasını ister. k='Aa'Karakter dizisi olarak tanımlarız .

while k++<1e5: Her iki elemanları döngü sırasında k, her yineleme, artırılır Aa, Bb, Ccve böyle devam eder. Döngü, en büyük eleman olana kadar devam edecektir 1e5, ki bu çoğu karakter dizisi için yeterince yüksek olmalıdır. Bu kadar artırılabilir 9e9bayt sayısını artırmadan.

Biz götürürüz strreportasından başlayarak kademeli bir şekilde işlevini.

Kullanarak mod(k,64)alfabenin sonuna geldiğimizde aşağıdakileri alırız (eğer kkarakterlere dönersek ):

ans = Yy
ans = Zz
ans = [{
ans = \|
ans = ]}
ans = ^~
ans = _
ans = `�
ans = aA
ans = bB

Gördüğünüz gibi, aralarında bazı semboller olacak, ama sonra tekrar saracak ve tekrar alfabeyle başlayacak, ama şimdi ilk önce küçük harflerle. Bu, hem kontrol etmek çok kısa bir yoldur Aave aA.

['',65+mod(k,64)]-call'dan gelen sayısal değerleri mod, sayıları karakterlere dönüştüren boş bir dizeyle birleştirir .

strrepdizeden öğeleri kaldırmak cve geri döndürmek için kullanılır. kDizedeki tüm oluşumları arayacak ve boş bir dizeyle değiştirecektir.

1e5Yinelemelerden sonra boş bir dizgeye veya boş olmayan bir dizgeye sahip oluruz. Herhangi unsur vardır edip etmediğini kontrol ckullanarak nnz(c). Döndük not(nnz(c)), böylece 1boşsa ve 0içinde kalan karakterler varsac


6

Minkolang 0.15 , 30 bayt

od4&x,N.I1=$6&d3~c-$~48*=,2&xx

Burada dene!

açıklama

od                            Take character from input and duplicate it
  4&                          If top of stack is truthy, jump 4 spaces
    x                         Dump top of stack
     ,                        NOT top of stack
      N.                      Output as number and stop

    I1=                       1 if stack has 1 element, 0 otherwise
       $6&                    If top of stack is truthy, jump 16 spaces (to the beginning)
          d3~c                Duplicate top two items of stack, in reversed order
              -               Subtract
               $~             Absolute value
                 48*          Push 32
                    =,        0 if top two items are equal, 1 otherwise
                      2&xx    If top of stack is truthy, dump two elements from top

Minkolang'ın toroidal doğası, bir dış döngü ihtiyacını ortadan kaldırmak için burada kullanılır. Buradaki genel fikir, yığının en üst iki elemanının 32 ünite olup olmadığını kontrol etmektir (yani bir büyük / küçük harf oldukları anlamına gelir) ve eğer öyleyse, ikisini birden patlatır. Bu "gerçek zamanlı" yapıldığından, tabiri caizse, çiftlerin yuvalanması düzgün bir şekilde yapılır.


5

Haskell, 62 bayt

a%l|b:t<-l,abs(a-b)==32=t|1>0=a:l
f=null.foldr((%).fromEnum)[]

Çevrimiçi deneyin

Kredi için için flawrabs ve için Laikoni fromEnumharitası .

Yardımcı işlev %zaten basitleştirilmiş bir dize alır ve sonucu basitleştirmeden önce lsembolü hazırlar a. Eğer lters karakteri ile başlar etmek a, bunlar iptal edin. Aksi takdirde, asadece hazırlanır. Bu aşamada daha fazla basitleştirmeye gerek olmadığını unutmayın.

Ana işlev f, sırayla her karakteri a ile hazırlar ve basitleştirir foldr. Ardından sonucun boş olup olmadığını kontrol eder.

İki karakterin karşıt harfleri olup olmadığını kontrol etmek için ve böylece iptal etmeleri gerekir, ASCII değerlerinin 32 farklılık gösterip göstermediğine bakın. Her öğe fromEnumiletilmeden önce işlenir %.


Güzel! Açıklama için teşekkürler, her zaman yeni şeyler öğreniyorum!
kusur,

4

05AB1E , 17 bayt

DvADu‚øDíìvyK}}õQ

Çevrimiçi deneyin!

açıklama

Dv                 # input number of times do:
  A                # push lowercase alphabet
   Du              # push uppercase alphabet
     ‚ø            # zip the alphabets together (['aA', ..., 'zZ'])
       Díì         # prepend a copy with each element reversed ('Aa' ...)
          v        # for each pair in the resulting list
           yK      # remove it from the accumulated string (starts as input)
             }}    # end loops
               õQ  # check result for equality to empty string

4

Haskell , 98 97 85 81 bayt

Bu, daha fazla değişiklik yapılıncaya kadar yanıltıcı harfleri iptal etmeye çalışan ve daha sonra da sonucu belirleyen saf bir uygulama.

-12 bayt için @nimi ve başka -4 bayt için @xnor!

o=fromEnum
r(a:b:l)|abs(o a-o b)==32=l|1>0=a:r(b:l)
r x=x
f=null.until((==)=<<r)r

Çevrimiçi deneyin! veya Tüm örnekleri doğrulayın!


f=null.until(\a->r a==a)r.map fromEnumiki bayt kaydetmelisiniz.
Laikoni

Bence (\a->r a==a)olabilir ((==)=<<r).
xnor

1
İkinci satırda, seni değiştirebilir düşünmek =r liçin lbir fikir sadece koşmak başına bir değiştirme yapmak için yeterli olmak.
Xnor

Teşekkür ederim! İkinci ipucunu anlıyorum ama neler olup bittiğine dair hiçbir fikrim yok =<<, sihir XD gibi görünüyor
kusur

1
@flawr Bu ipucuna bakın . =<<Gibidir >>=ama takas argümanlarla. İfade genellikle ((==)=<<r)"altında değişmez" anlamına geldiği şekliyle ortaya çıkar r.
xnor

3

Mathematica, 102 bayt

""==StringDelete[""|##&@@#<>#2&~MapThread~{Join[a=Alphabet[],A=ToUpperCase@a],A~Join~a}]~FixedPoint~#&

Adsız işlev giriş olarak alfabetik bir dize alarak ve geri dönen Trueveya False.

Uygulamanın özü, bir dize gibi "Pp"veya herhangi bir iptal eden çifti silen bir işlev oluşturmaktır "gG". İfade {Join[a=Alphabet[],A=ToUpperCase@a],A~Join~a}, birinci liste {"a","b",...,"Z"}ve ikincisi olmak üzere sıralı bir çift karakter listesi üretir {"A","B",...,"z"}. Sonra #<>#2&~MapThread~bu iki listenin karşılık gelen öğelerinin birleştirildiği bir liste oluşturur, yani {"aA","bB",...,"Zz"}. ""|##&@@Sonra eğlenceli ifade (argüman dizisinin büyüsü aracılığıyla ##) bir alternatifler listesi üretir "" | "aA" | "bB" | ... | "Zz"; Son olarak, StringDelete[...]bir dize bu alternatiflerin herhangi bir oluşumunu silen bir fonksiyondur.

Şimdi, bu işlevi sonuç değişinceye kadar giriş dizgisine defalarca uygulamak yeterlidir, bu işlem tarafından gerçekleştirilir ~FixedPoint~#ve ardından sonucun boş dizge olup olmadığını test eder ""==.


3

JavaScript (ES6), 73 bayt

f=(s,t=s.replace(/(.)\1+/gi,s=>s.replace(/(.)(?!\1)./,'')))=>s==t?!s:f(t)

.NET’in aksine, JavaScript’in bir eşleşmenin ortasında büyük / küçük harf duyarlılığını kapatmanın bir yolu yoktur, bu nedenle tekrarlanan harflerin tüm alt dizgilerini duyarsız bir şekilde bulmalı ve ardından bu noktaya göre olması gereken eşleşmeyen bitişik karakter çiftlerini silmeliyiz. bir büyük / küçük harf çifti.


3

Perl, 28 bayt

1 while s/.(??{$&^' '})//;$_

Açıklama:

Perl, standart bir düzenli ifadenin içine dinamik olarak oluşturulan normal bir ifade eklemenizi sağlar.

Her .şey eşleşir.

(??{Oluşturulan regex başlangıcıdır.

$&Değişken bu durumda sadece ne olduğu bugüne kadar dize eşleşti bütününü, içerecektir .eşleşti.

^Operatör İşlenenlerin değerlerine bağlı olarak, ya sayısal xor veya dize xor yapar. Bu durumda, xor dizgisi olacaktır.

Bu ' 'sadece, ascii (veya unicode!) Değeri 32 olan uygun bir boşluk içeren bir dizedir. versa.

})Oluşturulan düzenli ifade sonudur.

1 while s/whatever// art arda bir model arayacak ve boş dizeyle değiştirecektir.

$_varsayılan değişkendir. Bu değişken, başka bir değişken belirtmediğinizde perl'in eğlenceli ve heyecan verici şeyler yaptığı şeydir. Burada, sıfır uzunluklu bir string yanlış olduğu ve eşit olmayan sıfır uzunluklu olmayan bir stringin doğru olması nedeniyle, bir gerçeği veya sahte değeri döndürmek için kullanıyorum "0". Ayrıca giriş dizesinin başlangıçta içine yerleştirildiğini de farz ediyorum.

Burada dene


teknik olarak, bu, mücadelenin istediği şeyin tersini döndürür (yanlış olduğunda ve ne zaman tersi olması gerektiği gerçeğini döndürürsünüz). Düzeltmek için, !finalden önce eklemeniz yeterli $_. Bu şekilde tutmak size uygun değilse s/.(??{$&^' '})//&&redo, -pbayrağa +1 bayt değiştirerek 4 bayttan tasarruf edebilirsiniz . Şimdiki gibi bir alt programda çalışmaz çünkü { code }aslında bir döngü &&redodeğildir (bu yüzden işe yaramaz), ancak -ponu bir whiledöngü içine koyar .
Gabriel Benamy

Ayrıca değiştirerek başka byte kaydedebilirsiniz ' 'ile $". Kodun neye benzediğini görmek için şuna bir bakın.
Gabriel Benamy

2

Prolog (SWI) , 151 bayt

f(S):-S="";string_code(I,S,X),string_code(J,S,Y),J is I+1,32is abs(X-Y),B is J+1,sub_string(S,0,I,_,T),sub_string(S,B,_,0,U),string_concat(T,U,V),f(V).

Geri izleme nedeniyle uzun süren yanlış davalarda uzun zaman alıyor.

Çevrimiçi deneyin!

Ungolfed

f(S):-                       The string S corresponds to a falling picture if:
  S="";                      S is the empty string, or...
  string_code(I,S,X),        X is the character code at some index I
  string_code(J,S,Y),        Y is the character code at some index J
  J is I+1,                  J is I+1
  32 is abs(X-Y),            X and Y differ by 32 (difference between lower/upper case)
  B is J+1,                  ...
  sub_string(S,0,I,_,T),     ...
  sub_string(S,B,_,0,U),     ...
  string_concat(T,U,V),      ...
  f(V).                      The concatenation of the substrings before and after 
                             the letters X and Y corresponds to a falling picture.

1

MATL , 20 bayt

t"[]yd|32=fX<tQh(]n~

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın (bir süre alır).

açıklama

t       % Input string implicitly. Duplicate
"       % Do as many times as input size
  []    %   Push empty array
  y     %   Duplicate current string onto the top
  d|    %   Absolute consecutive differences
  32=   %   Convert to true if 32, false otherwise
  fX<   %   Index of first occurrence of true, or empty of all false
  tQ    %   Duplicate, add 1. This gives the next index, or empty
  h     %   Concatenate. Gives the two consecutive indices of letters
        %   to be removed, or empty
  (     %   Assign an empty array to those positions, i.e. delete them
]       % End
n~      % Number of elements, negate

1

Mathematica, 65 bayt

(ToCharacterCode@#//.{x___,y_,z_,w___}/;Abs[y-z]==32:>{x,w})=={}&


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.