Сколько очков дает мой номерной знак?


31

(Это мой первый вопрос по коду-гольфу)

Когда я был ребенком, мы с отцом изобрели игру, в которой номерной знак, который мы видим на автомобилях, может давать определенные очки на основе довольно простых правил:

X количество одинаковых букв или цифр дает X-1 баллов, примеры:

22 = 1 point
aa = 1 point
5555 = 3 points

Числа должны быть рядом друг с другом, поэтому 3353дает только 1 балл, так как 5 разрывает последовательность 3-х.

Последовательность чисел X в порядке возрастания или убывания, как минимум 3, дает X баллов, примеры:

123 = 3 points
9753 = 4 points
147 = 3 points

Система баллов работает только для однозначных чисел, поэтому 1919не дает баллов и 14710дает только 3, (147).

Последовательности могут быть объединены, чтобы получить больше очков, примеры:

1135 = 4 points (1 point for 11 and 3 points for 135)
34543 = 6 points (3 points for 345 and 3 points for 543)

Однако вам не разрешается разбивать большую последовательность на две меньшие последовательности для дополнительных очков: 1234 = 123, 234 (6 points)не допускается.

Ваша задача, учитывая последовательность, определить количество баллов, которые дает номерной знак.

В Дании номерные знаки имеют следующую структуру: CC II III, где C - символ, а I - целое число, и, следовательно, входные данные моего примера будут отражать эту структуру. Если вы хотите, вы можете настроить последовательность в соответствии со своей собственной структурой или, если вы чувствуете себя действительно предприимчивой, позволить программе проанализировать структуру номерного знака и, таким образом, заставить его работать с любым типом номерного знака по всему миру. Явно укажите структуру, которую вы решили использовать в своем ответе.

Вы можете принимать входные данные любым удобным для вас способом: строка или массив кажутся мне наиболее подходящими.

Тестовый ввод | выход:

AA 11 111 | 5
AB 15 436 | 3
OJ 82 645 | 0
UI 65 456 | 6
HH 45 670 | 5
YH 00 244 | 5
AJ 00 754 | 1

Из-за природы выбора вашей собственной структуры или даже охвата всех структур, я не обязательно вижу, как можно точно определить победителя. Я предполагаю, что победителем будут самые короткие байты в структуре, которую он определил. (И не принимайте такие данные, как CICIC, просто чтобы вам было проще)

РЕДАКТИРОВАТЬ:

Из-за комментариев, у меня есть несколько дополнительных фрагментов информации: последовательность возрастающих или убывающих чисел относится к арифметической последовательности, поэтому X +/- a * 0, X +/- a * 1, ... X +/- a * n и т. д. Так, например, 3-5-7 - это 3 + 2 * 0, 3 + 2 * 1, 3 + 2 * 2. Последовательность, однако, не должна начинаться с 0 и заканчиваться на 0.

БОЛЬШЕ РЕДАКТИРОВАТЬ:

Вы можете вводить данные любым удобным для вас способом, вам не нужно вводить пробелы, тире или любые другие вещи, которые делают номерной знак более читабельным. Если вы можете сохранять байты, принимая только заглавные буквы или что-то подобное, вы можете сделать это также. Единственное требование - ваша программа может взять строку / массив / что угодно, содержащее как символы, так и цифры, и вывести правильное количество точек в соответствии с указанными правилами.


Слабо связаны . Добро пожаловать в PPCG и хороший первый вопрос!
г-н Xcoder

Похожий тест: XX 87 654. Я придумал что-то, что было правильно для всех ваших тестовых случаев, но как-то не правильно для этого .. Работаю над исправлением.
Кевин Круйссен,

7
Я настоятельно рекомендую вам исправить определенную структуру (я полагаю CCIIIII, без пробелов), иначе у этой проблемы нет объективного критерия выигрыша, который нам необходим здесь. Как есть, «(и не принимайте участие, такое как CICIC, просто чтобы вам было проще)» очень субъективно. Что такое и не является допустимой структурой?
Линн

1
@Lynn Допустимая структура - это структура, которая может фактически приносить баллы, CICIC никогда не будет иметь последовательность, которая дает какие-либо баллы, поэтому она недопустима. И, кроме того, почему «кратчайший ответ в байтах на выбранном языке программирования и выбранной структуре» не является четким, объективным критерием победы? Этот критерий выигрыша имеет прямое, простое в соблюдении правило, но дает разработчику свободу выбора, с какой структурой он хочет работать. Конечно, у него может быть много разных победителей, но, на самом деле, и что?
Troels MB Jensen

3
Тестовый пример: IA99999(содержит убывающую последовательность кодовых точек, но не чисел).
Згарб

Ответы:


7

05AB1E , 25 22 20 18 байт

Принимает строку строчных букв и цифр без пробелов.

Ç¥0Kγ€gXK>OIγ€g<OO

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


Я не могу прочитать 05AB1E без объяснения;) Но вы можете сохранить байты, получая ввод без пробелов?
Кевин Круйссен

@ Mr.Xcoder Я тоже в этом сомневаюсь. Но я лично не могу прочитать 05AB1E, поэтому я подумал, что, возможно, Emigna добавил какой-нибудь код, чтобы избавиться от пробелов или игнорировать их. Вероятно, он делает это неявно без каких-либо дополнительных байтов, но я просто спросил, если это не так.
Кевин Круйссен,

Я просто взял твой код для свинга и, черт возьми, он действительно работает для любой длины и последовательности! Единственная «проблема» в том, что он также дает 3 балла за ABC, что само по себе не является ошибкой, я просто не учел это, поскольку в Дании у нас есть только 2 буквы рядом друг с другом.
Troels MB Jensen

2
@KevinCruijssen: пробелы во входе не сохранят несколько байтов. Я пропустил ту часть, где мы могли решить это сами. Спасибо за внимание. (Объяснение также идет).
Emigna

@ Emigna Я не сформулировал это прямо в вопросе, я подумал, что достаточно намекал на это, когда писал. Вы можете воспринимать входные данные любым удобным для вас способом, мне кажется, что строка или массив имеют для меня наибольшее значение. ,
Troels MB Jensen

7

Шелуха , 20 16 15 байт

-1 байт благодаря @Zgarb

Принимает ввод без пробелов и в нижнем регистре.

ṁ??¬o→LεL←gẊ¤-c

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

объяснение

           Ẋ      Map over all adjacent pairs
            ¤-c   get the difference of their codepoints
          g       Split into groups of equal elements
ṁ                 Map then sum
 ?       ←          If the head of the list is truthy (not 0)
  ?    ε              If the length of the list is 1
   ¬                    return 0
                       Else
    o→L                 return the length + 1
                     Else
        L             return the length

Я думаю, что K0может быть ¬здесь.
Згарб

Хм, это похоже на неудачу IA99999.
Згарб

@Zgarb, изменил формат ввода на нижний регистр.
H.PWiz


2

Java 8, 195 байт

a->{int r=a[0]==a[1]?1:0,i=3,j,p=a[2],x,y,z;for(;i<7;p=a[i++])for(r+=(x=a[i])==p?1:0,j=-4;++j<4;r+=j==0?0:i<6&&p+j==x&x+j==(y=a[i+1])?++i<6&&y+j==(z=a[i+1])?++i<6&&z+j==a[i+1]?5:4:3:0);return r;}

Определенно можно играть в гольф, используя другую технику для проверки последовательности.

Объяснение:

Попробуй это здесь.

a->{                      // Method with character-array parameter and integer return-type
  int r=                  //  Result-integer
        a[0]==a[1]?       //   If the two letters are equal:
         1                //    Start this result-integer at 1
        :                 //   Else:
         0,               //    Start the result-integer at 0 instead
      i=3,j,              //  Index-integers
      p=a[2],x,y,z;       //  Temp integers
   for(;i<7;              //  Loop (1) from index 3 to 7 (exclusive)
       p=a[i++])          //    And after every iteration: Set `p` and raise `i` by 1
     for(r+=(x=a[i])==p?  //   If the current digit (now `x`) equals the previous `p`:
             1            //    Raise the result-integer by 1
            :             //   Else:
             0,           //    Keep the result-integer the same
         j=-4;++j<4;      //   Inner loop (2) from -3 to 3 (inclusive)
       r+=j==0?           //    If `j` is 0:
           0              //     Skip it, so keep the result-integer the same
          :i<6            //    Else-if `i` is not 6,
           &&p+j==x       //    and the previous digit `p` + `j` equals the current digit,
           &x+j==(y=a[i+1])?
                          //    and the current digit `x` + `j` equals the next digit `y`:
            ++            //     Raise index `i` by 1 first,
              i<6         //     and check if `i` is not 6 again,
              &&y+j==(z=a[i+1])?
                          //     and if the new current digit `y` + `j` equals the next digit `z`:
               ++         //      Raise index `i` by 1 first again,
                 i<6      //      and check if `i` is not 6 again,
                 &&z+j==a[i+1]?
                          //      and if the new current digit `z` + `j` equals the next digit:
                  5       //       Raise the result-integer by 5
                 :        //      Else:
                  4       //       Raise it by 4 instead
              :           //     Else:
               3          //      Raise it by 3 instead
           :              //    Else:
            0             //     Keep it the same
     );                   //   End of inner loop (2)
                          //  End of loop (1) (implicit / single-line body)
  return r;               //  Return the result-integer
}                         // End of method


1

R , 153 , 145 , 143 байт

function(x){p=0;s=sum;if(x[1]==x[2])p=1;a=diff(strtoi(x[3:7]));p=p+s(a==0);l=sort(table(a[a!=0]),T);(p=p+s(l[(l[((s(l)>0)&(l[1]>1))]+1)>2]+1))}

Анонимная функция, которая принимает символьный вектор и возвращает целое число.
Ожидаемый вкладz(c("A", "A", "1", "1", "1", "1", "1"))

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

Неуправляемая версия

function(x){
  pnt <- 0; s <- sum
  if(x[1] == x[2]) pnt <- 1
  a <- diff(strtoi(x[3:7]))
  pnt <- pnt + s(a == 0)
  l <- sort(table(a[a!=0]), T)
  (pnt <- pnt + s(l[(l[((s(l) > 0) & (l[1] > 1))] + 1) > 2] + 1))
}


0

Pyth , 48 42 байта

Прямой порт из моего ответа Python. Принимает ввод в виде байтовой строки с строчными буквами как: b'aa11111 '.

Я впервые пишу на Pyth, поэтому любые советы приветствуются: D

KJ=b0VQ=d&KqK-NJ=+b+qNJ*dZ=Z-3yd=K-NJ=JN;b

Попробуй здесь


0

JavaScript, 216 192 186 202 201 байт

function f(s){var a=s.split(" "),c=a[1],a=a[0],r,h=b=i=p=0;for(i=0;i<4;i++){if(i<2&(r=a[i+1]-a[i]==a[i+2]-a[i+1])){p++;b=2}if(i>0){if(a[i]==a[i-1]){p++;h++}if(i<3&c[i]==c[i-1])p++}}return h==4?p+b:p-b}

Unminified

function f(s){
    var a=s.split(" "),c=a[1],a=a[0],r,h=b=i=p=0;
    for(i=0;i<4;i++){
        if(i<2&(r=a[i+1]-a[i]==a[i+2]-a[i+1])){
            p++;
            b=2
        }
        if(i>0){
            if(a[i]==a[i-1]){
                p++;
                h++;
            }
            if(i<3&c[i]==c[i-1]) 
                p++;
        }
    }

    return h==4?p+b:p-b
}

Редактировать историю:

  • Сузили код, чтобы работать только с 0000 XXXформатом. (-24 байта)
  • Редактирует в соответствии с предложением @Titus. (-6 байт)
  • исправлена ​​ошибка, при которой четыре одинаковых числа давали оценку 7 вместо 3. (+16 байт)
  • Удалена последняя точка с запятой. (-1 байт)
  • Исправлена ​​опечатка в коде. (без изменения байтов)

Как мне посчитать байты?
Брайан Х.


я действительно ненавижу тот факт, что кодовый блок не распознает язык ...
Брайан Х.

Хотите подсветку синтаксиса?
H.PWiz

Кстати, 0000дает 7 баллов, это правильно? (это читается как арифметическая последовательность и повторяющаяся последовательность чисел одновременно)
Брайан Х.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.