Apakah string ini berfungsi sebagai string?


92

Tulis program yang menggunakan string baris tunggal yang dapat Anda asumsikan hanya akan berisi karakter /\_‾. (Itu maju dan garis miring ke belakang, garis bawah dan overline . Anda dapat menggunakan ~di tempat overline jika Anda perlu karena overline tidak ASCII nyaman.)

Misalnya, satu input yang mungkin adalah:

__/‾‾\/\_/‾

Program Anda perlu menampilkan nilai kebenaran atau kepalsuan tergantung pada apakah tepi kiri string "terhubung", sehingga untuk berbicara, ke tepi kanan string melalui garis-garis karakter. Jadi, jika kerningnya sedikit kurang, akan ada garis hitam pekat (walaupun keriting) dari ujung kiri ke kanan, seperti seutas tali atau benang yang tidak terputus.

Output untuk contoh di atas akan benar karena ujung-ujungnya terhubung:

contoh jalan

Untuk memperjelas koneksi:

  • / menghubungkan di kiri bawah dan kanan atas
  • \ menghubungkan di kiri atas dan kanan bawahnya
  • _ menghubungkan di kiri bawah dan kanan bawahnya
  • (atau ~) menghubungkan di kiri atas dan kanan atas

Juga:

  • Tidak masalah apakah ujung-ujung tali dimulai di bagian atas atau bawah, hanya masalah bahwa mereka terhubung secara horizontal melalui seluruh panjang tali.

  • Anda dapat menganggap string input tidak kosong, dan tentu saja hanya satu baris.

Berikut adalah beberapa contoh lagi diikuti oleh 1 (benar) jika mereka terhubung atau 0 (salah) jika tidak:

__/‾‾\/\_/‾
1

_
1

\
1

/
1

‾
1

___
1

\/
1

/\/
1

/\/\
1

‾‾‾
1

\\
0

‾‾
1

_‾
0

‾_
0

\_____/
1

\/\\/\\___
0

\/\__/‾‾\
1

______/\_____
1

‾‾‾‾‾‾\\_____
0

‾‾‾‾‾‾\______
1

_____/‾‾‾‾‾
1

\___/‾‾‾\___/‾‾‾
1

\_/_\_
0

\_/\_
1

/\/\/\/\/\/\/\/\/\/\/\/
1

____________________
1

‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
1

‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾/
0

‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾\
1

/\‾/\‾___/\_\/__\/\‾‾
0

Kode terpendek adalah pemenangnya.


37
Selamat datang di PPCG! Tantangan pertama yang bagus.
AdmBorkBork

1
Apakah karakter yang ditentukan dalam tantangan Anda adalah satu-satunya karakter yang akan muncul dalam string?
Perwujudan Ketidaktahuan

@EmbodimentofIgnorance Ya, hanya 4.
Game Diskret

30
Tunggu, Anda bisa membuat bahasa dari ini
Delioth

2
@Arnauld Tidak, saya benar-benar berpikir hanya kebenaran untuk terhubung dan palsu untuk tidak terhubung. (Kecuali jika memungkinkan swap adalah normal untuk pertanyaan seperti ini?)
Discrete Games

Jawaban:


34

Jelly , 9 byte

-1 byte terima kasih kepada @EriktheOutgolfer

Harapkan ~bukannya . Mengembalikan atau .01

O*Ɲ:⁽8ƇḂẠ

Cobalah online! , Kamar uji kebenaran , Kamar uji Falsy

Menggunakan rumus ini (tetapi sebaliknya mirip dengan versi 11-byte di bawah):

n=xy15145

Transisi ini valid jika ganjil, atau tidak valid jika genap.nn

Berkomentar

O*Ɲ:⁽8ƇḂẠ     - main link, taking a string          e.g. "\_/"
O             - get ASCII codes                     -->  [92, 95, 47]
 *Ɲ           - exponentiation on all pairs         -->  [92**95, 95**47]
   :⁽8Ƈ       - integer division by 15145           -->  [23964828…8421, 59257069…0485]
       Ḃ      - least significant bit (i.e. parity) -->  [1, 1]
        Ạ     - all values equal to 1?              -->  1

Jelly ,  14 12  11 byte

Mendukung (dan mengharapkan) karakter dalam string input. Mengembalikan atau .01

O*Ɲ%276%7ỊẠ

Cobalah online! , Kamar uji kebenaran , Kamar uji Falsy

Bagaimana?

Diberikan dua karakter berturut-turut kode ASCII dan , kami ingin fungsi yang memeriksa apakah mereka membentuk transisi yang valid.xy

Kami memerlukan operasi non-komutatif, karena hasilnya dapat berubah ketika karakter dibalik. Misalnya, _/valid tetapi /_tidak.

Menggunakan eksponensial, kemungkinan formula 1 adalah:

n=(xymod276)mod7

Transisi ini valid jika , atau tidak valid jika .n1n>1

 chars |    x |    y | (x**y)%276 | %7 | valid
-------+------+------+------------+----+-------
   __  |   95 |   95 |      71    |  1 |  yes
   _/  |   95 |   47 |     119    |  0 |  yes
   _‾  |   95 | 8254 |     265    |  6 |   no
   _\  |   95 |   92 |     265    |  6 |   no
   /_  |   47 |   95 |      47    |  5 |   no
   //  |   47 |   47 |      47    |  5 |   no
   /‾  |   47 | 8254 |       1    |  1 |  yes
   /\  |   47 |   92 |       1    |  1 |  yes
   ‾_  | 8254 |   95 |     136    |  3 |   no
   ‾/  | 8254 |   47 |      88    |  4 |   no
   ‾‾  | 8254 | 8254 |     196    |  0 |  yes
   ‾\  | 8254 |   92 |     196    |  0 |  yes
   \_  |   92 |   95 |      92    |  1 |  yes
   \/  |   92 |   47 |      92    |  1 |  yes
   \‾  |   92 | 8254 |     184    |  2 |   no
   \\  |   92 |   92 |     184    |  2 |   no

1. Ditemukan dengan pencarian brute-force di Node.js (menggunakan BigInts)

Berkomentar

O*Ɲ%276%7ỊẠ   - main link, taking a string          e.g. "\_/"
O             - get ASCII codes                     -->  [92, 95, 47]
 *Ɲ           - exponentiation on all pairs         -->  [92**95, 95**47]
   %276       - modulo 276                          -->  [92, 119]
       %7     - modulo 7                            -->  [1, 0]
         Ị    - ≤1?                                 -->  [1, 1]
          Ạ   - all values equal to 1?              -->  1

2
metode tabel lookup telah memenangkan banyak masalah
qwr

9 byte : ⁽"Osama dengan 9580.
Erik the Outgolfer

@EriktheOutgolfer Terima kasih. :) Mungkin skrip yang disediakan dalam tip ini harus diperbarui untuk mendukung format ini (bila relevan).
Arnauld

1
@Arnauld Sebenarnya, Jonathan Allan telah membuat ini .
Erik the Outgolfer

16

Ruby -n , 30 byte

p !/[_\\][\\‾]|[\/‾][_\/]/

Cobalah online!

Mengurangi semua urutan pemecah string menjadi dua case menggunakan kelas karakter Regex.


5
Anda dapat menyimpan 4 byte dengan menggunakan ~alih-alih . Saya tidak yakin apakah itu penting untuk tantangan ini, karena jumlah karakternya sama.
iamnotmaynard

Apakah Anda perlu melarikan diri /meskipun mereka dalam kurung?
Solomon Ucko

14

JavaScript (ES6), 45 byte

Cara yang naif.

s=>!/\/\/|\\\\|_~|~_|~\/|_\\|\/_|\\~/.test(s)

Cobalah online!


1
Jadi ini memeriksa semua pasangan yang tidak valid, memastikan mereka tidak ada di string? Pintar.
Permainan Diskret

@ DiscreteGames Ya, tepatnya. (Kecuali saya lupa 2 dari mereka. Sekarang diperbaiki.)
Arnauld

35 bytes: s=>!/[~\/][\/_]|[_\\][\\~]/.test(s). Ia memeriksa apakah \/atau ~berakhir pada \/atau _. Dan kemudian, memeriksa apakah \\atau _berakhir pada \\atau ~.
Ismael Miguel

@IsmaelMiguel Ini mungkin diposting sebagai jawaban yang terpisah, tapi saya lebih baik membiarkan ini tidak berubah untuk referensi, karena ia menunjukkan ekspresi reguler paling sederhana (seperti dalam 'paling rumit') menyelesaikan masalah.
Arnauld

Anda dapat mempostingnya sebagai alternatif, tetapi bukan jawaban yang pasti.
Ismael Miguel

10

R , 89 87 81 78 byte

-2 byte terima kasih kepada @Giuseppe

-6 byte terima kasih kepada @Nick Kennedy

Bytes -3 mengganti 1:length(y)dengan seq(a=y), di mana amerupakan kependekanalong.with

y=utf8ToInt(scan(,''));all(!diff(cumprod(c(1,y>93)*2-1)[seq(a=y)]*(y%%2*2-1)))

menggunakan \ / _ ~. Ini mungkin tidak sesingkat solusi berbasis regex, tapi saya naksir melakukan sesuatu yang sedikit berbeda dengan orang lain.

utf8ToInt('\\/_~')
# [1]  92  47  95 126

Karakter yang kurang dari 93 mengubah status dari atas ke bawah (atau sebaliknya), dan dengan demikian berperilaku -1sementara yang lain tidak melakukan apa pun dan berperilaku sebagai 1, cumprod melacak negara sehubungan dengan permulaan. Angka genap berada di bagian atas (diwakili dengan -1), angka ganjil berada dalam kondisi turun ( 1). Jika string tidak terputus negara dilacak dikalikan dengan posisi naik / turun, tidak boleh berubah, itu akan selalu menjadi kondisi awal ( -1, atau 1)

Cobalah online


2
ini cukup pintar, dan cara R unik dalam melakukan sesuatu! Saya percaya Anda dapat menghapus ()sekitar y%%2untuk menghemat 2 byte, karena operator khusus %(any)%memiliki prioritas yang agak tinggi.
Giuseppe

3
Bagaimana dengan tio untuk 83 byte? Mengambil keuntungan dari paksaan implisit untuk logis oleh!
Nick Kennedy

9

Python , 46 byte

f=lambda s:s==''or s[:2]in"__/~~\/\_"*f(s[1:])

Cobalah online!

Mengonfirmasi bahwa setiap pasangan karakter yang berdekatan terhubung dengan memeriksa bahwa mereka muncul secara berurutan __/~~\/\_. String ini dapat dilihat sebagai De_Bruijn_afterence pada kali lipat posisi tinggi / rendah.23=8

Saya mencoba metode lain yang tidak terlalu membosankan untuk memeriksa pasangan karakter, tetapi mereka semua lebih lama melakukan hardcoding pada semua pasangan resmi seperti ini.



6

Chip -z , 17 byte

FZ!C~aS
A}^]--^~t

Cobalah online! (TIO termasuk -vuntuk membuatnya lebih mudah untuk memahami output.)

Harapkan _/~\set. Mengembalikan salah \x00(falsy) atau \x01(benar).

Strategi untuk jawaban saya menggunakan informasi berikut:

Symbol  Binary
   _    0101 1111
   /    0010 1111
   ~    0111 1110
   \    0101 1100
          ^   ^ ^
        HGFE DCBA

A: Posisi bit ini terjadi 1ketika sisi kiri simbol rendah, dan 0ketika tinggi
F: Posisi bit ini terjadi 0ketika sisi kanan simbol rendah, dan 1ketika tinggi
C: Posisi bit ini terjadi pada Selalu menjadi1

Dengan menggunakan informasi ini, saya hanya perlu memeriksa bahwa Fmasing-masing karakter cocok dengan not Ayang berikutnya. Sebuah xorgerbang adalah cara yang nyaman untuk mencapai hal ini.

Kode berikut melakukan ini, tetapi memberikan output untuk setiap pasangan (ditambah tambahan 1di awal) (7 byte):

FZ!
A}a

Kami ingin berhenti pada kegagalan pertama, dan juga mencetak apakah kami telah berhenti di dalam string, atau di terminator nol (kami juga menambahkan -zuntuk memberi kami terminator nol). Kita dapat menggunakan not Cuntuk menandakan di mana kita berhenti, dan itu memberi kita program ini (13 byte):

FZ!C~a
A}^]~t

Tetapi kita masih memiliki "nol nol terkemuka" (mis. \_/\Memberi 00 00 00 00 01), jadi ini diubah menjadi jawaban yang diberikan di atas.


Bagus, saya perhatikan pola ini tetapi tidak tahu bahasa yang baik untuk mengeksploitasinya.
histokrat

6

05AB1E , 29 14 9 byte

ÇümŽb‘÷ÈP

Port dari jawaban Jelly @Arnauld , jadi pastikan untuk menghapusnya juga!

Masukan dengan .

Cobalah secara online atau verifikasi semua kasus uji .


Jawaban 29 byte asli :

„_~SD2×s:Çü-т+•6_üê{↕ƵΔвåO_

Masukan dengan ~alih - alih .

Itu terdengar lebih pendek di kepalaku .. Akan mencoba untuk golf turun dari sini.

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan: "

_~S                          # Push the characters ["_","~"]
    D2×                       # Duplicate it, and increase each to size 2: ["__","~~"]
       s:                     # Swap and replace all "__" with "_" and all "~~" with "~"
                              #  in the (implicit) input-string
         Ç                    # Convert the remaining characters to unicode values
          ü-                  # Calculate the difference between each pair
            т+                # Add 100 to each
              6_üê{↕       # Push compressed integer 1781179816800959
                       ƵΔ     # Push compressed integer 180
                         в    # Convert the larger integer to Base-180 as list: 
                              #  [52,66,69,100,103,131,179]
                          å   # Check for each if it's in the difference-list
                              # (1 if present; 0 if not)
                           O  # Sum the truthy values
                            _ # Check if this sum is exactly 0 (1 if 0; 0 otherwise)
                              # (and output this result implicitly)

Lihat tip tambang 05AB1E ini (bagian Bagaimana membuat bilangan bulat besar? Dan Bagaimana mengompresi daftar bilangan bulat? ) Untuk memahami mengapa •6_üê{↕ada 1781179816800959, ƵΔapakah 180dan •6_üê{↕ƵΔвsekarang [52,66,69,100,103,131,179].

Penjelasan tambahan:

Ada 16 ( ) kemungkinan pasangan karakter yang harus kami verifikasi. Jika kita mengonversi setiap karakter ke nilai unicode-nya, dan menghitung perbedaannya, kita akan mendapatkan perbedaan-perbedaan ini . Karena daftar bilangan bulat terkompresi di 05AB1E harus memiliki bilangan bulat positif saja, saya menambahkan 100 untuk masing-masing . Pasangan tidak valid dan nilai-nilai yang sesuai mereka kemudian: ; , , , , , , , Yang mengapa saya memiliki daftar bilangan bulat terkompresi dalam kode yang mengandung nilai-nilai ini. Karena dan hanya akan menyukai dan menghasilkan (atau setelah saya menambahkan 100), saya pertama kali menghapus duplikat yang berdekatan dari dan24["/_", 52]["\~", 66]["_~", 69]["//", 100]["\\", 100]["_\", 103]["~_", 131]["~/", 179]
__~~//\\0100~_ pada input-string, sebelum menghitung dan memverifikasi perbedaan-pasangan.


1
Sekarang 9 byte .
Arnauld

@Arnauld Oh bagus!
Kevin Cruijssen

Penjelasan itu akan berfungsi sebagai string.
connectyourcharger

@connectyourcharger Apa maksud Anda?
Kevin Cruijssen

6

Python 3 , 79 70 63 byte

Disimpan 16 byte berkat Arnauld dan Jo King, terima kasih!

p=lambda s:len(s)<2or((ord(s[-2])%13>5)^ord(s[-1])%2)&p(s[:-1])

Cobalah online!

Python 3 , 67 60 byte dengan ~ bukannya ‾

p=lambda s:len(s)<2or(~(ord(s[-2])//7^ord(s[-1]))&p(s[:-1]))

Cobalah online!


2
Jawaban pertama yang bagus! Anda dapat menghemat 6 byte dengan menghapus beberapa ruang putih. (Anda mungkin ingin menambahkan tautan TIO, BTW.)
Arnauld

1
Terima kasih! Saya menikmati belajar semua trik ini
Joachim Worthington

4

Python 3, 126 byte

lambda s,d={'‾':'\‾','_':'/_','/':'\‾','\\':'/_'}:len(s)<2or all([s[i+1] in d[s[i]]for i in range(len(s)-1)if s[i]in d])

4

Haskell , 70 byte

Varian ini menggunakan ~alih-alih overline. Dibutuhkan semua delapan pasangan yang valid dan memeriksa apakah string hanya berisi yang:

f(a:b:x)=[a,b]`elem`words"__ _/ /~ ~~ ~\\ \\_ \\/ /\\"&&f(b:x)
f _=1>0

Cobalah online!

Tidak Disatukan:

validate :: String -> Bool
validate xs = all valid $ zip xs (tail xs)
  where
    valid (a,b) = [a,b] `elem` starts
    starts      = words "__ _/ /~ ~~ ~\\ \\_ \\/ /\\"

4

Perl 6 , 32 byte

{!/< \\\ \~ ~/ // _~ ~_ _\ /_>/}

Cobalah online!

Solusi regex yang hanya memeriksa bahwa string tidak mengandung urutan yang tidak valid.

Penjelasan:

{                              }   # Anonymous code block
  /<                         >/    # Find the longest sequence from
     \\\                           # \\
         \~                        # \‾
            ~/                     # ‾/
               //                  # //
                  _~               # _‾
                     ~_            # ‾_
                        _\         # _\
                           /_      # /_
 !                                 # And logically negate the match

4

R , 43 karakter, 47 byte

Itu sama dengan regex yang digunakan jawaban lain, tetapi disesuaikan untuk R.

!grepl('[/‾][/_]|[\\\\_][\\\\‾]',scan(,''))

Cobalah online!

Dan xkcd wajib .


1
Anda dapat menggunakan ~di tempat untuk mendapatkan 43 byte, 43 chars.
Giuseppe

2
Benar, tetapi lebih menyenangkan dengan overbar. :)
CT Hall

4

Keempat (gforth) , 100 98 byte

: x = swap '~ = + ;
: f 1 tuck ?do over i + >r i 1- c@ r> c@ dup 92 x swap dup 47 x <> + loop 0> ;

Cobalah online!

Penjelasan

Telusuri string dan tentukan apakah setiap karakter dimulai pada posisi yang sama (atas atau bawah) seperti yang sebelum berakhir. Kurangi 1 dari penghitung jika tidak cocok. Pada akhirnya, jika penghitung telah berubah, maka string tersebut bukan string.

Posisi akhir tinggi jika char adalah /(47) atau ~(126). Kalau tidak rendah

Posisi Mulai tinggi jika karakter adalah \(92) atau ~(126). Kalau tidak rendah

Penjelasan Kode

\ x is basically just extracting some common logic out into a function to save a few bytes
\ it checks if the first number is equal to the second number
\ or the third number is equal to 126   
: x                \ start a new word definition
  = swap           \ check if the first two numbers are equal then swap with the third
  '~ =             \ checks if the third number is equal to 126
  +                \ adds results together (cheaper version of or)
;                  \ end the word definition

: f                \ start a new word definition
  1 tuck           \ set up parameters for a loop (and create a bool/counter)
  ?do              \ start counted loop from 1 to string-length -1, 
                   \ ?do will skip if loop start and end are the same
    over i +       \ copy the string address and add the loop index to get the char address
    >r i           \ place char address on return stack and place a copy back on the stack
    1- c@          \ subtract 1 to get previous char address and grab ascii from memory
    r> c@          \ move char address back from return stack, then grab from memory
    dup 92 x       \ get the "output" position of the prev character
    swap dup 47 x  \ get the input position of the current character
    <> +           \ check if they aren't equal and add the result to the counter
                   \ the counter won't change if they're equal
  loop             \ end the loop
  0>               \ check if counter is less than 1 (any of the "links" was not valid)
;                  \ end word definition

3

Python 3 , 80 78 byte

Saya tidak benar-benar melakukan banyak golf kode python tapi saya pikir saya bisa mencobanya

  • -2 byte: menyadari tidak (any ()) sama dengan semua (tidak ()) dan bisa memindahkan tidak ke dalam r-string
def f(x):*l,=map(r'_/\~'.find,x);return 1-any((i^j//2)%2for i,j in zip(l,l[1:]))

Cobalah online!

Python 3.8 (pra-rilis) , 71 byte

Saya ingin mencoba :=tugas ekspresi baru

lambda x:all((i^j//2)%2for i,j in zip(l:=[*map(r'\~_/'.find,x)],l[1:]))

Cobalah online!


3

Jelly ,  13 12  11 byte

O*Ɲ%⁽wḃ%5ỊẠ

Tautan monadik yang menerima daftar karakter, menggunakan opsi ~tempat .

Cobalah online! Atau lihat test-suite (... tempat saya memesan ulang 8 falsey di akhir)

Formula ini ditemukan dengan mengotak-atik sekitar dengan tangan: p (seperti yang di bawah)

Untuk yang ini saya juga semua 16 pasang ordinals karakter diperlakukan sebagai eksponensial dan mencari modulo besar yang akan masuk ke dalam tiga byte diikuti oleh modulo satu-byte (1,2,3,4,5,6,7,8 , 9,10.16.256) yang mempartisi 16 sehingga semua hasil yang dapat diterima adalah 1 atau 0 ("tidak signifikan") karena saya tahu lebih pendek daripada <5, dalam solusi saya sebelumnya, yang mencari semua hasil yang dapat diterima kurang dari semua yang tidak dapat diterima.

O*Ɲ%⁽wḃ%5ỊẠ - Link: list of characters
O           - ordinals
  Ɲ         - for each pair of neighbours:
 *          -   exponentiate
    ⁽wḃ     - 30982
   %        - modulo (vectorises)
        5   - five
       %    - modulo (vectorises)
         Ị  - insignificant? (abs(x) <=1) (vectorises)
          Ạ - all truthy?

Kemungkinan karakter tetangga dan evaluasi internalnya:

(Ɲ)         (O)            (*%⁽wḃ)        (%5)      (Ị)
pair   a,b=ordinals   c=exp(a,b)%30982   d=c%5   abs(d)<=1
__       95,  95         28471             1         1
_/       95,  47         29591             1         1
/~       47, 126         19335             0         1
/\       47,  92          9755             0         1
~~      126, 126         28000             0         1
~\      126,  92         26740             0         1
\_       92,  95          9220             0         1
\/       92,  47         13280             0         1
~_      126,  95          3024             4         0
~/      126,  47         12698             3         0
\~       92, 126         27084             4         0
\\       92,  92         17088             3         0
_~       95, 126         28169             4         0
_\       95,  92          4993             3         0
/_       47,  95         22767             2         0
//       47,  47          7857             2         0

Sebelumnya @ 12:

O*Ɲ%⁽?K%⁴<8Ạ

Cobalah online!


Sebelumnya @ 13:

O%7ḅ6$Ɲ%⁵%8ỊẠ

Cobalah online!


Untuk beberapa alasan, saya berpikir bahwa sedang menguji abs(x)<1bukan abs(x)≤1. Ini menawarkan beberapa peluang lagi. :) (Saya terjebak pada 11 byte juga untuk saat ini.)
Arnauld

Saya menemukan itu sangat berguna sangat sering.
Jonathan Allan


3

Excel, 150 byte

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"_\",),"_‾",),"‾_",),"‾/",),"/_",),"//",),"\‾",),"\\",)=A1

Menghapus pasangan yang tidak valid, lalu kembali truejika ini menghasilkan string asli.


3

Haskell, 42 byte

g=tail>>=zip
h=all(`elem`g"__/~~\\/\\_").g

solusi ini digunakan ~, dan fungsi untuk memanggil adalah h (yaitu, h stringmemberikan jawabannya)

Solusinya menggunakan fungsi g yang diberi daftar, mengembalikan semua tupel nilai yang berdekatan pada daftar.

Kemudian kami menggunakan g untuk menghasilkan daftar tetangga yang diizinkan (dalam g"__/~~\\/\\_") dan juga daftar semua pasangan tetangga dalam daftar input. Kemudian kami memeriksa bahwa setiap pasangan tetangga adalah pasangan yang diperbolehkan.


3

C (gcc) , 41 36 byte

f(char*_){_=!_[1]||*_/32+*++_&f(_);}

Cobalah online!

-5 dihilangkan &1mulai dari ide dari Peter Cordes ; operator yang diubah (diutamakan) untuk menghapus tanda kurung


Menggunakan ~. Periksa bit pertama dan keenam dari representasi biner dua karakter pertama:

_ 1011111
\ 1011100
/  101111
~ 1111110
   ^    ^

dan melintasi string secara rekursif.

(*_ / 32) & 1hanya berlaku untuk karakter yang ujungnya tinggi, sedangkan *_ & 1yang benar hanya untuk karakter yang mulai rendah. (x&1) ^ (y&1) == (x+y)&1. XOR adalah add-without-carry, dan carry tidak mengganggu bit terendah. Itu 1berasal dari nilai f(_)kembali, jika sisa string itu berserabut.


Bergeser kanan dengan 5 meninggalkan bit ke-6 di bagian bawah. Jadi Anda memeriksa bit 0 dan 5, atau bit pertama dan keenam. (Ini adalah trik yang sangat bagus, BTW, bagus sekali. c&32Ini berlaku untuk karakter yang memiliki tinggi, sedangkan c&1hanya berlaku untuk karakter yang mulai rendah.)
Peter Cordes

Saya tahu aturan hanya mengharuskannya untuk bekerja pada setidaknya satu implementasi, tetapi masih layak menunjukkan *_ ^ *++_perilaku yang tidak terdefinisi: ^bukan titik urutan, jadi tidak ada urutan-sebelum hubungan menjamin mereka mendapatkan karakter yang berbeda. Tentu saja itu juga kehilangan a return, jadi itu hanya bekerja dengan di gcc -O0mana fungsi tubuh adalah ekspresi-pernyataan.
Peter Cordes

Ups, Anda benar tentang bit. Terima kasih telah menangkap itu
attinat

1
Melakukan &1dua kali berlebihan. (x^y)&1 == (x&1) ^ (y&1). Tetapi mengingat prioritas operator C di mana &memiliki prioritas lebih tinggi daripada ^(tidak seperti operator aritmatika di mana + dan - memiliki prioritas yang sama), kita perlu menambahkan ()2 byte untuk menghapus &12 byte, karena (x&1) ^ ytidak setara. Tetapi mungkin menggunakan parens membuka peluang untuk penghematan lainnya. Untungnya bukan masalah untuk versi kode mesin x86 ini, di mana manipulasi bit sangat kompak ...
Peter Cordes

Selesai jawaban kode mesin x86 saya , 13 byte menggunakan algoritma ini.
Peter Cordes

2

Bash, 30 byte

grep -E '//|\\\\|_~|~_|~/|_\\|/_|\\~'

Inputnya adalah STDIN. Kode keluar adalah 1 jika valid, 0 jika tidak valid.


1

SNOBOL4 (CSNOBOL4) , 58 byte

	INPUT '/_' | '_\' | '\\' | '//' | '~/' | '\~' @OUTPUT
END

Cobalah online!

Tidak menghasilkan apa pun untuk kebenaran dan bilangan bulat positif (menunjukkan posisi jeda pertama dalam string) untuk falsy.


1

Arang , 32 18 byte

⌊⭆θ∨¬κ⁼№_/ι№\_§θ⊖κ

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

  θ                 Input string
 ⭆                  Map over characters and convert to string
     κ              Current index
    ¬               Logical Not (i.e. is zero)
   ∨                Logical Or
          ι         Current character
       №            Count (i.e. contained in)
        _/          Literal _/ (i.e. begins at bottom)
      ⁼             Equals
               θ    Input string
              §     Indexed by
                 κ  Current index
                ⊖   Decremented (i.e. previous character)
           №        Count (i.e. contained in)
            \_      Literal \_ (i.e. ended at bottom)
⌊                   Minimum (i.e. if all true)
                    Implicitly print

1

kode mesin x86, 13 byte.

(Atau 11 byte tanpa menangani string karakter tunggal yang bersifat string sepele.)

Menggunakan pemeriksaan posisi bit dari jawaban C @ attinat

Kode mesin yang sama berfungsi dalam mode 16, 32, dan 64-bit. Sumbernya adalah NASM untuk mode 64-bit.

nasm -felf64 -l/dev/stdout  listing
    17   addr                  global string_connected
    18           code          string_connected:
    19           bytes         ;;; input: char *RSI, transitions to check=RCX
    20                         ;;; output: AL=non-zero => connected.  AL=zero disconnected
    21                         .loop:                      ; do {
    22 00000000 AC                 lodsb                   ;   al = *p++
    23 00000001 E309               jrcxz  .early_exit        ; transitions=0 special case.  Checking before the loop would require extra code to set AL.
    24 00000003 C0E805             shr    al, 5
    25 00000006 3206               xor    al, [rsi]          ; compare with next char
    26 00000008 2401               and    al, 1
    27 0000000A E0F4               loopne .loop            ; }while(--rcx && al&1);
    28                         .early_exit:
    29 0000000C C3                 ret

Callable from C seperti unsigned char string_connected(int dummy_rdi, const char *s, int dummy_rdx, size_t transitions);halnya konvensi pemanggilan System V x86-64. Bukan boolkarena transisi = 0 case mengembalikan kode ASCII, bukan 1.

RCX = len = strlen(s) - 1. yaitu jumlah karakter-batas = transisi untuk memeriksa dalam string panjang-eksplisit.

Untuk transitions > 0, mengembalikan 0 (ketidakcocokan) atau 1 (terhubung) dan membiarkan ZF diatur sesuai. Untuk transitions == 0, mengembalikan byte tunggal dari string (yang bukan nol dan dengan demikian juga benar). Jika bukan karena kasus khusus itu, kita bisa drop JRCXZ keluar awal. Itu di dalam loop hanya karena AL tidak nol di sana.


Logika posisi bit didasarkan pada pengamatan bahwa bit 0 dari kode ASCII memberi tahu Anda ketinggian mulai, dan bit 5 memberi tahu Anda ketinggian akhir.

;;;  _ 1011111
;;;  \ 1011100
;;;  /  101111
;;;  ~ 1111110
;;;     ^    ^

    ; end condition (c>>5) & 1 =>  0 = low
    ; start cond: c&1 => 0 = high
    ; (prev>>5)&1 == curr&1  means we have a discontinuity
    ; ((prev>>5) ^ curr) & 1 == 0  means we have a discontinuity

Uji harness (dimodifikasi dari tautan TIO attinat, waspadai titik-urutan C UB dalam fungsi referensi C itu). Cobalah online! . Fungsi ini benar untuk semua 30 kasus. (Termasuk kasus karakter tunggal di mana nilai kembali tidak cocok: keduanya benar dengan nilai bukan nol yang berbeda dalam kasus itu.)


1

Excel, 79 byte

Sel A1sebagai input

=1---SUMPRODUCT(--ISNUMBER(FIND({"//","/_","\~","\\","~/","~_","_\","_~"},A1)))


0

C ++, 132 110 byte

-22 byte berkat ASCII saja

int f(char*s){int t[128];t[95]=0;t[47]=1;t[92]=2;t[126]=3;for(;*++s;)if(t[s[-1]]%2^t[*s]/2)return 0;return 1;}

Menggunakan bitmask untuk mengetahui apakah awal dan akhir naik atau turun


hmm tidak akan memindahkan versi C menjadi lebih golf: P
ASCII-satunya




0

Regex, 34 byte

Saya tidak bisa menemukan aturan dalam menggunakan Regex sebagai bahasa. Tolong beri tahu saya jika saya perlu menyesuaikan ini.

^(‾+|(‾*\\)?(_*\/‾*\\)*_*(\/‾*)?)$

Cobalah di sini: https://regex101.com/r/s9kyPm/1/tests


2
Itu 34 byte, bukan 24, kan?
Sara J

Ya, benar-benar 42 byte, tetapi Anda dapat mengubah ke~
Jo King

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.