Виснажливий масив із 7 правил


11

Рівень

Створіть програму, яка генерує масив випадкової довжини із випадковими числами, а потім застосуйте ряд правил, що змінюють масив. Після застосування правил надрукуйте суму масиву, якщо не вказано інше

Налаштування масиву

Масив повинен бути випадковою довжиною від 5 до 10 включно, з випадковими цілими числами від 1 до 20 включно. Кожна довжина масиву повинна мати однакову ймовірність того, що трапиться, і кожне ціле число повинно мати рівну ймовірність вибору кожного елемента.

7 правил

Правила повинні діяти так, ніби вони застосовуються послідовно (наприклад: правило 1 діє перед правилом 2) і застосовуються лише один раз. Для підтвердження застосування правила, масив повинен бути надрукований на консоль після кожного застосування правила та один раз перед застосуванням будь-яких правил.

  1. Якщо масив містить 7, віднімайте 1 з кожного елемента
  2. Якщо застосовано правило 1, а масив тепер містить 0, додайте 1 до кожного елемента
  3. Якщо масив містить 13, виключіть із масиву 13 та всі наступні елементи
  4. Якщо масив містить 2, виключіть усі непарні числа
  5. Якщо масив містить 20, а третій елемент є рівним, поверніть 20 як суму, то завершіть. Якщо 20 присутній, а третій елемент непарний, поверніть 20-кратну довжину масиву, оскільки сума завершиться.
  6. Якщо сума більша за 50, виймайте останній елемент кілька разів, поки він не буде меншим або рівним 50
  7. Якщо масив містить 16, надрукуйте суму як у десятковій, так і в шістнадцятковій формі.

Приклад

Ось початковий масив,

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

Правило 1 може застосовуватися:

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

Правило 3 застосовується далі:

[19, 1, 4, 6]

Інші правила не потрібні, тому програма повертає 30 як суму.

Примітки

  • Я не досвідчений гольфіст з кодом, хоча можу сказати, що мій особистий запис знаходиться в Python 3 з 369 байтами .
  • Правила не повинні насправді застосовуватися для того, щоб вони діяли так, як ніби.

1
Яким випадковим має бути "випадковий"?
HyperNeutrino

1
@HyperNeutrino це може бути настільки випадковим, як ви хочете, але не кидати виклик. Повтори дозволені.
Гравітон

Як ви збираєтеся перевірити, чи дійсно ми застосували правила? Я просто можу генерувати випадкове число під 50, і це технічно все-таки не порушило б жодне з правил, і я можу просто сказати, що це "слід" за правилами. EDIT: Зараз я розумію, що це не вийде, але люди знайдуть способи обійти випадкові правила. Ви збираєтесь запобігти цьому?
клісмік

1
На даний момент вибір одного з двох масивів [3 3 3 3 4 3]і [4 4 3 4 4], кожен з імовірністю 50%, відповідає тому, що написано в розділі "налаштування масиву". Тож я можу 19щоразу виводити ? (Звичайно, я дійсно думаю, що визначення "випадкового" потрібно уточнити.)
Грег Мартін

2
If the array contains a 20, and the third element is even/odd, що робити, якщо на цьому кроці у масиву менше 3 елементів?
Емінья

Відповіді:


8

Python 3, 294 301 287 356 байт

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)

Я не знаю, як ви заважаєте людям обходити правила, але для цього використовується зазначена процедура.

+7 байт; завдяки @YamB за збереження кількох байт; додано набагато більше, щоб виправити попередню помилку.
-14 байт завдяки @RootTwo і мені, а також виправив помилку.
+83 байт; це стає жахливо довгим, оскільки ОП продовжує змінювати правила. -знака кількість байтів завдяки @ZacharyT


Всі перевіряють у мене, дякую за чесність.
Гравітон

Ви можете зберегти 4 байти, імпортувавши 'randint як r' та змінивши ', якщо 7in k і 1not в k: k = [i-1 ...' to ', якщо 7in k: k = [i + 1-int (1in k ) ... '
Гравітон

При ініціалізації k вам не потрібно значення i, тому ви можете зберегти 6 байт за допомогою k=[r(1,20)for _ in'-'*r(5,11)]. Можна зберегти ще один байт, використовуючи k=[i+~-(1in k)*(7in k)for i in k]правила 1 і 2.
RootTwo

1
@ Notts90 Правила були змінені після написання цього виклику. Я виправлю це, коли доберуся до комп’ютера. Дякую.
HyperNeutrino

У рядках п'яти та сьомих у вас є зайвий пробіл після 1, і ви можете змінити printдругий та третій на останній рядки на p. А ви ... не оновили свій рахунок.
Zacharý

6

05AB1E , 91 байт

5TŸ.RF20©L.R})=D7åi<=D0åi>=}}D13åiD13k£=}D2åiDÈÏ=}D®åiDgs2èÉ®si*},q}[DO50›_#¨=]D16åiDOH,}O,

Спробуйте в Інтернеті! або З введенням


84 байти, і потенційно правильно? Інший? Не маю уявлення. tio.run/nexus/…
Чарівний восьминога

@carusocomputing: Я не переглянув це ретельно, але він не генерує випадковий масив на початку, а також не друкує проміжні результати. Буде трохи довше, коли додавати ці частини.
Емінья

6

Javascript (ES6), 344 342 340 342 335 331 333 313 311 305 298 297 290 289 283 279 байт

Huzzah! Нарешті пов'язані з биття Arnauld !

Після цього обміну * в коментарях виклику і після багато роздумів я вирішив використовувати new Dateяк насіння для генератора випадкових чисел замість Math.random(). Це означає, що всі цілі числа в масиві матимуть однакове значення.

_=>(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)

Спробуй це

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())

  • Збережено 2 байти, записавши лише елементи, що з'явилися у праві 6.
  • Збережено 2 байти заміною Array(x).fill()на [...Array(x)].
  • Додано 2 байти, тому що я зіпсував правило 5!
  • Збережено 7 байт, виправляючи безлад, я намагався виправити попередній безлад!
  • Збережено 3 байти завдяки Арноульду, який допомагає мені вилікувати мозковий подарунок за правилом 2 та врятував додатковий байт, замінивши на " +1a" ~.
  • Додано 2 байти забезпечення 0повернення для порожнього масиву.
  • Збережено 20 байт, нарешті з’ясувавши, як викинути цю whileпетлю.
  • Збережено 2 байти, замінивши ,останні 2 висловлювання на a |та видаливши додаток ().
  • Збережено 6 байт, замінивши console.logна alert.
  • Збережено 7 байт за рахунок покращення ярлика a.includes().
  • Збережено 1 байт, відредагувавши виконання правила 3.
  • Збережено 7 байт копанням includes()і просто використанням на indexOf()всьому протязі.
  • Збережено 1 байт, перемістивши початкове оголошення sзмінної туди, куди їй не знадобилася кома.
  • Збережено 6 байт, замінивши Math.random()на new Date.
  • Збережено 4 байти, видаливши (тепер зайве) округлення випадкових чисел.

Читається та Тестується версія

  • До коду додано розриви рядків та коментарі
  • Використовується console.logзамість alertдля вашого розуму! (Найкраще переглядається на консолі браузера)
  • До результату додано номер поточного правила.
  • Прокоментував генерацію випадкових масивів, щоб дозволити тестування шляхом введення списку чисел, розділених комами.


* Знімок екрана, якщо його видалено:


4

C (gcc) , 621 619 593 585 570 562 557 552 529 517 500 482 461 444 442 441 438 байт

Тут потрібна ціла велика кількість гольфу ... Виправлена ​​помилка, де вона буде надрукувати шістнадцятковий раз на кожні 16 у списку ...

Особлива подяка ZacharyT за допомогу в гольфі

#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);}

Спробуйте в Інтернеті!


1
Незважаючи на те, що ви все ще можете багато гольфу, ви вже на 1 байт нижче моєї відповіді на Java. ;)
Кевін Круїссен

Гаразд, знайшов щось на -3 байти; p
Кевін Круїссен

Якщо ви можете пограти вниз, ви, можливо, зможете отримати "перекреслений 444 все ще 444" там! : D
HyperNeutrino

@HyperNeutrino відіграв ще 2 байти
cleblanc

Так! Хороша робота: D
HyperNeutrino

3

JavaScript (ES6), 296 295 290 289 байт

Повна програма, яка записує початковий масив, проміжні результати та кінцеву суму на консоль.

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)

Як це працює

Це було стиснено за допомогою цього пакета JS .

Зламатися:

  • Запакований рядок: 226 225 байт
  • Код розпакування: 69 64 байт

Нижче наведено вихідний вихідний код з деякими додатковими пробілами та каналами рядків для читабельності. Замість того, щоб застосовувати стандартні трюки з гольфу, це було написано таким чином, щоб створити якомога більше повторюваних рядків, щоб сподобатися пакувальнику. Наприклад, синтаксис if(k=~a.indexOf(N))дублюється скрізь, хоча kвикористовується лише у 3-му правилі.

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))
}

Способи розпакування

Оригінальний код розпакування:

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

Усі наступні варіанти ES6 мають абсолютно однаковий розмір:

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])

Єдиний спосіб, який я знайшов поки що поголити кілька байтів, - це використовувати for ... of:

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

Читаючи це по телефону, тому я можу помилитися, але у вашому розпакованому коді схоже, що правило 2 застосовується незалежно від того, правило 1 чи ні.
Кудлатий

1
@Shaggy Це правильно. Але ви не можете отримати нуль, якщо не буде запущено правило 1.
Арнольд

D'oh! Звичайно! Людина, у мене під час цього виклику була смішна кількість мозкових дробів :(
Shaggy

1
@Shaggy На жаль, ні. Однак ми можемо зберегти один байт n&1^1(він зовсім не упаковується, а лише на один байт коротший !(n&1)). Я подумав про це в якийсь момент і забув включити його.
Арнольд

1
@Shaggy Ahah! Хороша робота!
Арнольд

2

Спершу спробуйте код гольфу!

Вже побили інші javascripters! Dangit! Я покращу !!! =)

Javascript -> 550 402 байт

Однозначно можна покращити. Стислий зараз:

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)

Оригінальний:

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 байт

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);}

-1 байт завдяки @Poke

Пояснення:

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

Вибірки вибірок :
коментарі за вибірковими виходами не друкуються, але я додав їх як уточнення.

Спробуйте тут.

[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
Зараз я
опускаюся

@cleblanc Я бачу, що ти зараз до 444. Я не можу конкурувати з цим Java. :) (Смішно сказати, що з 444 року немає перемоги в порівнянні з усіма іншими відповідями ..)
Кевін Круїйсен

Я знаю це, навіть мови для гольфу, як 05AB1E, майже 100 байт. Цей виклик був болем.
cleblanc

Чи можете ви залишити свій список загальним List a = new ArrayList()? Можна зберегти кілька байт. Можливо, вам потрібно буде додати машинопис, виконуючи фактичну арифметику. Якщо ні, Longто коротшеInteger
Poke

@Poke У загальному випадку Listя повинен використовувати (int)кастинг п'ять разів, а також змінити цикл для кожного циклу з intна Objectта додати шостий склад . Що стосується Long: спасибі, що економиться 1 байт :) (все одно доведеться змінити формат для-кожного з intна long, і r.nextInt(20)+1на r.nextInt(20)+1L).
Кевін Кройсейсен

2

Рубін 2,4, 260 байт

Ruby 2.4 потрібен для 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)

Спробуйте в Інтернеті! (Ні repl.it, ні tio.run ще не підтримують Ruby 2.4, тому ця інтернет-версія заміняється sumна inject(:+), яка має таку саму поведінку.)


1

R (3.3.1), 325 байт

Досить наївна реалізація; Я думаю, що я, мабуть, можу зробити його трохи коротшим.

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 байт

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

Спробуйте в Інтернеті!

Я хотів спробувати цю, хоча я подумав, що не переможу відповіді вже тут: PI намагався все-таки гольфувати це, я впевнений, що це можливо з меншим числом байтів. Знайшов кращий метод для шестигранної, але, ймовірно, міг би все-таки вдосконалитись.

Доводилося $aстільки разів кидати на рядок, то краще створити для неї фільтр ...

Було досить багато легких гольфів, які я пропустив, такі як дужки та пробіли. Можливо, ще є якісь там?

Дещо простіше читати код:

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 байт

Первісно я планував відповідь на один лайнер Octave, але вимагаючи виведення всіх застосованих правил зірвав мої плани. Натомість досить чітка відповідь MATLAB з кількома цікавими оптимізаціями, наприклад, використання cumsumзамість очевидного whileдля правила 6. Тим не менш, багато байтового числа витрачається на ifs, щоб запобігти виведенню, якщо правило не застосовується.

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

Спробуйте в Інтернеті!


0

Scala 587 байт один вкладиш

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, 763 байти як є

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(","))
  }
}

Оскільки це питання з кодовим гольфом, ми просимо вас зробити як мінімум легкі гольфи, такі як видалення непотрібного простору.
Ad Hoc Hunter Hunter

Я додав версію з низьким байтом рядка
Saideep Sambaraju

Я не знаю Scala, але чи потрібний простір a: Array[T]? У вас немає місця args:Array[String], саме це і стало результатом мого запиту.
Zacharý

ні, я думаю, я пропустив це.
Saideep Sambaraju

0

MATLAB, 228 241 байт

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

Це застосовуватиме всі правила в порядку, друкуючи значення масиву після кожного кроку.

Програма вийде з ладу за правилом 5, якщо отримана кількість елементів менше трьох. Наразі нічого не можна сказати, що має статися, якщо немає третього елемента, тому я припускаю, що аварія є прийнятною. Тепер програма надрукує 20, якщо менше 3 елементів, а один або більше - 20.

Цікаво, що етап 2 може бути застосований незалежно від того, чи був етап 1. Це тому, що вхідний масив ніколи не матиме 0 у ньому, що означає, що якщо в масиві є 0, це має бути результатом кроку 1, що відбувся.

Усі правила застосовуються по черзі, до 5, навіть якщо жодних змін не внесено. В результаті масив буде надрукований на початку, а потім після кожного кроку вгору до 5. Після кроку 5 ви отримаєте суму, якщо вона застосована, або немає результату до кроку 6. Додатковий рядок, що містить, aможе бути доданий після інший оператор, щоб переконатися, що значення масиву друкується після кроку 5 вартістю 2 байти.


Я також хотів би зазначити, що я не дивився на інші відповіді, поки не написав це. Зараз я бачу, що є ще одна відповідь MATLAB з деякою схожістю - всі вони збігаються.


0

Пітон 3, 297 293 289 , 278 байт

Як помітив Арнольд, ви не можете отримати 0, якщо не було застосовано правило 1, яке зберігається при відступі. Дякую всім іншим, хто також прокоментував пропозиції.

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))

Спробуйте в Інтернеті


Я не думаю, що вам не потрібен простір між andі ~.
Zacharý

Я вважаю, що from random import* a=b=sample(range(1,20),randint(5,10))економить кілька байт, оскільки ви можете видалити рядок 2.
nocturama

0

Perl 6 , 246 байт

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 $/

Безголівки:

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

Лист звичайний, 490 байт

Тут масив представлений як загальний список Lisp.

(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))))))

Як завжди, велике використання andі orяк контрольних структур.

(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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.