Arka fon
Ada , tezahürü ile tam olarak bilinmeyen bir programlama dilidir.
Bununla birlikte, dizi değişmez sözdizimi teoride oldukça kısa dizi özelliklerine izin verebilir. Dizi değişmez sözdiziminin basit bir EBNF açıklaması ( bottlecaps.de'ye geçirilebilir) :
array ::= positional_array | named_array
positional_array ::= expression ',' expression (',' expression)*
| expression (',' expression)* ',' 'others' '=>' expression
named_array ::= component_association (',' component_association)*
component_association ::= discrete_choice_list '=>' expression
discrete_choice_list ::= discrete_choice ('|' discrete_choice)*
discrete_choice ::= expression ('..' expression)? | 'others'
Basitlik için kendimizi 1 boyutlu tamsayı dizileriyle sınırlayacağız. Bu, ifade değerleri için yalnızca tamsayılar kullanacağımız anlamına gelir. Belki gelecekteki bir meydan okumada daha gelişmiş bir şey deneyebiliriz (değişkenleri ve çok boyutlu dizileri bildirmek gibi). Tam sayı değişmez golf oynamak zorunda değilsiniz .
Ada dizisi değişmezlerinin bazı örnekleri ve netlik için bir python-esque eşdeğer gösterimi:
(1, 2, 3) = [1, 2, 3]
(1, others => 2) = [1, 2, 2, ..., 2]
(others => 1) = [1, 1, ..., 1]
(1 => 1, 2 => 3) = [1, 3]
(1|2 => 1, 3 => 2) = [1, 1, 2]
(1 => 1, 3 => 2, others => 3) = [1, 3, 2, 3, 3, ..., 3]
Meydan okuma
Bu zorluğun amacı, belirli bir girdi dizisi için en kısa bayt-sayısı Ada dizisi değişmezinin çıktısını vermektir. Ada dizilerinin istenen herhangi bir dizinden başlayabileceğini unutmayın, böylece her bir değer sıralı olduğu sürece başlangıç dizininin ne olmasını istediğinizi seçebilirsiniz. Bu örnekte Ada için deyimsel olan 1'den başlamayı seçiyorum, ancak başka bir tamsayıdan başlamayı da seçebilirsiniz.
Giriş
Girişiniz, hangi formda olursa olsun bir tamsayılar listesinden oluşacaktır.
Çıktı
Çıktınız, girdi tam sayılarının listesini temsil eden en kısa geçerli Ada dizisi değişmezini temsil eden bir metin dizesi olacaktır. Bu dizide istediğiniz herhangi bir başlangıç dizinini kullanabilirsiniz, ancak seçiminiz (her ne olursa olsun) cevabınızda belirtilmelidir (başlangıç dizini de dinamik olabilir).
Tamsayılar örneklerde olduğu gibi işaretli ondalık sayılar olarak gösterilmelidir. Bu zorluk tam sayı değerlerinin golf oynamasını kapsamaz.
Örnekler
İşte bazı örnekler:
Simple: [1, 2, 3] -> (1,2,3)
Range: [1, 1, 1, 1, 1, 1, 1,] -> (1..7=>1)
Others: [1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1] -> (6=>2,others=>1)
Multiple Ranges: [1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1] -> (6..10|16..20=>2,others=>1)
Tiny Ranges: [1,1,2,2,1,1,1,1,1] -> (3|4=>2,others=>1)
Far Range: [[1]*5, [2]*100, [3]*5] -> (1..5=>1,6..105=>2,others=>3)
Alternation: [1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2] -> (1|3|5|7|9|11|13|15|17=>1,others=>2)
Big Number: [1234567890,1,1234567890] -> (2=>1,1|3=>1234567890)
Big-ish Number: [1234567,1,1234567] -> (1234567,1,1234567)
Solo: [-1] -> (1=>-1)
Huge Input: [[0],[1]*1000000000] -> (0,others=>1)
Positional Others: [1, 2, 3, 3, 3, 3, 3, 3] -> (1,2,others=>3)
Range and Choice, no Others: [1,1,1,12,12,3,3,3,3,3,3,3,3,3,3,4] -> (1..3=>1,4|5=>12,6..15=>3,16=>4)
Minimum Gereksinimler
En az 100 rakam ve en az 256 rakam uzunluğundaki girişleri destekleyin.
Tüm bu girdiler için doğru sonucu üretin
- 'Diğerlerini' sonuna koymayı içerir
- Tek öğe dizileri için bir dizin eklemeyi içerir
Yukarıdaki girişlerin her biri için bir dakikadan kısa sürede (tercihen TIO'da) sonlandırın.
Baytlarda en kısa çözüm kazanır!
Referans uygulaması
Bu uygulama girdiyi dizi olarak kullanır ve her karakter bir sayıdır. Büyük harfler büyük değerler için özel sabitlerdir. Program argümanı kullanılacak 'başlangıç endeksidir'.
"Üstbilgi" ve "altbilgi" test yapısını uygularken, TIO bağlantısındaki "kod" bölümü soruna doğru bir çözümdür.
106..110=>3,others=>2
daha uzun olurdu) Dilbilgisi tek elemanlı konumsal dizilere izin vermediğinden son durumun bir dizini olması gerekir ( positional_array ::= expression ',' expression (',' expression)*
)
(1|3=>1234567,2=>1)
için geçerli başka bir çıktı olduğunu onaylar [1234567,1,1234567]
mısınız?
(-1)
mı?