Tidak ada ikatan!


42

Intro

Ada 3 paku di dinding. Anda memiliki seutas tali yang terpasang pada bingkai foto dengan kedua ujungnya. Untuk menggantung gambar, Anda menjerat tali dengan paku. Tetapi sebelum melepaskan gambar: Dapatkah Anda memprediksi apakah gambar akan jatuh, hanya dengan melihat bagaimana tali melilit paku?

Pada contoh pertama gambar tidak akan jatuh. Dalam contoh kedua gambar akan jatuh.

Tantangan

Mengingat jalur tali di sekitar Npaku, tentukan apakah gambar itu akan jatuh atau tidak. Kembalikan nilai kebenaran jika gambar akan jatuh, dan nilai palsu sebaliknya.

Detail

  • Anda dapat mengasumsikan bahwa paku dan gambarnya diatur secara teratur N+1, dengan gambar di bagian bawah.
  • Anda dapat mengasumsikan bahwa tidak ada simpul di tali, yaitu tali dapat terus-menerus terbungkus dari salah satu dari dua ujungnya.
  • Setiap kuku dihitung searah jarum jam dengan huruf alfabet. Anda dapat mengasumsikan bahwa paling banyak ada 26 paku (AZ).
  • Lilitan searah jarum jam di sekitar kuku dilambangkan dengan huruf kecil, pembungkus searah jarum jam dilambangkan dengan huruf besar.

Contoh pertama dari atas akan dikodekan sebagai BcA, contoh kedua dikodekan sebagai CAbBac.

Untuk pembaca cenderung: Masalah ini setara dengan menentukan apakah suatu elemen dari kelompok bebas - yang dihasilkan oleh set kuku - adalah identitas atau tidak. Ini berarti cukup untuk membatalkan substring berulang kali seperti aAatau Aasampai Anda mencapai titik tetap. Jika titik tetap adalah string kosong, ini adalah elemen netral, jika tidak, maka tidak akan.

Contohnya

Picture will fall:
Aa
CAbBac
aBbA
DAacAaCdCaAcBCBbcaAb
ARrQqRrUuVHhvTtYyDdYyEKRrkeUWwua
AKkQqEeVvBESWwseYQqyXBbxVvPpWwTtKkVHLlWwNBbAanYYyyhWwEJZUuNnzjYyBLQqQqlEGgebeEPLlTtZzpUuevZzSsbXSGgsUuLlHhUQquPpHUuFfhTZzIitGgFAaBRrBbbYXxOoDZTDdtzVvXxUudHhOVvoUuXKkxyBEeLlbFfKkHhfVAaQqHAaJjODdoVvhSsZzMZzmPpXNBbnxBbUuSSsUuDRrdNnUusJDIiUuIidCEGgeMmcLlDPOopdTEeQqCAETtNnYyeGUuPEFfSsWwHheAaBbpgCcOHUuhAaCcoEFBbfeaFHhfcCFFffNncGFfgtjMVUuKAakvKkXxLlTMmtmOFfoUuXSsYZzLXxlyxUuRPZzTtprSsWwRrPLlpGgMmKRrDHhdRCcUurYNnKCckykXJjxWwUSsJjKkLlKkuBbBbOoWwWwIiUuPDdBbCcWHBbCFfcDdYBbLlyVvSsWGgEewCchDdYywAaJjEepPpPpQXxZzFfLGXxglNnZzYDdyqCcKWXxwXxQqXTtxkFfBSSAasTFftZzsXGgxSsLlLlbZzAaCCccXVvYyxTIiOoBbFftCVQqDdBbGgAavQqKkDPpKTCctRrkdcvAaQWOowLOolqVMmvZAaHCBbcPphIiRKkrLlzFMOomDIiXJjIixMmdNnMHhmfNTtIiKkSDdTtsVvHhnAaNSVvTUutNnXxsGIiXxPpPHhUupgNnAaAAOoaaIiHJjhVvLlnYyXxQqSsTtKJjkBbNnVvEYCcFfMHGghBbmNnEeJTtjJjWYywyeNWwDIiZYyzOodnMQqmVvCcQqxVvGNnEeNBbngVvUGgYyBbDdVvIiAAaauPpQKDdEekNnVLlvHhGSDIidPZzpsPCcpgQqKkQqNOonLlIiLlJjqPAaPXxTtppYyCPpHhCIicARBbracXxWwXEVUuUuGgZHhzBSsbvGgFfeVvxLlNKknWwBLlIibWOowNnRSsrSEeKAakOosLZzZRrHhzTtTFfUuNnOKkotXxTtla


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

3
Tampaknya saat membebaskan tangan seseorang untuk menuliskan jalur senar, gambarnya akan jatuh. Maka tantangan ini menjadi sangat mudah.
owacoder

@owacoder Anda hanya harus cukup cepat: D
flawr

Jawaban:


11

Retina , 21 byte

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

^$

Cobalah online!

Seperti solusi flawr, ini hanya berulang kali menghapus pasangan huruf besar / kecil yang berdekatan dan kemudian memeriksa apakah hasilnya kosong atau tidak.

Adapun bagaimana seseorang cocok dengan pasangan huruf besar / kecil:

(.)     # 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 byte Oktaf, 82 79 77 byte

Ini mungkin pertama kalinya saya melihat di mana MATLAB sebenarnya lebih pendek dari Oktaf (dengan seluruh byte)!

Jawaban baru di MATLAB:

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

Jawab dalam Oktaf:

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

Disimpan tiga lima byte berkat flawr. ~nnz(c)lebih pendek dari isempty(c), dan 'Aa'dua byte lebih pendek dari [0,32].

Cobalah versi Octave online!


Penjelasan:

c=input('')meminta input dari pengguna. Kami mendefinisikan k='Aa'sebagai array karakter.

while k++<1e5: Sementara loop dimana kedua elemen di kyang bertambah setiap iterasi, Aa, Bb, Ccdan sebagainya. Loop akan berlanjut hingga elemen terbesar 1e5, yang seharusnya cukup tinggi untuk sebagian besar string. Ini dapat ditingkatkan menjadi 9e9tanpa meningkatkan jumlah byte.

Kami akan mengambil strrepfungsi dalam langkah-langkah, mulai dari tengah.

Dengan menggunakan mod(k,64)kita akan mendapatkan yang berikut ketika kita mencapai akhir alfabet (jika kita mengkonversi kkembali ke karakter):

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

Seperti yang Anda lihat, akan ada beberapa simbol di antaranya, tetapi kemudian akan membungkus dan mulai dengan alfabet lagi, tapi sekarang dengan huruf kecil terlebih dahulu. Ini adalah cara yang sangat singkat untuk memeriksa keduanya Aadan aA.

['',65+mod(k,64)]menyatukan nilai numerik dari mod-call, dengan string kosong, mengonversi angka menjadi karakter.

strrepdigunakan untuk menghapus elemen dari string cdan mengembalikannya. Ini akan mencari semua kemunculan kdalam string dan menggantinya dengan string kosong.

Setelah 1e5iterasi kita akan memiliki string kosong atau string tidak kosong. Kami memeriksa apakah ada elemen dalam cmenggunakan nnz(c). Kami kembali not(nnz(c)), jadi 1jika itu kosong, dan 0jika ada karakter yang tersisac


6

Minkolang 0,15 , 30 byte

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

Coba di sini!

Penjelasan

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

Sifat toroidal Minkolang adalah leverage di sini untuk menghilangkan kebutuhan untuk loop luar. Gagasan umum di sini adalah untuk memeriksa apakah dua elemen teratas tumpukan terpisah 32 unit (artinya mereka adalah pasangan huruf besar / huruf kecil), dan jika keduanya, matikan keduanya. Karena ini dilakukan "secara realtime", maka dapat dikatakan, penyatuan pasangan ditangani dengan benar.


5

Haskell, 62 byte

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

Cobalah online

Kredit untuk cacat untukabs dan Laikoni untuk fromEnumpeta .

Fungsi helper %mengambil string yang sudah disederhanakan l, dan menambahkan simbol asebelum menyederhanakan hasilnya. Jika ldimulai dengan karakter terbalik a, mereka membatalkan. Kalau tidak, ahanya ditangguhkan. Perhatikan bahwa tidak diperlukan penyederhanaan lebih lanjut pada tahap ini.

Fungsi utama fmenambahkan dan menyederhanakan setiap karakter secara bergantian melalui a foldr. Kemudian, ia memeriksa apakah hasilnya kosong.

Untuk memeriksa apakah dua karakter bertolak belakang dan harus dibatalkan, lihat apakah nilai ASCII-nya berbeda 32. Setiap elemen diproses fromEnumsebelum diteruskan ke %.


Bagus! Dan terima kasih atas penjelasannya, saya belajar hal-hal baru setiap saat!
flawr

4

05AB1E , 17 byte

DvADu‚øDíìvyK}}õQ

Cobalah online!

Penjelasan

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 byte

Ini hanya implementasi naif yang berulang kali mencoba untuk membatalkan surat adjecent sampai tidak ada perubahan lagi, dan kemudian menentukan hasilnya.

Terima kasih @nimi untuk -12 byte dan @xnor untuk -4 byte lainnya!

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

Cobalah online! atau Verifikasi semua contoh!


f=null.until(\a->r a==a)r.map fromEnumharus menyimpan dua byte.
Laikoni

Saya pikir (\a->r a==a)bisa ((==)=<<r).
xnor

1
Di baris kedua, saya pikir Anda bisa berubah =r lmenjadi l, gagasan yang cukup untuk hanya membuat satu penggantian per kali.
xnor

Terima kasih! Saya mengerti petunjuk kedua, tetapi saya tidak tahu apa yang terjadi dengan =<<, sepertinya sihir XD
flawr

1
@ flawr Lihat tip ini . Itu =<<seperti >>=tetapi dengan argumen bertukar. Ungkapan sering muncul sebagai dalam bentuk yang ((==)=<<r)berarti "tidak berubah di bawah r".
xnor

3

Mathematica, 102 byte

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

Fungsi tanpa nama mengambil string alfabet sebagai input dan kembali Trueatau False.

Inti dari implementasi adalah membuat fungsi yang menghapus pasangan yang membatalkan, seperti "Pp"atau "gG", dari sebuah string. Ekspresi {Join[a=Alphabet[],A=ToUpperCase@a],A~Join~a}menghasilkan sepasang daftar karakter yang terurut, daftar yang pertama {"a","b",...,"Z"}dan yang kedua {"A","B",...,"z"}. Kemudian #<>#2&~MapThread~menghasilkan daftar di mana unsur-unsur yang sesuai dari dua daftar ini telah digabungkan, yaitu {"aA","bB",...,"Zz"},. Ekspresi menyenangkan ""|##&@@kemudian (melalui keajaiban urutan argumen ##) menghasilkan daftar alternatif "" | "aA" | "bB" | ... | "Zz"; akhirnya, StringDelete[...]adalah fungsi yang menghapus semua kemunculan salah satu alternatif tersebut dari string.

Sekarang sudah cukup untuk berulang kali menerapkan fungsi itu ke string input sampai hasilnya tidak berubah, yang dicapai oleh ~FixedPoint~#, dan kemudian menguji apakah hasilnya adalah string kosong ""==.


3

JavaScript (ES6), 73 byte

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

Tidak seperti .NET, JavaScript tidak memiliki cara untuk mematikan sensitivitas huruf besar-kecil di tengah-tengah pertandingan, jadi alih-alih kita harus menemukan semua substring huruf yang diulang huruf besar-kecil, dan kemudian menghapus pasangan karakter yang berdekatan yang tidak cocok, yang pada titik ini harus pasangan huruf besar / kecil.


3

Perl, 28 byte

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

Penjelasan:

Perl memungkinkan seseorang untuk memasukkan ekspresi reguler yang dihasilkan secara dinamis di dalam ekspresi reguler standar.

The .cocok apa-apa.

Ini (??{adalah awal dari regex yang dihasilkan.

The $&variabel akan berisi seluruh cocok string yang sejauh ini, yang dalam hal ini adalah hanya apa pun .cocok.

The ^Operator tidak baik numerik xor atau tali xor, tergantung pada nilai-nilai operan. Dalam hal ini, itu akan menjadi string xor.

Ini ' 'hanya sebuah string yang berisi spasi, yang memiliki nilai ascii (atau unicode!) 32. Ketika sebuah spasi di-xor dengan char di dalam kisaran az atau AZ, itu akan berubah dari huruf besar ke huruf kecil atau visum sebaliknya.

Ini })adalah akhir dari regex yang dihasilkan.

1 while s/whatever// akan berulang kali mencari pola dan menggantinya dengan string kosong.

$_adalah variabel default. Variabel ini adalah perl melakukan hal-hal yang menyenangkan dan menarik ketika Anda tidak menentukan variabel lain. Di sini saya menggunakannya untuk mengembalikan nilai true atau falsy, karena string panjang nol adalah false, dan string panjang bukan nol yang tidak sama "0"adalah benar. Saya juga mengasumsikan bahwa string input awalnya ditempatkan di dalamnya.

Coba di sini


secara teknis, ini mengembalikan kebalikan dari apa yang diminta tantangan (Anda mengembalikan kebenaran ketika seharusnya palsu dan sebaliknya). Untuk memperbaikinya, cukup tambahkan !sebelum final $_. Jika tetap seperti ini, Anda dapat menyimpan 4 byte dengan mengubahnya menjadi s/.(??{$&^' '})//&&redo, +1 byte untuk -pflag. Ini tidak akan berfungsi dalam subrutin seperti yang Anda miliki sekarang karena { code }sebenarnya bukan loop (sehingga &&redotidak akan berfungsi), tetapi -pmenempatkannya di dalam whileloop.
Gabriel Benamy

Anda juga dapat menyimpan byte lain dengan menggantinya ' 'dengan $". Lihatlah ini untuk melihat seperti apa kode itu.
Gabriel Benamy

2

Prolog (SWI) , 151 byte

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).

Butuh waktu lama untuk menjalankan kasus palsu yang lebih panjang karena mundur.

Cobalah online!

Tidak disatukan

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 byte

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

Cobalah online! Atau verifikasi semua kasus uji (butuh beberapa saat).

Penjelasan

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 byte

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


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.