"Angka Giza", juga dikenal dengan sebutan Nomor Timmy adalah angka di mana angka-angka tersebut mewakili piramida ( A134810 ). Misalnya, "12321" adalah angka giza karena dapat divisualisasikan seperti ini:
3
2 2
1 1
Namun, sesuatu seperti "123321" bukan angka Giza karena ada dua digit di bagian atas piramida
33
2 2
1 1
Dengan kata lain, angka adalah angka Giza jika semua kondisi berikut dipenuhi:
Ini memiliki angka ganjil, dan digit tengah adalah yang terbesar
Ini palindromic (baca sama maju atau mundur), dan
Bagian pertama dari digit benar-benar meningkat satu per satu. (Karena itu harus palindromik, ini berarti paruh kedua digit harus dikurangi secara ketat oleh satu)
Anda harus menulis program lengkap atau fungsi yang mengambil bilangan bulat positif sebagai input, dan menentukan apakah itu nomor Giza atau tidak. Anda dapat mengambil input sebagai string atau sebagai angka. Jika adalah sejumlah Giza, output nilai truthy . Jika tidak, nilai palsu.
Ada total 45 angka Giza, jadi salah satu dari input ini harus menghasilkan nilai yang benar:
1
2
3
4
5
6
7
8
9
121
232
343
454
565
676
787
898
12321
23432
34543
45654
56765
67876
78987
1234321
2345432
3456543
4567654
5678765
6789876
123454321
234565432
345676543
456787654
567898765
12345654321
23456765432
34567876543
45678987654
1234567654321
2345678765432
3456789876543
123456787654321
234567898765432
12345678987654321
Input lainnya harus memberikan nilai palsu. Tentu saja, Anda tidak harus menangani input yang tidak valid, seperti angka non-positif, non-integer, atau non-angka.
Seperti biasa, ini adalah kode-golf , sehingga celah standar dilarang, dan jawaban terpendek dalam byte menang!
sumber
Jawaban:
Python 2,
484746 byteUji di Ideone .
Bagaimana itu bekerja
Dalam Python, perbandingan dirantai mengembalikan Benar jika dan hanya jika semua perbandingan individu melakukan hal yang sama. Dalam kasus khusus ini, lambda kami mengembalikan True jika dan hanya jika semua kondisi berikut ini terpenuhi.
s[~len(s)/2:]in'987654321'
Untuk string s dengan panjang 2n + 1 ,
~len(s)/2
mengembalikan ~ (2n + 1) / 2 = - (2n + 2) / 2 = - (n +1) , jadis[~len(s)/2:]
menghasilkan n paling tepat 1 karakter dari s .Demikian pula, untuk string s dengan panjang 2n ,
~len(s)/2
menghasilkan ~ (2n) / 2 = - (2n + 1) / 2 = - (n + 1) (divisi integer selalu membulatkan ke -∞ , jadis[~len(s)/2:]
sekali lagi menghasilkan n paling kanan 1 karakter sPerbandingan mengembalikan True jika dan hanya jika karakter paling kanan n + 1 membentuk substring
987654321
.Perhatikan bahwa jika mereka dan s memiliki karakter 2n , s tidak dapat menjadi palindrome; yang n th dan (n + 1) th karakter dari kanan akan berbeda, dan yang terakhir adalah n th karakter dari kiri.
'987654321'>s
Ini membandingkan string secara leksikografis. Karena 9 adalah satu-satunya nomor Giza yang dimulai dengan 9 , semua nomor Giza memenuhi perbandingan ini.
Perhatikan bahwa membandingkan string ini tidak menjadi bagian dari masalah keputusan kami;
>s
hanya tiga karakter lebih pendek dariand s
.s==s[::-1]
Ini mengembalikan True jika dan hanya jika s adalah palindrome.
sumber
Perl,
39374239 + 1 = 40 byteDengan menggunakan metode baru, saya berhasil mengurangi sejumlah besar byte. Jalankan dengan
-n
bendera. Menerima input berulang kali saat runtime, mencetak 0 atau 1 yang sesuai.Saya harus menambahkan 5 byte karena saya sadar tanpa itu, kode berfungsi untuk input seperti 1234567900987654321, yang bukan nomor Giza. Karena angka Giza tidak pernah mengandung angka 0 (dan semua positif palsu karena keperluan akan mengandung angka 0), 5 byte ini bertanggung jawab untuk itu.
Penjelasan:
Tujuan dari substitusi pengganti adalah untuk membangun string 1s yang panjangnya setengah panjang input, dibulatkan ke atas. Dengan demikian, input
12321
akan menghasilkan string111
, yang kemudian akan dikuadratkan (penjelasan di bawah). Input dengan panjang genap akan menghasilkan string yang terlalu kecil untuk memastikan regex akhir berhasil.Alasan kode ini bekerja adalah karena hal berikut:
Kita dapat dengan jelas melihat bahwa angka 1 dalam RHS sama dengan 1/2 lebih dari setengah ukuran LHS. (1 lagi jika kita potong). Selain itu:
567898765 - 123454321 = 444444444, yang hanya 4 berulang. Jadi ketika kita mengurangi kuadrat dari nomor kita, jika kita mendapatkan repdigit, nomor asli kita adalah nomor Giza.
Kode lama dan metode lama (58 + 1 = 59 byte)
Disimpan 1 byte berkat @Dada
Jalankan dengan
-n
bendera, gunakan pipa teksecho
Menghitung angka giza unik yang ditentukan oleh panjang dan bilangan bulat terkemuka, dan melihat apakah cocok dengan input.
Jalankan sebagai
echo -n "123454321" | perl -M5.010 -n giza.pl
Pengembalian1
jika nomor Giza, nol sebaliknya.sumber
Jelly ,
1076 byteMenghasilkan semua 45 nomor nomor Giza, lalu menguji keanggotaan.
Cobalah online! atau lihat nomor yang dihasilkan .
Bagaimana itu bekerja
sumber
JavaScript (ES6),
46454241 byteMengambil input sebagai string dan mengembalikan string satu digit untuk yang benar,
0
untuk yang palsu.Ide dasarnya adalah memeriksa beberapa hal:
sumber
Java 7,
128 119105 byteTidak ada lagi string! Jadi, sekarang saya mulai dengan menghasilkan
111...
sejumlah panjang yang sama dengan input (a
), dan satu lebih pendek ke kotak (b
). Kemudian Anda dapat mengurangib*b
dari input dan memeriksa pembagian dengana
.c
hanya ada di sana untuk memeriksa ganjil / genap, bayar tidak keberatan> _>Berputar:
Metode Lama, 119 byte
Berjalan melalui array, memeriksa perbedaan 1 (atau -1, tergantung pada bagian mana) di antara setiap digit. Kemudian hanya memeriksa untuk melihat panjangnya yang aneh.
Berputar:
sumber
char[]
dihitung sebagai string di sini, jadi saya akan mengatakan itu valid.05AB1E ,
98 byteTruthy is 1 , falsy adalah 0 .
Menggunakan pengkodean CP-1252 . Cobalah online!
sumber
2ä¬û¹Q
akan berhasil juga dan menghemat dua byte.Python 2,
77, 76, 64, 63 byteSolusi rekursif sederhana. Cek untuk melihat apakah digit pertama dan terakhir sama satu sama lain dan digit kedua minus satu. Kemudian periksa apakah tengahnya juga nomor Giza. Mengembalikan nilai true setelah turun ke satu digit.
Satu byte disimpan berkat @Rod, satu ton byte yang disimpan berkat DLosc dan ETHProductions!
sumber
len(s)==1
dengan1==len(s)
untuk menghemat 1 byte pada ruang, juga,and
s dapat diganti dengan*
untuk menyimpan 3 byte1or
berfungsi juga. (Selama itu bukan0
sebelumnya -o
maka Python berpikir itu adalah angka oktal.)and
dengan*
ketika diperlukan hubungan arus pendek, karena ini merupakan fungsi rekursif. Yang pertamaand
harus diganti, tetapi membutuhkan dua set tanda kurung, yang meniadakan penghematan. (cc: @Rod)int()
sekitars[0]
atau 2) gunakans[0]==`int(s[1])-1`
?s[-1]==s[0]==`int(s[1])-1`
(memerlukan Python 2 khusus).PowerShell v3 +,
14710867 bytePendekatan yang berubah secara radikal. Menghasilkan semua nomor Giza yang mungkin, dan kemudian memeriksa apakah inputnya
$args[0]
adalah-in
koleksi itu. Di bawah ini adalah bagaimana koleksi angka Giza terbentuk:Contoh berjalan:
sumber
Python 3, 65 byte
Saya tidak sepenuhnya yakin, tapi saya pikir ini berhasil.
sumber
0
, Anda dapat menghapusnya :) Juga tidak akan ada angka lebih dari 17 yang memenuhi kondisi itu sehingga Anda tidak memerlukannya juga. Ini pada dasarnya solusi yang sama yang dimiliki Dennis :)Python 2,
687366 bytemenyalahgunakan fakta itu
11^2=121
,111^2=12321
dan seterusnya, saya menghitung ini dan menambahkan1111..
waktu yang cukup sebagai offset.Contoh:
23432=111^2+11111*1
676=11^2+111*5
sumber
f
, Anda tidak perlu menyebutkan namanya. Anda dapat menyimpan dua byte dengan menghapusf=
1234567900987654321
mengembalikan true, padahal seharusnya salah.Perl, 41 byte
40 byte kode +
-p
bendera.Output 1 jika input adalah nomor Giza, tidak ada yang sebaliknya. Masukkan input tanpa baris akhir terakhir untuk menjalankannya:
Penjelasan : pertama,
s/(.)(?=(.))/$1-$2/ge
ganti setiap digit$1
(diikuti oleh$2
) oleh$1-$2
. Jika itu adalah nomor Giza, maka setiap digit menjadi satu kurang dari yang berikutnya di awal, dan satu lagi di akhir, maka string harus berisi hanya-1
di bagian pertama, dan1
di yang kedua (kecuali yang terakhir tidak berubah) . Itulah yang/^(-1(?1)1|).$/
diperiksa bagian kedua : mencari-1
diikuti oleh rekursi diikuti oleh a1
.-1 byte terima kasih kepada Martin Ender.
Versi saya sebelumnya 15 byte lebih lama (sangat berbeda jadi saya akan membiarkannya di sini):
sumber
|
regex kedua.> <> IKAN
57524948 byteSunting 1: = mengembalikan 0 atau 1 jika benar begitu menghapus cek dan menggunakan nilai ini untuk kenaikan, lalu memeriksa kesetaraan setelahnya. (disimpan 6 byte, hilang 1 untuk baris baru).
Sunting 2: 3 marka arah dihilangkan dan 11 ditempatkan pada celah untuk mengimbangi tumpukan hingga panjang genap untuk memaksakan false (3 byte disimpan).,
Sunting 3: Gandakan panjang tumpukan untuk memeriksa MOD dengan 2 dan len (1), ini dilakukan dengan meletakkan panjang dua kali sebelumnya, tetapi ini sekarang mengisi ruang kosong pada baris 2 (disimpan 1 byte).
sumber
C #,
1208610810292 byteProgram lengkap dengan beberapa kasus uji:
Hore untuk conditional satu baris, sekarang mengalahkan jawaban Java :)! Juga harus menulis komentar menjelaskan pertama saya, meskipun mungkin cukup jelas. Terima kasih kepada @Dada untuk menemukan masalah dengan algoritme saya (berlaku untuk angka yang dicerminkan seperti 13631). Sekarang sub 100 karena tampaknya memeriksa panjang% 2 mubazir.
sumber
true
angka seperti13631
? Juga karena Anda membuat panggilan rekursif kex
, saya pikir Anda perlu memasukkanx=
dalam jumlah byte Anda.Bash, 111 byte
MEMPERBARUI
Perhatikan bahwa normalisasi nomor input mungkin dapat dilewati sepenuhnya, jika Anda hanya menambahkan digit pertama kembali ke nomor GIZA yang Anda hasilkan , seperti itu:
dan kemudian bandingkan saja dengan input secara langsung.
Penafian: yang ini tidak benar-benar dioptimalkan, jadi itu lebih merupakan bukti konsep daripada pesaing nyata
Golf
Algoritma
Setiap nomor GIZA dapat dinormalisasi ke bentuk kanoniknya, dengan mengurangi digit pertama dari yang lain:
dan hanya ada satu nomor GIZA kanonik dengan panjang tertentu.
Mengetahui hal ini kita dapat dengan mudah menghasilkan nomor GIZA kanonik berdasarkan panjang nomor input:
kemudian menormalkan nomor input:
dan bandingkan
Uji
sumber
Sebenarnya , 22 byte
Cobalah online!
Mengambil input sebagai string yang dikutip (mis
"12321"
.). Output adalah bilangan bulat positif untuk true, dan0
untuk false.Penjelasan:
sumber
Haskell, 62 byte
Input diambil sebagai string.
Membuat daftar semua nomor Giza dan memeriksa jika nomor itu ada di dalamnya. Daftar ini dibuat dengan perulangan
i
melalui'1'..'9'
dan kemudianj
melalui'1'..i
dan membuat elemenj .. i-1 , i , i-1 .. j
.sumber
> <> , 62 byte
Cobalah online!
Output 1 untuk nomor Giza; 0 sebaliknya. Bekerja dengan mendorong input ke dequeue (ok, secara teknis stack reversibel) dan berulang kali menguji kedua ujung untuk kesetaraan, serta memastikan mereka tepat satu lebih besar dari nilai sebelumnya.
sumber
CJam ,
2019 byteSuite uji.
Penjelasan
Ide dasarnya adalah untuk menemukan digit minimum dan maksimum, kemudian buat nomor Giza dari mereka dan kemudian periksa apakah itu setara dengan input.
Alih-alih karakter minimum, kita juga dapat menggunakan karakter pertama, untuk jumlah byte yang sama:
sumber
Mathematica,
626160 byteDisimpan 2 byte karena @MartinEnder .
Komposisi fungsi. Mengambil angka sebagai input dan mengembalikan
True
atauFalse
sebagai output.sumber
Retina,
555436 byteHitungan byte mengasumsikan penyandian ISO 8859-1.
Cobalah online
Ubah setiap digit menjadi unary, dipisahkan oleh titik dua. Loop, menghapus digit luar yang cocok jika digit berikutnya adalah satu lagi. Cocokkan satu digit yang tersisa.
sumber
12312
PHP, 71 byte
mengambil digit terbesar dari input dan menghitung mundur, menambahkan digit baru ke string perbandingan hingga input dan string perbandingan sama - atau
$i
sama0
.mencetak angka terendah untuk Nomor Timmy, yang
0
lain.sumber
Pushy ,
3015 byteSaya bangun pagi ini dan menyadari bahwa saya dapat setengah dari jawaban saya ...
(non-bersaing sebagai tantangan postdates bahasa)
Input diberikan pada baris perintah:
$ pushy gizas.pshy 3456543
. Keluaran1
untuk kebenaran dan0
kepalsuan. Berikut rinciannya:Algoritma ini terinspirasi oleh jawaban bash: pertama, menormalkan angka, (
45654 -> 01210
), kemudian menghasilkan angka giza yang dinormalisasi dengan panjang yang sama (hanya ada satu), dan membandingkan.Solusi Lama
sumber
Racket 292 byte
Tidak Disatukan:
Pengujian:
Keluaran:
sumber
Java 8, 162 + 19 byte
19 untuk
import java.util.*;
Pendekatan yang berbeda dengan jawaban Java lainnya, saya ingin mencoba dan menggunakan metode membuat semua nomor Timmy yang mungkin dan memeriksa untuk melihat apakah string kami terkandung di dalamnya.
sumber
Oktaf, 56 byte
Periksa semua kotak uji di sini .
Ini akan menjadi dua byte lebih sedikit di MATLAB, karena
diff(n)
berfungsi untuk string. Di Octave, Anda perludiff(+n)
.Penjelasan:
sumber
Mathematica, 56 byte
Ini sedikit lebih pendek:
sumber
Java 7,
129 119109 byteMetode Rekursif Lama, 119
-10 byte terima kasih kepada Geobits. Kami
sedangterikat ...Cobalah online!
sumber
and
, saya pikir Anda pernah menggunakannya tapi tidak kali ini? Atau saya salah baca.java.util.Arrays.copyOfRange(...)
untuk melewati garis impor.Perl 6 ,
4334 byteTerima kasih kepada Jo King untuk -9 byte.
Solusi Port of Gabriel Benamy's Perl .
Cobalah online!
sumber
Cjam, 35 byte
Mungkin sangat suboptimal ... Saya sedikit keluar dari latihan!
Cobalah online!
sumber
Python 2,
50828180 bytePendekatan sederhana. Pisahkan string menjadi dua (kehilangan karakter tengah atau satu setelah karakter tengah jika panjangnya genap), membalikkan bagian kedua kemudian membandingkan keduanya dan membandingkan bagian pertama dengan string 1 hingga 9.
Edit
Mem-posting ulang setelah umpan balik konstruktif dari sesama pegolf dan menyadari dan memperbaiki kesalahan saya.
-1 untuk kehilangan ruang (buang)
-1 untuk membaca pertanyaan lagi dan menyadari bahwa kita tidak perlu memperhitungkan 0. Benar-benar harus berhenti bermain golf setelah seharian bekerja.
sumber
13531
dan6543456
keduanya salah mengembalikan True.'0'
dan'1'
keduanya benar.