Modüler SNUSP'de bir sayının en kısa sunumunu bulun


10

Arka fon

Birçok ezoterik programlama dili, değişmez değerlerde yerleşik sayılara sahip değildir, bu nedenle bunları çalışma zamanında hesaplamanız gerekir; ve bu vakaların çoğunda sayı temsili oldukça ilginç olabilir. Underload için sayıları temsil etme konusunda zaten bir zorluk yaşadık . Bu zorluk Modüler SNUSP'deki sayıları temsil etmektir . (Bu zorluğu tamamlamak için SNUSP öğrenmeniz gerekmediğini unutmayın - ihtiyacınız olan tüm bilgiler spesifikasyondadır - ancak arka planı ilginç bulabilirsiniz.)

Görev

Bu meydan okuma amaçla, bir Modüler SNUSP sayı karakterlerinin dışına oluşan bir dizidir @, +ve =son karakter olması dışında, #sondan bir önceki karakter olmalı ve bu +ya =(bu olamaz @). Örneğin, geçerli numaralar arasında, @+#, ==#ve @@+@=#; Geçersiz sayı örnekleri +=, @@#ve +?+#.

Modüler SNUSP numarasının değeri tekrar tekrar aşağıdaki gibi hesaplanır:

  • # 0 değerine sahiptir (bu temel durumdur).
  • Sayı =xherhangi bir dize için forma sahipse, xdeğeri, değerine eşittir x.
  • Sayı +xherhangi bir dize için forma sahipse x, değeri xartı 1 değerine eşittir .
  • Sayı, @cxherhangi bir tek karakter cve herhangi bir dize için forma sahipse, xdeğeri değerine xartı değerine eşittir cx.

Bu zorluk için, girdi olarak negatif olmayan bir tam sayı alan ve girdiye eşit bir değere sahip mümkün olan en kısa Modüler SNUSP numarası olan bir dize çıkaran bir program yazmalısınız.

Açıklamalar

  • Aynı değere sahip birden fazla dize olması tamamen mümkündür ve özellikle bazı tamsayılar için bu değere sahip en kısa Modüler SNUSP numarası için bir bağ olacaktır. Böyle bir durumda, berabere kalan sayılardan herhangi birini çıkarabilirsiniz.
  • Numarayı bulmak için kullandığınız algoritmada herhangi bir kısıtlama yoktur; örneğin, kaba kuvvet dizeleri ve bunları değerlendirmek yasal bir taktiktir, ancak arama alanını azaltmak için daha akıllıca bir şey yapar.
  • PPCG'de her zamanki gibi, gönderiminiz tam bir program veya bir işlev olabilir (dilinizde daha özlü olanı seçin).
  • Bu, girdi ve çıktı biçimlerini işlemeyle ilgili bir sorun değildir, bu nedenle negatif olmayan bir tam sayı girmek ve bir dize çıkarmak için makul herhangi bir yöntem kullanabilirsiniz. Meta'da tam bir rehber vardır , ancak en yaygın kullanılan yasal yöntemler arasında işlev bağımsız değişkenleri / döndürme, komut satırı bağımsız değişkenleri ve standart giriş / standart çıktı bulunur.

Test senaryoları

İlk birkaç sayının en kısa gösterimleri:

  • 0 :#
  • 1 :+#
  • 2 :++#
  • 3 : +++#veya@++#
  • 4 : ++++#veya +@++#veya@=++#
  • 5 : @+++#veya@@++#
  • 6 : +@+++#veya +@@++#veya @=+++#veya @=@++#veya@@=++#
  • 7 : @++++#veya@+@++#
  • 8 : @@+++#veya@@@++#
  • 9 : +@@+++#veya +@@@++#veya @+++++#veya @++@++#veya @+@=++#veya @@=+++#veya@@=@++#
  • 10 : @=@+++#veya @=@@++#veya @@@=++#( olası tüm cevaplar dahil olduğu için bu kontrol etmek oldukça önemli bir test örneğidir= )
  • 11 : @+@+++#veya @+@@++#veya @@++++#veya@@+@++#
  • 12 : +@+@+++#veya +@+@@++#veya +@@++++#veya +@@+@++#veya @=+@+++#veya @=+@@++#veya @=@=+++#veya @=@=@++#veya @=@@=++#veya @@=++++#veya @@=+@++#veya@@=@=++#
  • 13 : @@@+++#veya@@@@++#
  • 14 : +@@@+++#veya +@@@@++#veya @=@++++#veya @=@+@++#veya @@+++++#veya @@++@++#veya@@+@=++#
  • 15 : @+@++++#veya @+@+@++#veya @@=@+++#veya @@=@@++#veya @@@=+++#veya@@@=@++#

Daha büyük bir test olarak, girdi çıktı 40 olmalıdır @@@=@@+++#, @@@=@@@++#, @@@@=@+++#ya da @@@@=@@++#.

Zafer koşulu

Bir mücadelesi olarak, kazanan bayt olarak ölçülen en kısa giriş.


1
=optimal olarak sadece şu şekilde gerçekleşecek @=, değil mi?
orlp

3
Bu arada, bu tür zorluklar genellikle en iyi metagolf olarak gönderilir , çünkü herhangi bir ilginç cevap yoktur (sadece tüm dizeleri değerlendirmek için ipi ve döngüyü değerlendirin).
orlp

3
@orlp: Kabul etmiyorum, bu zorluk bir metagolf olarak çok kolay olurdu, çünkü en uygun cevabı bulmak nispeten kolaydır ve metagolf puanlamaya başka herhangi bir kısıtlama getirmez. Buradaki cevapların çoğunun kaba kuvvet olmasını bekliyorum, ancak şartname kaba kuvvet a) en kısa olmayabilir ve b) kendi başına golf oynamak için ilginç olacaktır. Zafer koşulunda bir değişiklik istiyorsanız, muhtemelen diğer ilginç olan en hızlı koddur ve bu farklı bir meydan okuma olarak daha mantıklı olacaktır.

Ayrıca Brain-flak için de bir takım golf mücadelemiz oldu
sadece ASCII

Yanıtlar:


3

Oracle SQL 11.2, 341 262 bayt

WITH e AS(SELECT DECODE(LEVEL,1,'=',2,'@','+')e FROM DUAL CONNECT BY LEVEL<4),n(s,v,p,c,i)AS(SELECT'#',0,0,e,1 FROM e UNION ALL SELECT c||s,DECODE(c,'+',1,'@',p,0)+v,v,e,i+1 FROM n,e WHERE i<11)CYCLE s SET y TO 1 DEFAULT 0 SELECT s FROM n WHERE:1=v AND rownum=1;

Eski versiyon

WITH e AS(SELECT DECODE(LEVEL,1,'=',2,'@','+')e FROM DUAL CONNECT BY LEVEL<4),n(s,v,p,c) AS(SELECT'#',0,0,e FROM e UNION ALL SELECT s||c,CASE c WHEN'+'THEN 1 WHEN'='THEN 0 WHEN'@'THEN p ELSE 0 END+v,v,e FROM n,e WHERE LENGTH(s)<10)CYCLE s SET y TO 1 DEFAULT 0 SELECT MIN(REVERSE(s))KEEP(DENSE_RANK FIRST ORDER BY LENGTH(s))FROM n WHERE v=:1;

: 1 Modüler SNUSP'de temsil edilecek sayı

Golf hariç:

WITH e AS (SELECT DECODE(LEVEL,1,'=',2,'@','+')e FROM DUAL CONNECT BY LEVEL<4),  
n(s,v,p,c,i) AS                   
(
  SELECT '#',0,0,e,1 FROM e
  UNION ALL
  SELECT s||c
       , DECODE(c,'+',1,'@',p,0)+v 
       , v
       , e
       , i+1
  FROM n,e
  WHERE i<11
) CYCLE s SET y TO 1 DEFAULT 0
SELECT s FROM n WHERE:1=v AND rownum=1;

İlk önce sayıları temsil etmek için kullanılan her sembol için bir tane olmak üzere 3 satırdan oluşan bir görünüm oluşturun, eksi #, yalnızca dizenin sonunda kullanılır:

SELECT DECODE(LEVEL,1,'=',2,'@','+')e FROM DUAL CONNECT BY LEVEL<4;    

Daha sonra, özyinelemeli görünüm n, bu 3 sembolle mümkün olan her dizeyi oluşturur, bunları # ile birleştirir ve değerlendirir.

Parametreler:

s: değerlendirilen sayının Modüler SNUSP temsili
v: önceki yineleme
p: v ile hesaplanan s'nin ondalık değeri i-2 yineleme ile hesaplanır
c: s
i ile birleştirilecek bir sonraki sembol : yalnızca s'nin uzunluğu, yalnızca s golf amaçlı iki LENGTH () kurtulmak için gerekli

DECODE(c,'+',1,'@',p,0)+v 

Son sembol + ise, 1 ekleyin.
Eğer @ ise, i-2 yinelemesinin değerini ekleyin
Else sembolü ya # veya = olur. v özyinelemeli görünümün başlangıç ​​kısmında 0 ile başlatılır, bu nedenle yeni v her iki durumda da önceki v'ye eşittir.

WHERE i<11

3 sembolle mümkün olan her dize hesaplanır, bu bölüm talebin büyük bir çatışmaya kadar çalışmamasını sağlar.

CYCLE s SET y TO 1 DEFAULT 0

Dizelerin yapımında herhangi bir kural olmadığından kopyalar ortaya çıkacaktır. Özyinelemeli bir görünümde olmak Oracle, bu kopyaları döngü olarak yorumlar ve duruma açıkça bakılmazsa bir hata atar.

SELECT s FROM n WHERE:1=v AND rownum=1;

Parametre olarak girilen ondalık sayı olarak değerlendirilen ilk Modüler SNUSP temsilini döndürür: 1

Testlerimde bu ilk satır her zaman en kısa gösterimlerden biridir.

Veritabanınızın aynı şekilde işlememesi durumunda, bu son maddenin yerine

SELECT MIN(s)KEEP(DENSE_RANK FIRST ORDER BY i)FROM n WHERE:1=v

2

JavaScript (ES6), 100 bayt

n=>eval("for(a=[['#',0,0]];[[s,t,p],...a]=a,t-n;)a.push(['='+s,t,t],['+'+s,t+1,t],['@'+s,t+p,t]);s")

Basit kaba kuvvet ilk genişliği arama algoritması.


40 için, 42 olarak değerlendirilen "@@@@@@ = ​​++ #" döndürür
aditsu quit çünkü SE, EVIL

12 için bile, 13 olarak değerlendirilen "@@@ +++ #" verir
aditsu, SE'nin

Hmm, değişen düşünüyorum t<niçin t-n... kudreti çalışması
Neil

2

Pyth, 41 bayt

L?b+ytb@[yttb001)Chb0+hfqQyTs^L"+@="UhQ\#

Test odası

Nasıl çalışır:

İki bölüm var. İz bırakmadan bir SNUSP ifadesinin değerini #ve kaba kuvvet rutinini hesaplayan özyinelemeli bir işlev .

evalutaion:

L?b+ytb@[yttb001)Chb0
L                        Define the function y(b) as follows
 ?b                      If b is nonempty
   +ytb                  The sum of y(tail(b)) and   # tail(b) = b[1:]
   @[       )            The element in the list at location
   Chb                   Character values of the first character.
                         Modular indexing means that 
                         + -> 3
                         @ -> 0
                         = -> 1
                         Index 2 is filler.
    [yttb001)            @ adds y(tail(tail(b)). Tail suppresses the error when
                         called on an empty list, so this treats @# as zero, but
                         this can't lead to problems because removing the @ will
                         always make the expression shorter.
                         + adds 1, = adds 0.
 0                       If b is the empty string, return 0

Kaba kuvvet:

+hfqQyTs^L"+@="UhQ\#
               UhQ      0 ... Q     # Q is the input
        ^L"+@="         Map that list to all strings formed from the characters
                        "+@=", with that many characters.
       s                Concatenate
  fqQyT                 Filter for strings which evaluate to the input
 h                      Take the first success, which is the shortest due to
                        the order the strings were generated.
+                 \#    Add a '#' and output


1

Haskell , 89 86 bayt

DÜZENLE:

  • -3 bayt: sıkıştırma dizine ekleme işleminden daha kısaydı.

Neil'in cevabından çok ilham alan başka bir kaba kuvvet çözümü. (Golf daha önce isaacg'ın Pyth gibi çalıştı rağmen tanıttı l.)

f n=[s|(a,_,s)<-l,a==n]!!0
l=(0,0,"#"):[(a+c,a,d:s)|(a,b,s)<-l,(c,d)<-zip[0,1,b]"=+@"]

Çevrimiçi deneyin!

  • f bir tamsayı alan ve bir dize döndüren ana işlevdir.
  • lsınırsız bir tuples listesi, ilk olarak (a,b,s)en kısa temsiller s, değerleriyle ave bilk karakterle soyulmuş temsil ile değeri . (diğerlerinin de belirttiği / fark ettiği gibi, ikincisine 0 olarak davranmak zararsızdır #.)
  • İlki ldışındaki unsurlar bir liste kavrayışı ile özyinelemeli olarak oluşturulur. listede yeni bir gösterim oluşturmak diçin eklenmesi gereken karakterdir sve 'c' karşılık gelen artıştır a.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.