Марк Сплит Марк


21

Вызов

Марк студент, который получает свои Nоценки в каскадном виде в одну строку.

Задача состоит в том, чтобы отделить его оценки, зная, что каждый знак может быть только 0или 1или 2или 3или 4или 5или 6или 7или 8или 9или или 10.

вход

N натуральное число и одна строка.

Выход

Набор натуральных чисел.

пример

N, One line------------------> Set of marks
3, '843'---------------------> [8, 4, 3]
1, '0'-----------------------> [0]
2, '1010'--------------------> [10,10]
3, '1010'--------------------> [1,0,10] or [10,1,0] 
4, '1010'--------------------> [1,0,1,0]
9, '23104441070'-------------> [2, 3, 10, 4, 4, 4, 10, 7, 0]
12,'499102102121103'---------> [4, 9, 9, 10, 2, 10, 2, 1, 2, 1, 10, 3]
5, '71061'-------------------> [7, 1, 0, 6, 1]
11,'476565010684'------------> [4, 7, 6, 5, 6, 5, 0, 10, 6, 8, 4]
4, '1306'--------------------> [1, 3, 0, 6]
9, '51026221084'-------------> [5, 10, 2, 6, 2, 2, 10, 8, 4]
14,'851089085685524'---------> [8, 5, 10, 8, 9, 0, 8, 5, 6, 8, 5, 5, 2, 4]
11,'110840867780'------------> [1, 10, 8, 4, 0, 8, 6, 7, 7, 8, 0]
9, '4359893510'--------------> [4, 3, 5, 9, 8, 9, 3, 5, 10]
7, '99153710'----------------> [9, 9, 1, 5, 3, 7, 10]
14,'886171092313495'---------> [8, 8, 6, 1, 7, 10, 9, 2, 3, 1, 3, 4, 9, 5]
2, '44'----------------------> [4, 4]
4, '9386'--------------------> [9, 3, 8, 6]

правила

  • Когда возможно несколько выходов, дайте только один выход.
  • Только знак значения 10стоит с двумя десятичными знаками, остальные - с одним десятичным.
  • Ввод и вывод может быть дан в любом удобном формате
  • Нет необходимости обрабатывать неверный ввод
  • Либо полная программа или функция приемлемы. Если функция, вы можете вернуть вывод, а не распечатать его.
  • Если возможно, укажите ссылку на среду онлайн-тестирования, чтобы другие люди могли опробовать ваш код!
  • Стандартные лазейки запрещены.
  • Это поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).

Вот фрагмент n, 'string'кода Python, который я использовал для получения пар из примера текстового блока с копией:spl = [item.split('-')[0] for item in text.split('\n')]
Gigaflop

3
Плз, некоторые комментарии для
отрицательных

Downvotes не требуют оставлять комментарии по причине. Нет ничего, что можно улучшить в этой задаче.
user202729

Так что не беспокойся об этом.
user202729

Должны ли выходы быть в том же порядке, что и вход?

Ответы:


6

Brachylog , 23 21 байт

-2 байта благодаря Fatalize

h~c.{ịℕ≤10&ịṫ?∧}ᵛ&t~l

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

Вход представляет собой пару [Line, N].

Это моя первая программа на брахилоге, поэтому, вероятно, есть много возможностей для улучшения.

Это очень медленно, когда длина линии> 7.

Объяснение:

h~c.{ịℕ≤10&ịṫ?∧}ᵛ&t~l
h                         The first element in the input
 ~c                       is formed by concatenating
   .                      the elements in the output array
   .{         ∧}ᵛ     AND For every element in the output array holds that
     ị                      The element converted to an integer
      ℕ                       is a natural number
       ≤10                    and less than or equal to 10
          &ịṫ?              and it has no leading zeroes (*)
                 &t   AND The second element of the input
                   ~l     is the length of the output 

(*) ịṫ?проверяет, что нет начальных нулей. Он преобразует строку в целое число, а затем обратно в строку и сравнивает с исходной строкой.


Вам не нужно вводить число в виде строки, просто используйте целое число. Это устраняет необходимость для всех тех , и для ведущего нуля проверки: h~c.{ℕ≤10}ᵛ&t~l. Это, вероятно, медленнее, хотя деконкатенация на целых числах должна работать даже для неизвестных целых чисел через ограничения, что делает его неэффективным.
Роковая

(Также обратите внимание, что использование hи tдля получения первого / последнего элемента более эффективно, чем использование для обоих (что в большинстве программ даже не будет работать)).
Роковая

@Fatalize Я понял, что строка ввода может содержать начальные нули, поэтому было бы невозможно использовать целое число в качестве ввода.
fergusq

Правильно, это раздражает ...
Fatalize

5

Perl 6 , 25 байт

->\a,\b{b~~/(10|.)**{a}/}

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

Блок анонимного кода, который принимает число и строку и возвращается как объект Match.

Объяснение:

->\a,\b{                }  # Anonymous code block taking params a and b
        b~~/           /   # Match using b
            (10|.)           # 10 or a single digit
                  **{a}      # Exactly a times, being greedy

5

Python 3 , 47 байт

lambda s,n:[*s.replace(b'\1\0',b'\n',len(s)-n)]

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

Принимает "одну строку" как строку байтов с необработанными байтами \x00 - \x09. Если это не приемлемо:

Python 3 , 56 байт

lambda s,n:[x-48for x in s.replace(b'10',b':',len(s)-n)]

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

Принимает "одну строку" в качестве строки.


5

V , 17 , 12 байтов

\ÓòÀGjí1“î…0

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

Я был доволен 17 байтами, но 05AB1E пришел вместе с 13, и я не мог оставить вызов без ответа. : D

\Ó                      " Put each character on it's own line
  ò                     " Recursively (repeat until an error happens)...
   ÀG                   "   Go to the "n"th line
     j                  "   Move down a line (this will error if there are exactly "n" lines)
      í                 "   Remove...
       1                "     a '1'
        <0x93>          "     START THE MATCH HERE
              î         "     a newline
               <0x85>   "     END THE MATCH HERE
                   0    "     a '0'

HexDump:

00000000: 5cd3 f2c0 476a ed31 93ee 8530            \...Gj.1...0

Альтернативное решение:

\ÓòÀGjç1î0/J

К сожалению, это заменяет 10с1 0


4

Рубин , 57 байт

->n,m{m.sub!"10",?A while m[n];m.chars.map{|c|c.to_i 16}}

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

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




4

Python 3 , 71 68 59 байт

вниз еще 9 байтов благодаря овс.

lambda n,s:[int(c,11)for c in s.replace('10','a',len(s)-n)]

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

Я изначально пытался использовать str.partition()рекурсивно, но использование replaceударило меня по лицу вскоре после этого. Кто-нибудь может улучшить это?

Кроме того, вот ссылка TIO, которую я использовал, чтобы превратить контрольные примеры во что-то более копируемое / вставляемое


1
-3 байт: падение пространство между : [cи 'x' elseи10 for
mdahmoune

@mdahmoune Спасибо, что заметили, мне трудно вспомнить, что можно раздавить вместе.
Gigaflop

8
Общее правило: в основном все, кроме двух букв, можно сжать вместе. Если вы получаете синтаксическую ошибку, добавьте случайные пробелы, пока она не
заработает

Есть некоторые исключения , такие как <number>e, <letter><number>, f'.
user202729

3
59 байт путем замены 10 с и чтения каждого символа в качестве основы 11 INT: lambda n,s:[int(c,11)for c in s.replace('10','a',len(s)-n)].
Ов

3

Haskell , 98 байт

n!x=[y|y<-s x,y==take n y]!!0
s('1':'0':x)=do y<-s x;[1:0:y,10:y]
s(x:y)=(read[x]:)<$>s y
s _=[[]]

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

объяснение

Функция sделает все возможные разбиения, например: "1010"становится [[1,0,1,0],[10,1,0],[1,0,10],[10,10]], обратите внимание, как самые длинные разбиения заканчиваются в начале (потому что 1:0:yпредшествует раньше 10:y).

Имея это в виду, мы можем взять все эти значения и отфильтровать ys, где y == take n yсохраняются также расщепления, которые короче, чем требуется. Например, 4мы оставляем список тем же[[1,0,1,0],[10,1,0],[1,0,10],[10,10]] .

Теперь мы можем просто получить первый элемент в этом списке, потому что входные данные всегда будут действительны (например, 5!"1010"тоже дадут [1,0,1,0], но нам не нужно обрабатывать это).

Примечание: я как-то неправильно подсчитал .. y==take n yтакой же длины как length y==n: S




2

05AB1E , 13 байтов

.œsù.ΔïTÝÃJ¹Q

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

объяснение

.œ              # partitions of the first input
  sù            # of a length equal to the second input
    .Δ          # find the first partition that returns true when:
      ï         # each element is converted to integer
       TÝÃ      # and only numbers in [0 ... 10] are kept
          J     # then join it together
           ¹Q   # and compare it to the first input for equality

2

JavaScript (Babel Node) ,  70 69  59 байт

Принимает вход как (n)(line).

n=>s=>(a=s.match(/10|./g)).flatMap(x=>x>9&&!a[--n]?[1,0]:x)

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

комментарии

n => s =>                       // given n and s
  (a = s.match(/10|./g))        // split s into marks; a '1' followed by a '0' is always
                                // interpreted as '10'
  .flatMap(x =>                 // for each mark x:
    x > 9 &&                    //   if x = '10',
    !a[--n] ?                   //   then decrement n; if a[n] is undefined:
      [1, 0]                    //     yield [1, 0]
    :                           //   else:
      x                         //     yield the mark unchanged
  )                             // end of flatMap()

JavaScript (ES6),  64  59 байт

Сохранено 5 байтов благодаря @ guest271314

Принимает вход как (n)(line).

n=>g=([...s])=>1/s[n]?g(eval(`[${s}]`.replace('1,0',10))):s

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

комментарии

n =>                            // main function, taking n
  g = ([...s]) =>               // g = recursive function, taking s
                                //     (which is either a string or an array)
    1 / s[n] ?                  // if s[n] is defined (i.e. we have too many marks):
      g(                        //   do a recursive call to g:
        eval(                   //     build a new array by evaluating ...
          `[${s}]`              //       ... the string representation of s[] where the
          .replace('1,0', 10)   //       first occurrence of '1,0' is replaced with '10'
        )                       //     end of eval()
      )                         //   end of recursive call
    :                           // else:
      s                         //   return s

Почему выходные данные для N = 3 и line = '1010' имеют смешанные типы [1, 0, '10']?
mdahmoune

s.match()возвращает массив строк, но a "10"может быть разбит на [1,0](2 целых числа) в функции обратного вызова flatMap().
Арно

1
Мы можем привести все к целым числам за +1 байт .
Арнаулд

59 байтовeval(`[${s}]`.replace('1,0',10))
guest271314

@ guest271314 Спасибо! Хорошо поймал.
Арнаулд

2

Java (OpenJDK 8) , 78 байт

Хороший однострочник, использующий потоковый API.

(n,l)->l.join(":",l.split("10",l.length()-n+1)).chars().map(i->i-48).toArray()

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


Как это устроено

(n,l)->                     // Lambda function taking int and string
  l.join(":",               // Join the following array with colons
    l.split("10",           // Split the original string on "10"...
      l.length()-n+1))      // But limit the parts to the difference between the length
                            // and expected length, to only remove  required number of 10s              
  .chars()                  // Convert to an intstream of codepoints
  .map(i->i-48)             // Remove 48 to get the numeric value of each codepoint
  .toArray()                // Return an int array

2

R , 63 байта

Хотя длина строки больше, чем n , замените следующие 10, которые вы достигнете, на ":"(символ ASCII после 9). Затем разделите на числа, взяв значение ASCII каждого символа в строке.

function(n,x){while(nchar(x)>n)x=sub(10,":",x);utf8ToInt(x)-48}

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



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.