Hampir enam tahun yang lalu, sesama anggota PPCG steenslag memposting tantangan berikut:
Dalam dadu standar (mati) angka-angkanya diatur sehingga wajah yang berlawanan menambah tujuh. Tuliskan program sesingkat mungkin dalam bahasa pilihan Anda yang menghasilkan lemparan acak diikuti oleh 9 tip acak. Tipping adalah seperempat putaran dadu, misalnya jika dadu menghadap ke 5, semua kemungkinan tip adalah 1,3,4 dan 6.
Contoh output yang diinginkan:
1532131356
Jadi, sekarang semua orang telah benar-benar lupa tentang hal itu dan jawaban yang menang telah lama diterima, kami akan menulis sebuah program untuk memvalidasi urutan die tipping yang dihasilkan oleh solusi yang dikirimkan. (Ini masuk akal. Pura-pura saja.)
Tantangan
Anda program atau fungsi yang diberikan berurutan seperti 1532131356
. Validasi bahwa setiap digit berurutan adalah:
- Tidak sama dengan angka sebelumnya
- Tidak sama dengan 7 minus angka sebelumnya
(Anda tidak harus memvalidasi digit pertama.)
Aturan
- Program Anda harus mengembalikan nilai kebenaran jika inputnya valid dan nilai falsey sebaliknya.
- Anda dapat mengasumsikan bahwa input hanya terdiri dari digit 1-6 dan setidaknya sepanjang 1 karakter. Urutan tidak akan memiliki panjang yang tetap seperti di tantangan steenslag.
- Anda dapat mengambil input sebagai string (
"324324"
), array atau struktur data array-seperti ([1,3,5]
) atau sebagai beberapa argumen (yourFunction(1,2,4)
).
Standar I / O dan aturan celah berlaku.
Uji kasus
Sejujurnya
1353531414
3132124215
4142124136
46
4264626313135414154
6
2642156451212623232354621262412315654626212421451351563264123656353126413154124151545145146535351323
5414142
Falsey
Digit berulang
11 3132124225 6423126354214136312144245354241324231415135454535141512135141323542451231236354513265426114231536245 553141454631 14265411
Menentang sisi kematian
16 42123523545426464236231321 61362462636351 62362462636361
sumber
3132124225
mengembalikan5
.n and p*(7-p!=n!=p)
.Python, 44 byte
Sihir bitwise! Ini adalah fungsi anonim yang mengambil daftar bilangan bulat, dan memeriksa bahwa XOR dari setiap dua elemen berturut-turut adalah antara 1 dan 6 inklusif.
Mengapa ini berhasil?
Pertama, XOR selalu antara 0 dan 7 inklusif, karena 7 berada
111
di basis 2, dan angka kami memiliki paling banyak 3 digit biner. Untuk kesetaraan,a^b == 0
jika dan hanya jikaa == b
. Juga, kita memiliki7-a == 7^a
kapan0 ≤ a ≤ 7
, dana^b == 7
jika dan hanya jikaa == 7^b == 7-b
.sumber
05AB1E ,
119 byte-2 byte untuk ide cerdas Osable menggunakan produk.
Cobalah online!
Pendekatan ketiga menggunakan 05AB1E, itu tidak menggunakan perintah berpasangan:
0
jika itu melanggar properti mabuk.Not 0
jika tidak ada yang mencegahnya menjadi mabuk.sumber
Á
. Bagus!¥¹D7-Á+«P
. Ini menghasilkan 0 ketika ada 0 dalam array atau nilai lainnya.R,
39373231 byteCobalah online!
Mengambil input dari stdin. Digunakan
diff
untuk melihat apakah ada dua digit berturut-turut yang sama; lalu bandingkan setiap digit hingga 7 minus angka sebelumnya. PengembalianTRUE
atauFALSE
.Disimpan 5 byte berkat Jarko Dubbeldam, dan terima kasih lain kepada JayCe.
sumber
q
dan kemudian menguji2*x+q-7
alih-alihc(0,x)!=c(7-x,0)
menyimpan beberapa byte. Jikax1 + x2 = 7
demikian2*x1 + diff(x1,x2) = 7
. Memeriksa2*x+q - 7
kemudian secara eksplisit menguji!=0
.05AB1E , 10 byte
Menggunakan pengkodean CP-1252 . Cobalah online!
sumber
Ê
: P Nice!1*[] = []
tapiproduct(1, []) = 1
. Senang mendengarnya.[]
harus 1.)1*
,)1s*
Dan)1P
semua[]
sementara)1sP
adalah 1.[]
memberi kesalahan dan dibuang. Itu sebabnya ia memberi 1. Saya akan mencoba memperbaikinya ketika saya pulang.R,
4944 byteMembaca input dari stdin (dipisahkan oleh spasi) dan output
TRUE/FALSE
. Akan memberikan peringatan jika inputnya panjang tetapi masih berfungsi.Sunting: menyimpan beberapa byte berkat @rturnbull
sumber
all(x)&all(y)
ke dalamall(x,y)
untuk menyimpan beberapa byte. Anda juga dapat beralihrle(x)$l==1
kerle(x)$l-1
, yang kemudian akan mengembalikan satu set semuaFALSE
jikax
valid; kemudian alihkan yang nanti!=
ke==
danall
ke!any
. Ini menghasilkan!any(rle(x<-scan())$l-1,ts(x)==7-lag(ts(x)))
, menghemat total 5 byte. (PS, saya sudah menulis solusi alternatif yang Anda mungkin tertarik.)05AB1E , 15 byte
Cobalah online! atau sebagai Test suite
sumber
JavaScript (ES6),
4340 bytePengembalian
0
/true
.Uji kasus
Tampilkan cuplikan kode
sumber
test()
Perl 6 , 22 byte
Menggunakan regex:
Mengambil input sebagai string. Terinspirasi oleh jawaban Ruby di GB .
Bagaimana itu bekerja:
/ /
: Regex.(.)
: Cocokkan karakter apa saja, dan tangkap sebagai$0
.<{ }>
: Menghasilkan sub-regex secara dinamis untuk dicocokkan pada posisi itu."$0|" ~ (7 - $0)
: Sub-regex yang kami hasilkan adalah yang hanya cocok dengan digit sebelumnya, atau 7 minus digit sebelumnya (mis5|2
.).Dengan demikian keseluruhan regex akan cocok jika menemukan pasangan berturut-turut yang tidak valid di mana saja.
{! }
: Paksa ke boolean (menyebabkan regex dicocokkan dengan$_
), meniadakannya, dan mengubah semuanya menjadi lambda (dengan parameter implisit$_
).Perl 6 , 38 byte
Menggunakan pemrosesan daftar:
Mengambil input sebagai array bilangan bulat.
Bagaimana itu bekerja:
.[1..*] Z $_
: Rapatkan daftar input dengan versi offset-per-satu itu sendiri, untuk menghasilkan daftar 2-tupel digit berturut-turut.[!=] 7 - .[1], |$_
: Untuk masing-masing, periksa apakah(7 - b) != a != b
.all ( )
: Mengembalikan nilai true atau falsy tergantung pada apakah semua iterasi loop dikembalikan Benar.sumber
Python, 38 byte
Fungsi rekursif yang membutuhkan argumen seperti
f(1,2,3)
.Ini menggunakan argumen unpacking untuk mengekstrak angka pertama ke dalam
h
dan sisanya ke dalam tuplet
. Jikat
kosong, output True. Jika tidak, gunakan bit trick Zgarb untuk memeriksa apakah dua die rolls pertama tidak kompatibel. Kemudian, periksa bahwa hasilnya juga berlaku pada panggilan rekursif pada ekor.sumber
Ruby, 34 byte
sumber
#[]
metode string sebagai gantinya:->s{!s[/[16]{2}|[25]{2}|[34]{2}/]}
JavaScript
6143 byteKomentar telah menyebutkan bahwa saya tidak dapat menggunakan fungsi C # linq tanpa menyertakan pernyataan menggunakan, jadi inilah yang persis sama dalam lebih sedikit byte menggunakan standar JS ...
C #,
996765 byteMengambil input sebagai array int
a
Penjelasan:
sumber
0
atau1
bukannyafalse
atautrue
> <> (Ikan) 47 byte
Cukup mudah;
Baris 1: periksa untuk melihat apakah memasukkan nomor, jika tidak ada nomor (EOF) maka kita memiliki kebenaran untuk mencetak cek lain.
Baris 2: hasil cetak.
Baris 3: ubah input menjadi angka (ASCII 0 - dari input), lalu periksa apakah sama dengan input sebelumnya.
Baris 4: periksa apakah input berlawanan dengan die.
sumber
Brain-Flak 128 Bytes
Output 0 untuk falsey, atau -7 untuk truey.
Cobalah secara Online! (Truthy)
Cobalah Online! (Flasey)
Penjelasan (t adalah singkatan dari s dan singkatan dari kedua dari atas):
sumber
MATLAB, 30 byte
sumber
PHP, 63 byte
mengambil input sebagai daftar argumen perintah; keluar dengan
1
(kesalahan) jika input tidak valid,0
(ok) jika valid.Jalankan dengan
-nr
.masukan sebagai argumen string, 65 byte
sumber
PowerShell ,
574441 byte( Coret 44 masih teratur 44 )
Cobalah online!
(OP telah mengklarifikasi bahwa mengambil input sebagai argumen terpisah adalah OK - disimpan 13 byte ... disimpan 3 byte lainnya dengan menghilangkan
$b
)Kami mengulang-ulang input
$args
satu digit pada satu waktu. Setiap digit, kami memverifikasi bahwa$l
ast digit adalah-n
ote
qual ke angka saat$_
, dan bahwa7-$_-$l
beberapa nomor lain dari nol (yang truthy). Hasil-hasil Boolean tersebut dienkapsulasi dalam parens dan dimasukkan ke dalam operan tangan kanan-notin
operator, dengan memeriksanya0
. Dengan kata lain, jika adaFalse
nilai di mana saja di loop,-notin
itu juga akan menjadiFalse
. Boolean itu ditinggalkan di jalur pipa, dan hasilnya tersirat.Panjang karena
$
persyaratan untuk nama variabel, dan bahwa perintah Boolean-ne
-and
bertele-tele di PowerShell. Baiklah.sumber
Memproses,
939290 byteDiubah
||
menjadi|
: 1 byte disimpan berkat @ClaytonRamseyMulai menghitung mundur: 2 byte disimpan berkat @IsmaelMiguel
Mengambil input sebagai array int, output
1
untuk true atau0
false.Tidak disatukan
sumber
return 0
di dalam pernyataan if sementarareturn 1
tidak. Saya tidak melihat bagaimana itu mungkin kecuali Anda memiliki ide lainGolfed it! Yipee! (nobody's going to read these summaries so why not have fun :)
<- Saya membacanya, sambil membandingkan apa yang Anda miliki dengan apa yang Anda miliki.C
4744 bytemengambil string angka (atau array byte yang diakhiri nol)
Penjelasan
F(char*s){
sesuai dengan
int
tipe pengembalian standar tersirat. (menghemat 4 byte)return
pengembalian tanpa syarat karena ini adalah fungsi rekursifmenggunakan evaluasi jalan pintas:
!s[1]||
jika karakter kedua nul return true((*s^s[1])%7&&
jika dua karakter pertama tidak salah secara hukumF(s+1))
periksa sisa string dengan cara yang samaekspresi yang membingungkan
*s
adalah karakter pertamas[1]
adalah yang kedua*s^s[1]
eksklusif-ors mereka bersama-sama jika mereka sama hasilnya adalah 0 jika mereka menambahkan ke 7 hasilnya adalah 7, (jika mereka berbeda dan tidak menambah ke 7 hasilnya adalah antara 1 dan 6 inklusif)begitu
(*s^s[1])%7
juga nol untuk input buruk dan bukan-nol sebaliknya, jadi salah jika 2 karakter ini buruk, dan benar sebaliknyakomentar: karena pemanggilan fungsi ini hanya menggunakan rekursi akhir (hanya pernyataan terakhir adalah panggilan rekursif) pengoptimal dapat menerjemahkan rekursi ke dalam satu lingkaran, ini adalah perasaan senang yang bahagia dan jelas tidak sebanding dengan skor golf apa pun, tetapi dengan kata lain memungkinkan untuk memproses string dengan panjang berapa pun tanpa kehabisan tumpukan.
sumber
!((*s^s[1])%7)
saya kira Anda tidak menginginkannya!
. Nilai nol untuk input buruk akan menjadi falsy, jadi Anda ingin mengembalikan falsy ketika itu buruk.Python, 71 byte
Menggunakan pendekatan rekursif.
Penjelasan:
sumber
Retina , 28 byte
Cobalah online!
Kalau tidak:
Cobalah online!
sumber
MATL , 9 byte
Input adalah array angka yang mewakili digit.
Outputnya adalah array yang tidak kosong, yang benar jika semua entri-nya tidak nol, dan sebaliknya palsu (baca lebih lanjut tentang kriteria MATL untuk kebenaran dan kepalsuan di sini ).
Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan
sumber
movsum
, sudah adaconv2
(yang termasukconv
); lihatY+
danZ+
C # (dengan Linq)
908173716968 BytesPenjelasan:
sumber
C, 81 byte, adalah 85 byte
Input adalah array bilangan bulat A dengan panjang L. Mengembalikan 1 untuk true dan 0 untuk false. Input diperiksa dari ujung ke awal menggunakan panjang input L sebagai indeks array.
sumber
int
opsional di awal, Anda dapat menyimpan 4 byte.int s=1;
dapat dideklarasikan di luar fungsis=1;
untuk 4.Haskell, 37 byte
Contoh penggunaan:
f [1,5,2]
->False
.Rekursi sederhana. Kasus dasar: daftar elemen tunggal, yang mengembalikan
True
. Kasing rekursif: biarkana
danb
menjadi dua elemen pertama dari daftar input danc
sisanya. Semua kondisi berikut harus memegang:a+b/=7
,a/=b
dan panggilan rekursif dengana
menjatuhkan.sumber
JavaScript, 40 byte
Mengambil keuntungan dari fitur JavaScript yang
&&
akan mengembalikan nilai terakhir yang diuraikan (baik istilah palsu atau istilah terakhir).0
diteruskan jika tidak memenuhi persyaratan, dan istilah sebelumnya diteruskan sebaliknya. Angka 9 memastikan bahwa angka itu dimulai dengan nilai yang benar.sumber
Groovy, 61 byte
sumber
Python 2, 58 Bytes
sumber
> <> , 39 byte
Cobalah online!
sumber
Batch, 102 byte
Tidak Disatukan:
sumber