格式化单词列表


16

您面临的挑战是在多行中设置不超过给定字符数的单词列表格式,以使每行包含尽可能多的单词,而不必切除所有单词。

输入值

输入将是一个用空格分隔的单词列表,然后是一个至少为4的数字。

输出量

输出应该是按行分组的输入单词,以便没有一行包含比输入数字更多的字符。单词应按输入顺序输出。单词之间应以逗号分隔,然后以空格隔开,但在每行末尾则不需要空格。如果单词太长而无法容纳在一行中,则应在遵循其他规则的同时将其尽可能少地截断,并在末尾添加“ ...”。

测试用例

Input:
foo bar baz qux 12

Output:
foo, bar,
baz, qux


Input:
foo bar baz qux 5

Output:
foo,
bar,
baz,
qux


Input:
strength dexterity constitution intelligence wisdom charisma 10

Output:
strength,
dexterity,
consti...,
intell...,
wisdom,
charisma


Input:
quas wex exort 4

Output:
...,
wex,
e...


Answers:


10

无法读取,2559个字节

这个挑战非常适合不可读的人。

它的第一个版本是3379字节,只是让您知道我打了多少高尔夫球。

程序完全按照挑战中的描述接受输入:用空格分隔的单词列表(也可以包含数字和标点符号),然后是空格和至少为4的整数(较低的数字会生成无限循环) 。

'“”“”“”“”“”“”“”“”“”“”“”“”“”“'”“”“”“”“”“”“”“”“”“” “'”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” '“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”'“”“”“”“”“”“”“”“”“”“”“”“”'“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “'”“”'“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”'“”“”“”“”“”“”“”“”“”“”“” “'”“'”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”““”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” '“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”'“”“”“”“”“”“”“”“”“”“”“”“”'“”“”“”“”“”“”“”“” “”“”“'”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “'”“”'“”“”“”“”“”“”“”“”“”“”“'”“”“”“”“”“”“”“”“”'“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”'“”“”“”“”“”“”“”“”“”“”“”“'”“”“”“”“”“”“”“”“”“”“” '“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “'”“'”“”“”“”“”“”“”“”“”“”“”“”“'”“”“”“”“”“”“”““”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“'”“”“”“”“”“”“”“”“” “'”“'”“”“”“”“”“”“”“”“”“”“”“”“'”“”“”“”“”“”“”“”““”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“'”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“'”“”“”“”“”“”“”“”“”“”“”'“”“”“”“”“”“”“”“”“” '“”“”“”“”“”“”“”“”“”“”“”“”“”“”“'”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”

说明

我将向您介绍该程序如何处理输入thyme horseradish peppermint 10。预期的输出是thyme,\nhorser...,\npeppermint

首先,我们从7号单元格开始,读取整个输入,但从每个字符中减去32,以便空格变为零。

出于明显的原因,这将运行指针(在此处命名为p,存储在单元#0中)留在最后。我们使用一个while循环来查找最后一个间隙,该间隙是定义输出宽度的数字的开头(在此示例中为单元格#36)。

现在,我们要解码数字(即从十进制转换)。最终结果将在单元格tr中。我们依靠它们从零开始的事实。

对于数字中的每个数字,请执行以下操作:

  • t设置为-15。
  • 在while循环中,将r(包含到目前为止的结果)减至-1(因为我们需要精确地进行r次迭代,但是由于减数发生在将其作为while循环的条件进行检查之前,因此减为0会减少一次迭代)对于每次迭代,将10加到t。现在t包含前一个结果减10的10倍。
  • 再次在while循环中,将* p递减为0,并为每次迭代将t加1 。在此之后牛逼包含了到目前为止正确的中间结果:字符'0''9'ASCII代码为48-57,32较早减法他们是16-25后如此,所以我们实际上增加15-24到牛逼,这与-15取消我们将其设置为更早。同样重要的是,这会将用于包含数字字符的单元格清零,以便后续代码可以识别单词列表的末尾。
  • r设置为新的中间结果,以便下次迭代在r中找到它。(请注意,我们不需要再次读取t,我们可以使用上一个while循环中的最后一个值,因为我们知道* p不能为零,因此它至少运行了一次。)

最后,我们使用另一个简单的while循环(将t减为计数器)将我们刚刚计算出的数字转换为一元。我们从单元格#0向左存储一串1。这依赖于这样的事实,即单元格#1(我们为此(q)的运行指针)从0开始。我们少得到1,因为Unread中的while循环是这样的:

此后,我们不再需要r中的值,因此我们将该单元格重新用于其他用途。我们重置指针pq,并使用稍后需要的字符的ASCII码初始化一些单元格。我还标记了cs,我们将在以后使用,我们将依赖于s从零开始的事实:

嘿等一下 为什么单元格0的颜色是红色的?还记得我们输出的1太少了吗?诀窍是我们将单元格#0用作“扩展名”来对此进行更正。之所以有效,是因为我们知道p永远不会为0。这样,红色块现在宽了10个单元,正好是我们想要的数字。它还保存9个字符,以便能够将q初始化为1而不是0。

现在,我们进入遍历单词的while循环并将其全部输出。

步骤1:找出下一个单词是否适合当前行。我们可以简单地将p移至右侧,q移至左侧,同时使用while循环,直到p到达下一个间隙:

现在p在单词的右边,我们可以通过检查*(p + 1)是否为零来检查这是否是列表中的最后一个单词。我们还存储值(在我们的例子是72,因为它是“H”,从“辣根”零下32)ç,因为我们稍后会再需要它。在这种情况下,它不为零,因此我们将需要与单词一起输出逗号,因此单词要长一个字符。通过减少q一次来考虑这一点。最后,使用另一个while循环将p返回到单词的开头。

现在我们知道该单词将适合当前行,因为q指向一个非零值,所以我们要做的就是:

  • 再次在单词中向前移动p,打印每个字符(加32,因为所有ASCII码都减32)。
  • 如果c不为零,则打印逗号(使用单元格5中的值)。
  • s设置为非零值,以指示下一次迭代我们不再位于行首,因此需要在下一个单词之前输出一个空格字符。(为此,我们重复使用上述打印语句的返回值,逗号为44。)

到目前为止的输出: thyme,

然后,大循环的下一次迭代开始。和以前一样,当我们从左到右遍历单词时,通过减小q来检查下一个单词是否适合该行的其余部分。请注意,与上一次迭代相比,q仍为-5,以跟踪当前行中已经打印了多少个字符。在“辣根”,加上一个逗号,加上一个计数的字符,因为之后小号是表明我们需要输出空间,以及不为零,q将有超调的1的块的结尾:

现在q指向零单元格,这意味着“辣根”将不适合当前行。现在,我们取决于s是否为非零。在我们的情况下,这意味着我们需要换行到下一行。我们要做的就是:

  • 打印换行符(使用单元格3)
  • q设置回1
  • s设置为0

到目前为止的输出: thyme,\n

对于下一次迭代,p与以前位于相同的位置,因此我们将再次查看相同的单词。和以前一样,我们计算“辣根”中的字符,当发现后面还有另一个单词时,将c再次设置为80 ,将逗号减q,然后将p倒回到单词的开头:

与上一次迭代一样,我们发现“辣根”仍然不合适,因为q最终出现在零单元格上。但是,这次s为零,这意味着我们做的事情与上次不同。我们需要输出一些单词,三个点和一个逗号。我们的宽度是10,所以我们需要输出6个字符的单词。让我们看看如果我们完成以下任务:

  • 查找红色块1的开头。我们可以通过右移来做到这一点,因为我们知道q必须在左移。
  • 如果我们还需要输出逗号(c ≠0),请再次增加q

磁带现在看起来像这样:

我在这里标记了6个单元格的跨度。如您所见,我们需要输出字符,直到q = -1。检查该代码非常有效(基本上是while ((++q)+1) { ... })。所以:

  • 打印这些字符(加上32,因为所有ASCII码都减去32),直到q达到-1。然后,p将在单元格19中的“辣根”中间。
  • 打印三个点。由于print命令返回其自己的参数,因此我们可以有效地代码嵌套(本质上为print(print(print('.'))))。我们从单元格#5中获取ASCII值,并将其加2以得到点的ASCII码。
  • p移至单词的末尾。既然我们知道我们还没有到达单词的末尾(因为单词太长了,我们必须从单词中删除至少3个字符以适应点),所以此循环肯定至少有一个迭代,因此代码中使while循环的主体计算点的ASCII值,然后将while循环的返回值传递给打印函数的代码较短。
  • 如果c不为零,则打印逗号。

完成所有这些操作后,我们还打印了换行符(使用3号单元格),并将q设置为1。即使s已经为0,我们也可以将s设置为0,这与我们之前将其包装到下一行(当s非零时),因此为了避免重复代码,我们在检查s的条件之后执行此操作。

到目前为止的输出: thyme,\nhorser...,\n

仅剩一次迭代。这次,在计算单词的字母之后,我们得到:

这次,在p之后没有任何内容,因此我们将c设置为0表示“无逗号”,因此,我们不再将q减一。由于q现在指向一个非零的单元格,因此我们知道该单词将适合,因此执行与第一次迭代相同的代码,只是这次c为零,因此它根本不会打印逗号。

输出: thyme,\nhorser...,\npeppermint

在本演练中,我没有涉及代码实际打印空格的情况,但是我认为现在应该很清楚了。如果代码发现单词适合(* q ≠0)并且s不为零,它将仅在单词之前输出一个空格。


3

JavaScript(ES6),171

作为匿名函数,将输出作为数组返回

(因为除非明确禁止,通常允许这样做:meta meta

s=>(s=s.split` `,n=s.pop()-1,t='',o=[],s.map((w,i)=>(w=w[n+=!s[i+1]]?w.slice(0,n-3)+'...':w,(t+w)[n-2]&&(t&&o.push(t.slice(1)),t=''),t+=` ${w},`)),o.push(t.slice(1,-1)),o)

f=s=>(s=s.split` `,n=s.pop()-1,t='',o=[],s.map((w,i)=>(w=w[n+=!s[i+1]]?w.slice(0,n-3)+'...':w,(t+w)[n-2]&&(t&&o.push(t.slice(1)),t=''),t+=` ${w},`)),o.push(t.slice(1,-1)),o)

// Less golfed
U=s=>(
  s=s.split` `,
  n=s.pop()-1,
  t='', // current line
  o=[], // output
  s.map( (w,i)=>(
    w=w[
      n+=!s[i+1] // space for 1 more char on the last line
    ]?w.slice(0,n-3)+'...':w, // change w if it is too long
    (t+w)[n-2]&& ( // if current line + w is too long, ouput t and reset current line
      t&&o.push(t.slice(1)),t=''
    ),
    t+=` ${w},`
  )),
  o.push(t.slice(1,-1)), // remove tailing comma on last line
  o
)

console.log=x=>O.textContent+=x+'\n\n';
  
console.log(f("foo bar baz qux 12").join`\n`)
console.log(f("foo bar baz qux 5").join`\n`)
console.log(f("strength dexterity constitution intelligence wisdom charisma 10").join`\n`)
console.log(f("quas wex exort 4").join`\n`)
<pre id=O></pre>


1

Python 2,206字节

i=input().split()
l=int(i.pop())
i=[[w[:l-4]+'...',w][len(w)<l]+','for w in i][:-1]+[[w,w[:l-3]+'...'][len(w)>l]]
r=[i.pop(0)]
for w in i:
 if len(r[-1])+len(w)<l:r[-1]+=' '+w
 else:r+=[w]
print'\n'.join(r)
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.