Утомительный массив из 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, и оно все равно технически не нарушит ни одно из правил, и я могу просто сказать, что оно «следует» правилам. РЕДАКТИРОВАТЬ: Теперь я понимаю, что это не сработает, но люди найдут способы обойти случайные правила. Вы собираетесь предотвратить это?
clismique
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 элементов на этом этапе?
Emigna

Ответы:

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 байта; это становится ужасно долго, потому что OP продолжает менять правила. небольшое количество байтов благодаря @ZacharyT

HyperNeutrino
источник
Все проверено мной, спасибо за честность.
Гравитон
Вы можете сохранить 4 байта, импортировав 'randint as r' и изменив 'если 7in k и 1 not в k: k = [i-1 ...' на 'if 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. И вы ... не обновили свой счет.
Захари
6

05AB1E , 91 байт

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

Попробуйте онлайн! или с вводом

Emigna
источник
84 байта, и, возможно, правильно? Другой? Без понятия. tio.run/nexus/…
Волшебная Урна Осьминога
@carusocomputing: я не просмотрел его полностью, но он не генерирует случайный массив в начале и не выводит промежуточные результаты. Будет немного дольше при добавлении этих частей.
Emigna
6

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

Ура! Наконец связаны с биений 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, и сохранили дополнительный байт, заменив a +1на a ~.
  • Добавлены 2 байта, обеспечивающие 0возврат для пустого массива.
  • Сэкономили 20 байтов, наконец выяснив, как угробить эту чертову whileпетлю.
  • Сохранено 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);}

Попробуйте онлайн!

cleblanc
источник
1
Даже несмотря на то, что вы все еще можете играть в гольф, вы уже на 1 байт ниже моего ответа на Java ... XD Посмотрим, смогу ли я как-нибудь сыграть в гольф, чтобы побить ваше текущее представление. ;)
Кевин Круйссен
Хорошо, нашел что-то для -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используется только в третьем правиле.

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)
Arnauld
источник
Читая это по телефону, я могу ошибаться, но в вашем распакованном коде похоже, что правило 2 применяется независимо от того, действительно ли правило 1.
Лохматый
1
@ Shaggy Это правильно. Но вы не можете получить ноль, пока не сработает правило 1.
Арно
D'о! Конечно! Чувак, у меня было нелепое количество умов во время этого испытания :(
Лохматый
1
@ Shaggy К сожалению нет. Тем не менее, мы можем сохранить один байт n&1^1(он вообще не упаковывается, а на один байт короче !(n&1)). Я думал об этом в какой-то момент и забыл включить его.
Арно
1
@ Шэгги Ахах! Хорошая работа!
Арно
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)

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

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 С универсальным Listя должен использовать (int)приведение пять раз, а также изменить цикл for-each с intна Objectи добавить шестое приведение. Что же касается Long: спасибо, что сохраняет 1 байт :) (все равно придется изменить для каждого из- intдо long, и r.nextInt(20)+1в r.nextInt(20)+1L).
Кевин Круйссен
2

Ruby 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)
Giuseppe
источник
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

Попробуйте онлайн!

Sanchises
источник
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(","))
  }
}
Saideep Sambaraju
источник
Поскольку это вопрос кода в гольф, мы просим вас сделать хотя бы легкие игры в гольф, например, удалить ненужные пробелы.
Специальный охотник за
Я добавил однобайтовую версию
младшего
Я не знаю Scala, но a: Array[T]требуется ли место? У вас нет места args:Array[String], что и привело к моему запросу.
Захари
Нет, я думаю, что пропустил это.
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может быть добавлена дополнительная строка, содержащая оператор else, обеспечивающий печать значения массива после шага 5 стоимостью 2 байта.


Я также хотел бы отметить, что я не смотрел на другие ответы, пока не написал это. Теперь я вижу, что есть другой ответ MATLAB с некоторыми сходствами - все они совпадают.

Том Карпентер
источник
0

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

Попробуйте онлайн

Notts90 поддерживает Монику
источник
Я не думаю, что вам нужно пространство между andи ~.
Захари
я считаю, что 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 $/

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

Common Lisp, 490 байт

Здесь массив представлен в виде списка Common 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
Renzo
источник