卷蛋糕短语


17

蛋糕卷是由一层海绵蛋糕,一层奶油(或冰淇淋)制成的,呈螺旋状卷制而成的美味甜点,请参阅Wikipedia

您的任务是从标准输入中获取一个非空短语字符串,将空格去除,然后将其作为滚动蛋糕从中心向逆时针方向从左到左滚动,而空格从第一个空格的底部开始短语字符,从左到右,如以下示例所示。

请注意,该短语将是海绵蛋糕层,而奶油层将表示为空白区域。

Input: Lorem ipsum dolor sit amet, consectetu adipiscing elit, sed do eiusmod

Output with spaces ' ' represented as _

ilegnicsip
t________i
,_srolod_d
s_i____m_a
e_t_oL_u_u
d_a_r__s_t
d_m_emip_e
o_e______t
e_t,consec
i____
usmod

测试用例

Input: Lorem ipsum dolor sit amet, consectetu adipiscing elit, sed do eiusmod

Output:

ilegnicsip
t        i
, srolod d
s i    m a
e t oL u u
d a r  s t
d m emip e
o e      t
e t,consec
i    
usmod

Input: Sandbox for Proposed Challenges

Output:

soporp
e    r
d aS o
c n  f
h dbox
a      
llenges

Input: Cake

Output:

aC 
k  
e

Input: it

Output:

ti

规则:



Answers:


2

Python 2,202 200字节

-2个字节感谢LevitatingLion

c=[];s=n=0
a=input().replace(' ','')
#Calculate the ammount of rotations
l=len(a)
while s<l:s=n*(1+n)/2;n+=1
#Add trailing spaces to not break the rolling
a+=' '*(s-l)
#Add a cream layer on top and a cake layer on bottom of the cake and roll 90 degrees
for i in range(1,n):c=[' '*i]+zip(*c[::-1])+[a[:i]];a=a[i:]
#Finish the rolling to match the pattern
exec~i%4*'c=zip(*c[::-1]);'
#Serve the cake
for i in c:print''.join(i)

您可以在以下加上括号execexec~i%4*'c=zip(*c[::-1]);'。这将节省两个字节
LevitatingLion

2

Befunge,260 250字节

"'"::00p09p19p35*::10p29pv
 v`*84:~<0p041p031p020p93<
v_0`!#v_^*!p04+g04:p03%4+g03:p02%4+g02:!%g04:+1pp01+%2-1g03p\3+<
>00g:: :09g\`8+0\p::19g`8+1\p20g1-2%+00p10g:::29g\`8+2\p::39g`8^
9g\-\v>29g:39g\->\:50p09g:1
$$1+\:!#@_1-55+,^>
,gg05<:+1\-1_:$#\^#

在线尝试!

基本思想是,我们在运动场的下半部分建立螺旋线,并在进行过程中始终跟踪最小和最大坐标。处理完所有输入后,我们将遍历坐标范围并写出已保存的内容。

详细说明

请注意,dxdy值在0到3的范围内,对应于相对偏移-1、0、1、0。因此,通过添加1,模4来更新方向。减去1,取模2。

"'"::00p09p19p      Set x, minx, and maxx to 39.
35*::10p29p39p      Set y, miny, and maxy to 15.
020p130p            Set dx to 0 (relative offset -1) and dy to 1 (relative offset 0).
140p                Set the segment length to 1.
0                   Set the index to 0 (on the stack).

                    -- The main input loop start here --
~                   Read a character from stdin.
:48*`_              If it's greater than 32 (i.e. not whitespace or EOL)...
  00g:              Get the current value of x and make a duplicate.
  ::09g\`8+0\p      If it's less than minx, update minx.
  ::19g`8+1\p       If it's greater than maxx, update maxx.
  20g1-2%           Calculate (dx-1)%2, which converts dx into the range -1 to 1.
  +00p              Add that to x and save (leaving the original x on the stack).
  10g:              Get the currrent value of y and make a duplicate.  
  ::29g\`8+2\p      If it's less than miny, update miny.
  ::39g`8+3\p       If it's greater than maxy, update maxy.
  30g1-2%           Calculate (dy-1)%2, which converts dy into the range -1 to 1.
  +10p              Add that to y and save (leaving the original y on the stack).
  p                 Store the character we read at the original x,y coordinates.
  1+                Increment the index by 1.
  :40g%!            Mod that with the current segment len; if zero it's time to turn.
  :20g+4%20p        Add the turn condition to the dx value, thus turning if needed.
  :30g+4%30p        Similarly add the turn condition to the dy value.
  :40g+40p          Also add it to the segment length, so it gets longer every turn.
  !*                Multiply the index by !turn, so it's reset to zero on every turn.
  ^                 Repeat the loop, reading another character.
0`!#v_^             If the char <= 32, we test for EOF and repeat the loop if not.

>                   If it is EOF, we start the output routine.
29g                 Initialise the y coordinate with miny.
:39g\-              Calculate maxy - miny to use as the height countdown.

                    -- The outer output loop starts here --
\:50p               Swap y to the top and save in a temporary variable.
09g                 Initialise the x coordinate with minx.
:19g\-              Calculate maxx - miny to use as our width countdown.
\                   Swap x to the top of the stack.

                    -- The inner output loop starts here --
  :50g              Take a copy of x and the y save in the temporary variable.
  g,                Read the character at those coordinate and write to stdout.
  \:_               Swap the width countdown to the top of the stack and break if zero.
  1-                Otherwise decrement the width countdown.
  \1+               Swap the x value back to the top and increment it.
  <                 Repeat the inner loop.

$$                  Clear the width countdown and x value from the stack.
1+                  Increment the y value.
\                   Swap the height countdown to the top of the stack.
:¬#@_               If it's zero, exit.
1-                  Otherwise decrement it.
55+,                Output a line break.
^                   Repeat the outer loop.
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.