7 kuraldan oluşan sıkıcı dizi


11

Yıkık

Rasgele sayılarla rasgele uzunluklu bir dizi oluşturan bir program oluşturun, ardından diziyi değiştiren bir dizi kural uygulayın. Kurallar uygulandıktan sonra, aksi belirtilmedikçe dizinin toplamını yazdırın

Dizi kurulumu

Dizi, 5 ile 10 arasında rastgele bir uzunluk ve 1 ile 20 arasında rastgele tamsayılar olmalıdır . Her dizi uzunluğu eşit olma olasılığına sahip olmalı ve her tamsayı eleman başına eşit toplama olasılığına sahip olmalıdır.

7 kural

Kurallar, sırayla uygulanmış gibi davranmalıdır (örn: kural 1, kural 2'den önce davranır) ve yalnızca bir kez uygulanır. Kural uygulamasının kanıtı için dizi, her kural uygulamasından sonra ve herhangi bir kural uygulanmadan önce konsola yazdırılmalıdır.

  1. Dizi 7 içeriyorsa, her öğeden 1 çıkarın
  2. Kural 1 uygulanırsa ve dizi şimdi 0 içeriyorsa, her öğeye 1 ekleyin
  3. Dizi 13 içeriyorsa, 13'ü ve ardından gelen tüm öğeleri diziden hariç tutun
  4. Dizi 2 içeriyorsa, tüm tek sayıları hariç tutun
  5. Dizi 20 içeriyorsa ve üçüncü öğe çiftse, toplam olarak 20 değerini döndürün ve sonlandırın. 20 varsa ve üçüncü öğe tekse, toplamın dizinin uzunluğunun 20 katını döndürün ve sonlandırın.
  6. Toplam 50'den büyükse, son öğeyi 50'den küçük veya ona eşit olana kadar tekrar tekrar kaldırın
  7. Dizi 16 içeriyorsa, toplamı ondalık ve onaltılı olarak yazdırın.

Misal

İşte ilk dizi,

[20, 2, 5, 7, 14, 8]

Kural 1 uygulanabilir:

[19, 1, 4, 6, 13, 7]

Ardından Kural 3 uygulanır:

[19, 1, 4, 6]

Başka kural gerekmez, bu nedenle program toplamı 30 olarak döndürür .

notlar

  • Deneyimli bir kod golfçü değilim, ancak kişisel kaydım Python 3'te 369 bayt ile söylenebilir .
  • Kurallar aslında sırayla uygulanmak zorunda değildir, ama sanki onlar gibi davranmak zorundadır.

1
"Rasgele" ne kadar rasgele olmak zorundadır?
HyperNeutrino

1
@HyperNeutrino istediğiniz kadar sudo-rastgele olabilir, ancak fırlatmaya meydan okumaz. Tekrarlara izin verilir.
Graviton

Kuralları gerçekten uygulayıp uygulamadığımızı nasıl kontrol edeceksiniz? Sadece 50'nin altında rastgele bir sayı üretebilirim ve yine de teknik olarak kuralların hiçbirini ihlal etmeyecekti ve sadece kuralları "takip ettiğini" söyleyebilirim. DÜZENLEME: Şimdi bunun işe yaramayacağını anlıyorum, ancak insanlar rastgele kuralları atlatmanın yollarını bulacaklar. Bunu engelleyecek misin?
clismique

1
Şu anda, iki diziden birini seçmek [3 3 3 3 4 3]ve [4 4 3 4 4]her biri% 50 olasılıkla seçmek , "dizi kurulumu" altında yazılanlarla uyumludur. Yani 19her seferinde çıktı alabilir miyim ? (Tabii ki, gerçekten düşündüğüm şey "rastgele" tanımının açıklığa kavuşturulması gerektiğidir.)
Greg Martin

2
If the array contains a 20, and the third element is even/odd, dizinin bu adımda 3'ten az öğesi varsa ne olur?
Emigna

Yanıtlar:


8

Python 3, 294 301 287 356 bayt

import random as r
r=r.randint
k=[r(i)+1for i in[20]*r(5,11)]
p=print
if 7in k:k=[i-1for i in k]
p(k)
if 0in k:k=[i+1for i in k]
p(k)
i=k.find(13)
if not~i:k=k[:i]
p(k)
if 2in k:k=[i for i in k if~i%2]
p(k)
a=0
z=len(k)>2and k[2]%2
if 20in k:a=20*len(k)**z
if~z:p(k)
while sum(k)>50:k=k[:-1]
if~z:p(k)
if a:p(a)
else:a=sum(k);p(a,hex(a)*(16in k))
if~z:p(k)

İnsanların kuralları aşmasını nasıl engelleyeceğinizi bilmiyorum, ama bu belirtilen prosedürü kullanıyor.

+7 bayt; birkaç bayt kaydettiği için @YamB sayesinde; önceki bir hatayı düzeltmek için çok daha fazlasını ekledi.
@RootTwo ve ben sayesinde -14 bayt ve ayrıca hatayı düzeltti.
+83 bayt; bu çok uzun sürüyor çünkü OP kuralları değiştirmeye devam ediyor. -@ZacharyT sayesinde bazı bayt sayısı


Dürüst olduğun için teşekkürler beni kontrol ediyor.
Graviton

'Bayint'i r' olarak içe aktararak ve 7 inç k ve 1 not k ise k: k = [i-1 ... 'ise' 7 inç k: k = [i + 1-int (1 inç k) olarak değiştirerek 4 bayt kaydedebilirsiniz. ) ... '
Graviton

K'yi başlatırken, i değerine ihtiyacınız yoktur, böylece ile 6 bayt kaydedebilirsiniz k=[r(1,20)for _ in'-'*r(5,11)]. k=[i+~-(1in k)*(7in k)for i in k]Kural 1 ve 2'yi kullanarak başka bir bayt kaydedebilirsiniz
RootTwo

1
@ Notts90 Bu zorluğu yazdıktan sonra kurallar değiştirildi. Bir bilgisayara geldiğimde tamir edeceğim. Teşekkürler.
HyperNeutrino

Hatlar beş ve yedi üzerinde, sonra bir gereksiz alana sahip 1ve değiştirebileceğiniz printson hatlarına ikinci ve üçüncü üzerinde p. Ve siz ... baytınızı güncellemediniz.
Zacharý


6

JavaScript (ES6), 344 342 340 342 335 331 333 313 311 305 298 297 290 289 283 279 bayt

Huzzah! Sonunda beat Arnauld ile bağlı !

Bu takasın ardından * meydan okumaların yorumlarında ve çok fazla müzakereden sonra new Dateyerine rastgele sayı üreteci için tohum olarak kullanmaya karar verdim Math.random(). Bunu yapmak, dizideki tüm tamsayıların aynı değerde olacağı anlamına gelir.

_=>(l=alert,r=new Date,l(a=[...Array(r%6+5)].map(x=>r%20+1)),i=v=>~a.indexOf(v),i(7)&&l(a=a.map(x=>--x)),i(0)&&l(a=a.map(x=>++x)),i(13)&&l(a=a.slice(0,~i(13))),i(2)&&l(a=a.filter(x=>x%2)),i(t=20)?a[2]%2?t*a.length:t:l(a=a.filter(x=>s+x<51?s+=x:0,s=0))|i(16)?[s,s.toString(16)]:s)

Dene

f=
_=>(l=alert,r=new Date,l(a=[...Array(r%6+5)].map(x=>r%20+1)),i=v=>~a.indexOf(v),i(7)&&l(a=a.map(x=>--x)),i(0)&&l(a=a.map(x=>++x)),i(13)&&l(a=a.slice(0,~i(13))),i(2)&&l(a=a.filter(x=>x%2)),i(t=20)?a[2]%2?t*a.length:t:l(a=a.filter(x=>s+x<51?s+=x:0,s=0))|i(16)?[s,s.toString(16)]:s)
alert(f())

  • Kural 6'da yalnızca patlatılan öğeleri günlüğe kaydederek 2 bayt kaydedildi.
  • Değiştirilmesiyle 2 bayt Kaydedilen Array(x).fill()ile[...Array(x)] .
  • Kural 5'e karıştığım için 2 bayt eklendi!
  • Bir önceki karmaşayı düzeltmeye çalıştığım karışıklığı gideren 7 bayt kaydedildi!
  • Arnauld sayesinde kural 2'deki bir beyin parçasını iyileştirmeme yardımcı olan 3 bayt kurtardı ve yerine +1bir~ .
  • Sağlanan 2 bayt 0Boş bir dizi için döndürülmesini .
  • Sonunda bu gübreyi nasıl atlatacağınızı bularak 20 bayt kurtardı while döngüsünü .
  • ,Son 2 deyimi arasında bir ile değiştirerek |ve ekini kaldırarak 2 bayt kaydedildi ().
  • Değiştirerek 6 bayt kaydedilmiş console.logolanalert .
  • Kısayolunu iyileştirerek 7 bayt kaydedildi a.includes() .
  • Kural 3'ün uygulanmasını düzenleyerek 1 bayt kaydedildi.
  • Hendek includes()ve sadece kullanarak 7 bayt kaydedildiindexOf() boyunca .
  • İlk bildirimini taşıyarak 1 bayt kaydedildi sDeğişkenin virgül gerektirmeyen bir yere .
  • Değiştirerek 6 bayt kaydedilmiş Math.random()olannew Date .
  • Rastgele sayıların (artık) yuvarlanmasını kaldırarak 4 bayt kaydedildi.

Okunabilir ve Test edilebilir versiyon

  • Koda satır sonları ve yorumlar eklendi
  • Yerine console.logkullanılıralertAkıl sağlığınız ! (En iyi tarayıcınızın konsolunda görüntülenir)
  • Geçerli kural numarasını çıktıya ekledi.
  • Virgülle ayrılmış sayılar listesinin girilmesiyle teste izin vermek için rastgele dizi oluşturma yorumladı.


* Ekran görüntüsü, silinmesi durumunda:


4

C (GCC) , 621 619 593 585 570 562 557 552 529 517 500 482 461 444 442 441 438 bayt

Burada bir sürü golf gerekli ... Listedeki her 16 için onaltılık bir kez yazdırabileceği bir hata düzeltildi ...

Golf yardımı ile ZacharyT'e özel teşekkürler

#define R r[i]
#define P printf("%d "
#define L for(d=i=0;i<l;i++)
d,i,j,l,r[11];p(i){L P,R);puts("");}main(){srand(time(0));for(l=5+rand()%5;i<l;R=1+rand()%20,i++);for(p();i--;)if(R==7){L--R;j=i=1;}for(p();j&&i<l;i++)if(!R){L++R;j=i=l;}p();L if(R==13)l=i;p();L if(R==2)for(d=1;d;)L if(R&1)for(d=1,--l;i<=l;i++)R=r[i+1];p();L if(R==20)return P,r[3]&1?20*l:20);for(j=i=0;i<l&&j+R<51;j+=R,i++);l=i;p();P,j);L if(R==16)printf("0x%x",j,i=l);}

Çevrimiçi deneyin!


1
Hala çok golf oynayabilirsiniz, zaten benim Java cevap 1 bayt altında .. XD Bakalım ben bir şekilde şu anki teslim yenmek için golf olup olmadığını. ;)
Kevin Cruijssen

Tamam, -3 bayt için bir şey buldu; p
Kevin Cruijssen

Eğer bu golf aşağı olabilir, orada bir "geçti 444 hala 444 olduğunu" almak mümkün olabilir! : D
HyperNeutrino

@HyperNeutrino Başka bir 2 bayt
Golf

Yaşasın! İyi iş: D
HyperNeutrino

3

JavaScript (ES6), 296 295 290 289 bayt

Konsola ilk diziyi, ara sonuçları ve son toplamı kaydeden tam bir program.

f="z=[...Array(5+6j)]Z1+20jw7`-1w0`+1w13_qi+1<-kw2_qn&1^1w20_z[2]&1?a.length*20:20);else{q(s+=n)<51,s=0w16_b.toString(16_;b)}zconsole.log(aw_;if(k=~a.indexOf(v((n,i)=>qz=a.filtervj*Math.random()|0bz.reducevn+i,0)`_z=aZn_))Z.mapv";for(g of "Z_`bjqvwz")e=f.split(g),f=e.join(e.pop());eval(f)

Nasıl çalışır

Bu, bu JS paketleyicisi kullanılarak sıkıştırıldı .

Yıkmak:

  • Paketlenmiş dize: 226252 bayt
  • Ambalajdan çıkarma kodu: 69 64 bayt

Aşağıda, okunabilirlik için bazı ek boşluk ve satır beslemelerine sahip orijinal kaynak kodu verilmiştir. Standart golf hileleri uygulamak yerine, paketleyiciyi memnun etmek için mümkün olduğunca çok sayıda yinelenen dize üreten bir şekilde yazılmıştır. Örneğin , yalnızca 3. kuralda kullanılmasına if(k=~a.indexOf(N))rağmen sözdizimi her yerde çoğaltılır k.

console.log(a=[...Array(5+6*Math.random()|0)].map((n,i)=>1+20*Math.random()|0));
if(k=~a.indexOf(7))
  console.log(a=a.map((n,i)=>n-1));
if(k=~a.indexOf(0))
  console.log(a=a.map((n,i)=>n+1));
if(k=~a.indexOf(13))
  console.log(a=a.filter((n,i)=>i+1<-k));
if(k=~a.indexOf(2))
  console.log(a=a.filter((n,i)=>n&1^1));
if(k=~a.indexOf(20))
  console.log(a[2]&1?20*a.length:20);
else {
  console.log(a=a.filter((n,i)=>(s+=n)<51,s=0));
  if(k=~a.indexOf(16))
    console.log(a.reduce((n,i)=>n+i,0).toString(16));
  console.log(a.reduce((n,i)=>n+i,0))
}

Paketten çıkarma yöntemleri

Orijinal ambalaj açma kodu:

f="packed_string";for(i in g="ABCDEFGHI")e=f.split(g[i]),f=e.join(e.pop());eval(f)

Aşağıdaki tüm ES6 varyantları tam olarak aynı boyuta sahiptir:

eval([..."ABCDEFGHI"].reduce((f,g)=>(e=f.split(g)).join(e.pop()),"packed_string"))
[..."ABCDEFGHI"].map(g=>f=(e=f.split(g)).join(e.pop()),f="packed_string")&&eval(f)
eval([..."ABCDEFGHI"].map(g=>f=(e=f.split(g)).join(e.pop()),f="packed_string")[8])

Şimdiye kadar birkaç bayt tıraş etmek için bulduğum tek yol kullanmaktır for ... of:

f="packed_string";for(g of "ABCDEFGHI")e=f.split(g),f=e.join(e.pop());eval(f)

Bunu bir telefonda yanlış okudum, ancak açılmamış kodunuzda, kural 1'in olup olmadığına bakılmaksızın kural 2 uygulanmış gibi görünüyor.
Shaggy

1
@Shaggy Doğru. Ancak kural 1 tetiklenmedikçe sıfır elde edemezsiniz.
Arnauld

D'oh! Elbette! Dostum, bu meydan okuma sırasında çok sayıda beyin partisi yaşıyorum :(
Shaggy

1
@Shaggy Maalesef değil. Bununla birlikte, bir bayt ile kaydedebiliriz n&1^1(hiç paketlenmez, ancak sadece bir bayt daha kısadır !(n&1)). Bunu bir noktada düşündüm ve eklemeyi unuttum.
Arnauld

1
@Shaggy Ahah! İyi iş!
Arnauld

2

Önce kod golf deneyin!

Zaten diğer javascripters tarafından yenildi! Dangit! Geliştireceğim!!! =)

Javascript -> 550 402 bayt

Kesinlikle geliştirilebilir. Şimdi Sıkıştırıldı:

f="ba=[];bl;yz5+5`^=0;i<y;i++)a[i]z20+1|~7j-1|~0j+1|}}~13_l=indexOf(13`ql,y-l-Y_^ in a)if(a[i]%2)qi,Y0)&&(!a[3]%2_k'20'`throw new Error(`}do{l=Vreduce((X,num)=>X+num`ifW)qy-1,1`}whileW|kl`~16))kl.toString(16)`~if(Vincludes(|`ka`z=Zound(Zandom()*yVlengthqVsplice(kalert(j_Vmap((i)=>ibvar `);_)){^for(biZMath.rY1|}~2XtotalW(l>50Va.";for(i in g="VWXYZ^_`bjkqyz|~")e=f.split(g[i]),f=e.join(e.pop());eval(f)

originial:

var a=[];var l;a.length=Math.round(Math.random()*5+5);for(var i=0;i<a.length;i++)a[i]=Math.round(Math.random()*20+1);alert(a);if(a.includes(7)){a.map((i)=>i-1);alert(a);if(a.includes(0)){a.map((i)=>i+1);alert(a);}}if(a.includes(13)){l=indexOf(13);a.splice(l,a.length-l-1);alert(a);}if(a.includes(2)){for(var i in a)if(a[i]%2)a.splice(i,1);alert(a);}if(a.includes(20)&&(!a[3]%2)){alert('20');throw new Error();}do{l=a.reduce((total,num)=>total+num);if(l>50)a.splice(a.length-1,1);}while(l>50);alert(a);alert(l);if(a.includes(16))alert(l.toString(16));

2

Java 7, 622 619 618 bayt

import java.util.*;void c(){Random r=new Random();List<Long>l=new ArrayList();int i=0,c=r.nextInt(6)+5;for(;i++<c;l.add(r.nextInt(20)+1L));p(l);if(l.contains(7)){for(i=0;i<c;l.set(i,l.get(i++)-1));p(l);}if(l.contains(0)){for(i=0;i<c;l.set(i,l.get(i++)+1));p(l);}if((i=l.indexOf(13))>=0){for(;i<l.size();l.remove(i));p(l);}if(l.contains(2)){for(i=0;i<l.size();)if(l.get(i)%2>0)l.remove(l.get(i));else i++;p(l);}if(l.contains(20)){p(20*(l.get(2)%2<1?1:l.size()));return;}i=0;for(long x:l)i+=x;for(;i>50;)i-=l.remove(l.size()-1);p(l);if(l.contains(16))p(Byte.valueOf(i+"",16));p(i);}<T>void p(T t){System.out.println(t);}

@Poke sayesinde -1 bayt

Açıklama:

import java.util.*;                      // Imports used for List, ArrayList and Random

void c(){                                // Main method
  Random r=new Random();                 //  Random generator
  List<Long>l=new ArrayList();           //  The list
  int i=0,                               //  Temp index we use multiple times
      q=r.nextInt(6)+5;                  //  Random size of the list (5-10)
  for(;i++<q;l.add(r.nextInt(20)+1L));   //  Fill the list with random long-integers (1-20)
  p(l);                                  //  Print the initial list
  if(l.contains(7)){                     //  If the list contains a 7
    for(i=0;i<c;l.set(i,l.get(i++)-1));  //   Decrease each number in the list by 1
    p(l);                                //   And then print the list again
  }                                      //  End of if
  if(l.contains(0)){                     //  If the list now contains a 0
    for(i=0;i<c;l.set(i,l.get(i++)+1));  //   Increase each number in the list by 1
    p(l);                                //   And then print the list again
  }                                      //  End of if
  if((i=l.indexOf(13))>=0){              //  If the list contains a 13 (and save it's index in `i` at the same time)
    for(;i<l.size();l.remove(i));        //   Remove everything from that index and onward
    p(l);                                //   And then print the list again
  }                                      //  End of if
  if(l.contains(2)){                     //  If the list now contains a 2
    for(i=0;i<l.size();)                 //   Loop over the list
      if(l.get(i)%2>0)                   //    If the current list item is odd
        l.remove(l.get(i));              //     Remove it
      else                               //    If it's even instead
        i++;                             //     Go to the next item
                                         //   End of loop (implicit / single-line body)
    p(l);                                //   And print the list again
  }                                      //  End of if
  if(l.contains(20)){                    //  If the list now contains a 20
    p(20*(l.get(2)%2<1?1:l.size()));     //   Print 20 if the third item in the list is odd, or 20*size if it's even instead
    return;                              //   And then terminate the method
  }                                      //  End of if
  i=0;                                   //  Reset `i` to 0
  for(long x:l)i+=x;                     //  And calculate the total sum of the list (stored in `i`)
  for(;i>50;)                            //  Loop as long as this list's sum is above 50
    i-=l.remove(l.size()-1);             //   Subtract the last item from this sum, and then remove it from the list
                                         //  End of loop (implicit / single line body)
  p(l);                                  //  And print the list again
  if(l.contains(16))                     //  If the list now contains a 16
    p(Byte.valueOf(i+"",16));            //   Print the sum (still stored in `i`) as hexadecimal
                                         //  End of if (implicit / single-line body)
  p(i);                                  //  And print the sum as integer either way
}                                        // End of main method

<T>void p(T t){                          // Separate method with a generic parameter
  System.out.println(t);                 //  Print the given parameter including a new-line
}                                        // End of separated method

Örnek çıktılar: Örnek çıktıların
arkasındaki yorumlar yazdırılmaz, ancak bunları açıklama olarak ekledim.

Burada deneyin.

[17, 5, 3, 1, 16, 17, 11, 7, 13]   // Initial print (size 9)
[16, 4, 2, 0, 15, 16, 10, 6, 12]   // Rule 1 (contains a 7)
[17, 5, 3, 1, 16, 17, 11, 7, 13]   // Rule 2 (contains a 0)
[17, 5, 3, 1, 16, 17, 11, 7]       // Rule 3 (contains a 13)
[17, 5, 3, 1, 16]                  // Rule 6 (sum must be <= 50)
66                                 // Rule 7 (contains a 16 -> print as Hexadecimal)
42                                 // Print sum as integer

[4, 18, 17, 12, 11, 8]             // Initial print (size 6)
[4, 18, 17]                        // Rule 6 (sum must be <= 50)
39                                 // Print sum as integer

[4, 14, 6, 14, 7, 20, 2, 2]        // Initial print (size 8)
[3, 13, 5, 13, 6, 19, 1, 1]        // Rule 1 (contains a 7)
[3]                                // Rule 3 (contains a 13)
[3]                                // Print is always done after rule 6
3                                  // Print sum as integer

1
Şimdi 594 bayta
düştüm

@cleblanc Şimdi 444'e düştüğünü görüyorum .. Java ile rekabet edemiyorum. :) (444 yılından bu yana diğer tüm cevaplara kıyasla kazanan yakın bir yer olduğunu söylemek komik ..)
Kevin Cruijssen

Biliyorum, 05AB1E gibi golf dilleri bile 100 bayt uzunluğunda. Bu zorluk bir acıydı.
cleblanc

Listenizi genel olarak bırakabilir misiniz List a = new ArrayList()? Bazı baytlar kaydedilebilir. Yine de, gerçek aritmetik yaparken bir tahmin eklemek gerekebilir. Değilse Long, daha kısaInteger
Poke

@Poke Bir jenerik ile beş kez Listbir (int)döküm kullanmam ve for-her döngüyü intdeğiştirmem Objectve altıncı bir döküm eklemem gerekiyor. Gelince Long: teşekkürler, bu 1 bayt tasarruf :) (yine de her biri intiçin longve arasında değiştirmek r.nextInt(20)+1zorunda r.nextInt(20)+1L).
Kevin Cruijssen

2

Yakut 2.4, 260 bayt

Ruby 2.4 için gereklidir Enumerable#sum.

p a=(1..s=5+rand(5)).map{1+rand(19)}
a.map!{|i|i-1}if a.index 7
p a
a.map!{|i|i+1}if a.index 0
p a
a.pop s-(a.index(13)||s)
p a
a.reject! &:odd?if a.index 2
p a
a.index(20)?p(20*[1,s][(a[2]||1)%2]):((a.pop;p a)while a.sum>50
p m=a.sum;puts"%x"%m if a.index 16)

Çevrimiçi deneyin! (Ne repl.it ne de tio.run destek Yakut 2.4 henüz bu online versiyonu cümledeki böylece sumile inject(:+)aynı davranışa sahip.)


1

R (3,3,1), 325 bayt

Oldukça saf uygulama; Sanırım muhtemelen biraz daha kısaltabilirim.

s=sample(1:20,sample(5:10,1));print(s);if(7%in%s){s=s-1;print(s);if(0%in%s)s=s+1;print(s)};if(13%in%s){s=s[1:(which(s==13)-1)];print(s)};if(2%in%s){s=s[!(s%%2)];print(s)};if(20%in%s){if(s[3]%%2){20*length(s);print(s)}else{20;print(s)}};while(sum(s)>50){s=s[-length(s)];print(s)};if(16%in%s){print(as.hexmode(sum(s)))};sum(s)

1

PowerShell , 525 413 bayt

filter a{"$a"};0..(4..9|random)|%{$a+=@(1..20|random)};a;if(7-in$a){$a=($a|%{$_-1});a;if(0-in$a){$a=($a|%{$_+1});a}}$b=$a;$a=@();foreach($z in $b){if($z-ne13){$a+=@($z)}else{a;break}}if(2-in$a){$a=($a|?{$_%2-eq0});a}if(20-in$a){if($a[2]%2){20*$a.count;exit}else{20;exit}}while(($h=$a-join'+'|iex)-gt50){$a=$a[0..($a.count-2)];a}if(16-in$a){$l=0..9+'a b c d e f'-split' ';$q=[math]::floor($h/16);"$q"+$l[$h%16]};$h

Çevrimiçi deneyin!

Ben zaten burada cevapları yenmek olmaz düşündüm rağmen bunu denemek istedim: PI hala golf aşağı denemek için çalışıyor, eminim daha az bayt ile mümkün. Onaltılık için daha iyi bir yöntem bulundu, ancak muhtemelen yine de gelişebilir.

$aBir dizeye birçok kez dökmek zorunda kaldı, bunun için bir filtre oluşturmak daha iyiydi ...

Parantez ve boşluk gibi özlediğim birkaç kolay golf vardı. Hala biraz dışarıda olabilir mi?

Kodu okumak biraz daha kolay:

filter a{"$a"};0..(4..9|random)|%{$a+=@(1..20|random)};a;
if(7-in$a){$a=($a|%{$_-1});a;if(0-in$a){$a=($a|%{$_+1});a}}
$b=$a;$a=@();foreach($z in $b){if($z-ne13){$a+=@($z)}else{a;break}}
if(2-in$a){$a=($a|?{$_%2-eq0});a}
if(20-in$a){if($a[2]%2){20*$a.count;exit}else{20;exit}}
while(($h=$a-join'+'|iex)-gt50){$a=$a[0..($a.count-2)];a}
if(16-in$a){$l=0..9+'a b c d e f'-split' ';$q=[math]::floor($h/16);"$q"+$l[$h%16]};$h

0

MATLAB, 275 bayt

Başlangıçta belki de tek satırlı bir Octave cevabı planladım, ancak uygulanan tüm kuralların çıktısını almayı gerektiren planlarımı engelledi. Bunun yerine, birkaç ilginç optimizasyon ile oldukça basit bir MATLAB cevabı, örneğin kural 6 cumsumiçin bariz yerine kullanımı. whileYine de, ifbir kural uygulanmadığı takdirde çıktıyı önlemek için çok fazla bayt sayısı israf edilir.

A=randi(20,1,randi(6)+4)
if any(A==7)
A=A-1
if any(~A)
A=A+1
end;end
q=find(A==13,1);if q
A=A(1:q-1)
end
if any(A==2)
A=A(2:2:end)
end
if any(A==20)
if mod(A(3),2)
20*length(A)
else
20
end;return;end
q=cumsum(A)<51;if any(~q)
A=A(q)
end
q=sum(A)
if(any(A==16))
dec2hex(q)
end

Çevrimiçi deneyin!


0

Scala 587 bayt bir astar

import scala.util.Random;object A{def main(args:Array[String])={val s=5+Random.nextInt(6);var a=new Array[Int](s);for(i<-1 to s){a(i-1)=1+Random.nextInt(20)};p(a);if(a.contains(7)&& !a.contains(1)){a.map(a=>a-1);p(a)};if(a.contains(13)){if(a(0)==13)a=new Array[Int](0)else a=a.slice(0,a.indexOf(13));p(a)};if(a.contains(2)){a=a.filter(pred=>pred%2==0);p(a)};if(a.contains(20)){if(a(2)%2==0)println(20)else println(20*a.length)}else{while(a.sum>50)a=a.dropRight(1);val u=a.sum;if(a.contains(16))println(Integer.toHexString(u));println(u)}};def p[T](a: Array[T])=println(a.mkString(","))}

Scala, olduğu gibi 763 bayt

import scala.util.Random
object TA {
  def main(args:Array[String])={
    val s=5+Random.nextInt(6)
    var a=new Array[Int](s)
    for (i<-1 to s)
      a(i-1)=1+Random.nextInt(20)
    p(a)
    if(a.contains(7) && !a.contains(1)){
      a.map(a=>a-1)
      p(a)
    }
    if(a.contains(13)){
      if (a(0)==13) a=new Array[Int](0) else a=a.slice(0,a.indexOf(13))
      p(a)
    }
   if(a.contains(2)){
      a=a.filter(pred=>pred%2== 0)
      p(a)
    }
    if(a.contains(20)){
      if (a(2)%2==0) println(20) else println(20*a.length)
    }else{
      while(a.sum>50)
        a=a.dropRight(1)
      val u =a.sum
      if (a.contains(16)) println(Integer.toHexString(u))
      println(u)
    }
  }
  def p[T](a: Array[T])={
    println(a.mkString(","))
  }
}

Bu bir kod golf sorusu olduğundan, en azından gereksiz boşlukları kaldırmak gibi kolay golfler yapmanızı istiyoruz.
Ad Hoc Garf Hunter

Bir satır düşük baytlı versiyon
ekledim

Scala'yı tanımıyorum ama alan a: Array[T]gerekli mi? İçinde yeriniz yok args:Array[String], bu da araştırmamla sonuçlandı.
Zacharý

hayır sanırım özledim.
Saideep Sambaraju

0

MATLAB, 228 241bytes

a=randi(20,1,randi(6)+4)
b=@any; 
a=a-b(a==7)
a=a+b(a==0)
a(find(a==13,1):end)=[]
a(and(mod(a,2),b(a==2)))=[]
if b(a==20)
a=[a 0 0 0];
s=20*(1+mod(a(3),1)*(numel(a)-4))
else
a(cumsum(a)>50)=[]
s=sum(a)
if b(a==16)
h=['0x' dec2hex(s)]
end
end

Bu işlem, her adımdan sonra dizi değerini yazdırarak tüm kuralları sırayla uygulayacaktır.

Sonuçta ortaya çıkan eleman sayısı üçten azsa program kural 5'te çökecektir. Şu anda üçüncü bir öğe yoksa ne olacağını söyleyecek bir şey yok, bu yüzden bir çökmenin kabul edilebilir olduğunu varsayıyorum.Program şimdi 3 öğeden az ve bir veya daha fazla 20 ise 20 yazdıracaktır.

İlginçtir ki, 2. adım, 1. adım olup olmadığına bakılmaksızın uygulanabilir. Bunun nedeni, giriş dizisinin hiçbir zaman 0'a sahip olmamasıdır, yani dizide herhangi bir 0 varsa, adım 1'in gerçekleşmesinin bir sonucu olması gerektiği anlamına gelir.

Herhangi bir değişiklik yapılmasa bile tüm kurallar 5'e kadar uygulanır. Sonuç olarak dizi başlangıçta ve daha sonra 5'e kadar her adımdan sonra yazdırılacaktır. 5. adımdan sonra, uygulanıyorsa toplamı alırsınız veya 6. adımdan sonraya kadar çıktı aalınamaz. dizi değerinin 5. adımdan sonra 2 bayt pahasına yazdırılmasını sağlamak için else ifadesi.


Bunu yazdıktan sonra diğer cevaplara bakmadığımı da belirtmek isterim. Şimdi görüyorum ki hepsi benzer olan bazı benzerliklere sahip başka bir MATLAB cevabı var.


0

Python 3, 297293289 , 278 bayt

Arnauld'un tespit ettiği gibi, girintilemeden kaydedilen kural 1 uygulanmadığı sürece 0 alamazsınız. Önerilerle de yorum yapan herkese teşekkürler.

from random import*
p=print
a=b=sample(range(1,20),randint(5,10))
p(a)
if 7in a:a=[i-1for i in a];p(a)
if 0in a:a=b;p(a)
if 13in a:a=a[:a.index(13)];p(a)
if 2in a:a=[i for i in a if~i%2];p(a)
if 20in a and~a[2]%2:a=[20]
while sum(a)>50:a=a[:-1]
b=sum(a)
p(b)
if 16in a:p(hex(b))

Çevrimiçi deneyin


Sana arasında boşluk gerek olduğunu sanmıyorum andve ~.
Zacharý

from random import* a=b=sample(range(1,20),randint(5,10))satır 2 silebilirsiniz çünkü bazı bayt kaydeder inanıyorum
nocturama

0

Perl 6 , 246 bayt

my&f={.grep($^a)};my&s=->{.say};$_=[(1..20).pick xx(5..10).pick];s;$_»--
if f 7;s;$_»++ if f 0;s;.splice(.first(13):k//+$_);s;$_=[f*%%2]if f 2;
s;say(20*(.[2]%%2||$_)),exit if $_>2&&f 20;s;.pop while
.sum>49;$/=f 16;$_=.sum;s;.base(16).say if $/

Ungolfed:

my &f = { .grep($^a) };  # Helper function: search $_ for something
my &s = -> { .say };     # Helper function: print $_
$_ = [ (1..20).pick xx (5..10).pick ];  # Generate the initial array
s;  # Print the array
$_»-- if f 7;  # Decrement all elements if it contains a 7
s;  # Print the array
$_»++ if f 0;  # Increment all elements if a zero is found
s;  # Print the array
.splice(.first(13):k // +$_);  # Splice out everything from the first 13 onward
s;  # Print the array
$_ = [ f *%%2 ] if f 2;  # Remove all odd elements if a 2 is found
s;  # Print the array
say(20*(.[2] %% 2 || $_)), exit if $_ > 2 && f 20;  # Print and exit, maybe
s;  # Print the array
.pop while .sum > 49;  # Remove elements from the end until sum is below 50
$/ = f 16;  # Save in $/ whether $_ contains a 16
$_ = .sum;  # Set $_ to its own sum
s;  # Print the sum
.base(16).say if $/  # Print the sum in hexadecimal if the last array contained a 16

0

Ortak Lisp, 490 bayt

Burada dizi Ortak Lisp listesi olarak temsil edilir.

(let((a(loop for i from 1 to(+ 5(random 5))collect(1+(random 19)))))(flet((p()(format t"~a~%"a))(m(x)(member x a))(h(x)(map-into a x a)))(p)(and(m 7)(h'1-))(p)(and(m 0)(h'1+))(p)(let((p(position 13 a)))(and p(setf a(butlast a (-(length a)p)))))(p)(and(m 2)(setf a(remove-if'oddp a)))(p)(or(and(m 20)(or(and(third a)(oddp(third a))(* 20(length a)))20))(p)(and(setf a(loop for x in a sum x into s while (<= s 50) collect x)) nil)(p)(let((s(reduce'+ a)))(print s)(and(m 16)(format t"~x"s))))))

Her zamanki gibi, kontrol yapılarının geniş kullanımı andve orkontrolü.

(let ((a (loop for i from 1 to (+ 5 (random 5))  ; create initial list
            collect (1+ (random 19)))))
  (flet ((p () (format t "~a~%" a))     ; auxiliary functions: print list
         (m (x) (member x a))           ; check membership
         (h (x) (map-into a x a)))      ; operate on elements
    (p)
    (and (m 7) (h '1-))                 ; if 7 is present decrement all values
    (p)
    (and (m 0) (h '1+))                 ; if 0 is now present increment all values
    (p)
    (let ((p (position 13 a)))          ; remove from 13 (if exists)
      (and p (setf a (butlast a (- (length a) p)))))
    (p)
    (and (m 2) (setf a (remove-if 'oddp a)))   ; if 2 is present remove odd values
    (p)
    (or (and (m 20)                            ; if 20 is present
             (or (and (third a)                ;    when third is present
                      (oddp (third a))         ;         and it is odd
                      (* 20 (length a)))       ;         return 20 times the length
                 20))                          ;    otherwise return 20
        (p)                                    ; otherwise (20 is not present)
        (and (setf a (loop for x in a sum x into s ; compute sum of elements
                        while (<= s 50)            ; limited to 50
                        collect x))                ; and return those elements
             nil)                                  ; (to execute the rest of the code)
        (p)
        (let ((s (reduce '+ a)))                   ; compute the final sum
          (print s)                                ; print the result in decimal
          (and (m 16) (format t "~x" s))))))       ; if 16 is present print also in hexadecimal
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.