分割标记的标记


21

挑战

马克是一个学生,他N在一行中以串联的方式获得他的分数。

面临的挑战是将自己的标记分开,知道每个标记只能是0123456789或或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 '18

所以不用担心。
user202729 '18

是否要求输出与输入的顺序相同?

Answers:


6

Brachylog23 21字节

-2个字节归功于Fatalize

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

在线尝试!

输入是一对[Line, N]

这是我的第一个Brachylog程序,因此可能还有很多改进的余地。

当行的长度> 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。尽管可能很慢,因为整数解构必须通过约束即使对于未知整数也必须有效,这使其效率低下。
致命的

(还请注意,使用ht获取第一个/最后一个元素比使用两者更有效(在大多数程序中甚至不起作用))。
致命的

@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

V17,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'

十六进制转储:

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

替代解决方案:

\ÓòÀGjç1î0/J

不幸的是,这被替换101 0


4

红宝石,57个字节

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

在线尝试!

事实证明,这可能不是最复杂的方法,但暂时替代10hex 似乎是一个有趣的主意A,顺便说一句,它也是一个很高的分数(如果考虑AF分级系统,则:)




4

Python 3中71 68 59个字节

多亏了ovs,它又减少了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' else10 for
mdahmoune

@mdahmoune感谢您的注意,我很难记住可以一起榨干什么。
Gigaflop

8
一般经验法则:基本上,除两个字母外,其他任何东西都可以压在一起。如果遇到语法错误,请添加随机空格,直到它起作用为止:)
Quintec,

也有一些例外,例如<number>e<letter><number>f'
user202729 '18

3
59个字节,方法是用a替换10并将每个字符作为基数11 int:读取lambda n,s:[int(c,11)for c in s.replace('10','a',len(s)-n)]
ovs '18

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 ylength 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节点) 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字节

@ guest271314节省了5个字节

将输入作为(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()
Arnauld

1
我们可以将所有内容强制为+1个字节的整数。
Arnauld

59字节eval(`[${s}]`.replace('1,0',10))
guest271314

@ guest271314谢谢!不错的收获。
Arnauld

2

Java(OpenJDK 8),78字节

使用Streams 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代替":"(9后的ASCII字符)。然后通过获取字符串中每个字符的ASCII值将其拆分为数字。

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

在线尝试!



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.