信速


43

给定一个字符串作为输入,请打印一个新字符串,每个字母的各自字母索引将其推到右侧。

我们都知道A是一个慢字母,Z是一个快字母。这意味着Z向右偏移25个空格,A根本不偏移,而B偏移了1个空格。

您的程序只需要处理AZ的大写字母,没有其他字符,空格,标点符号。

请注意,如果在移位后2个或更多字母落在同一空格上,则会使用最新字符。(例如:BA->  A

例子

"AZ" -> "A                         Z"

"ABC" -> "A B C"

"ACE" -> "A  C  E"

"CBA" -> "  A"

"HELLOWORLD" -> "     E H    DLL   OLO   R  W"

规则

  • 这是,因此以任何语言字节中的最短代码为准。
  • 禁止出现标准漏洞。

  • 输入必须以字符串形式接收。

  • 您可以将结果打印到stdout或返回字符串。
  • 允许使用单个尾随空格和/或换行符。
  • 您也可以使用小写字母作为输入或输出,但只能使用任何一种情况。

尾随空格好吗?
Okx

@Okx是的,请注意我之前的评论。
伊恩H.17年

1
那么大量的尾随空格呢?
Okx

1
@Okx Forbidden,一无所获。
伊恩H.17年

我假设我们可以改用小写字母,对吗?
Xcoder先生17年

Answers:



11

MATL,11个字节

''jtfy65-+(

在线尝试!验证所有测试用例

说明

MATL索引基于1。这里使用了这种高尔夫技巧。由于我们需要一个空字符串,而不是一个空数字数组,因此无法使用其他一个

以输入'ACE'为例。堆栈内容从下至上显示。

''     % Push empty string
       %   Stack: ''
j      % Input string
       %   Stack: '', 'ACE'
t      % Duplicate
       %   Stack: '', 'ACE', 'ACE'
f      % Indices of nonzero entries. Gives [1 2 ... n] where n is input length
       %   Stack: '', 'ACE', [1 2 3]
y      % Duplicate from below
       %   Stack: '', 'ACE', [1 2 3], 'ACE'
65     % Push 65
       %   Stack: '', 'ACE', [1 2 3], 'ACE', 65
-      % Subtract, element-wise. Characters are converted to codepoints
       %   Stack: '', 'ACE', [1 2 3], [0 2 4]
+      % Add, element-wise
       %   Stack: '', 'ACE', [1 4 7]
(      % Fill string '' with values 'ACE' at positions [1 4 7]. The original
       % empty string is extended. Non-existing values are filled with char 0,
       % which is displayed as space. Implicitly display
       %   Stack: 'A  C  E'


@EriktheOutgolfer我认为它类似于05AB1E的ǝ?啊,但是这似乎并没有向量化在第二/第三输入
路易斯Mendo

1
确切为什么它是独特的:p以及MATL如何自动用0s 填充并显示0为空格。
暴民埃里克(Erik the Outgolfer)'17年

1
@LuisMendo不错的答案。出于好奇,这个问题可能适用于大多数基于堆栈的lang,当您使用MATL编写代码时,您需要跟踪堆栈(例如,在代码上方的一行中或一张纸上等等)编写代码?还是对您来说变得自然而然?
约拿(Jonah)

1
嘿-今天学到了一些新东西;您可以在同一位置两次索引,而MATL(AB)中没有任何问题。我已经开始写一个基于循环的复杂答案,因为我认为否则会给出错误。
桑奇斯

7

[R 140个 133 129 74字节

与其他所有人一样,节省了许多字节,可移植ASCII值方法。可悲的是我以前没有想到过:(

function(s){F[X-65+1:sum(X|1)]=X=utf8ToInt(s)
F[is.na(F)]=32
intToUtf8(F)}

在线尝试!

原始答案,129个字节:

function(s){o=rep(' ',(n=nchar(s))+25)
for(i in 1:n){k=substr(s,i,i)
o[x<-i+match(k,LETTERS)-1]=k
F=max(F,x)}
cat(o[1:F],sep='')}

在线尝试!

生成一个太长o的空格列表,然后进行迭代s,用o正确的值替换其中的值,并更新F最右边字符的位置。然后打印出的第一个F元素o之间没有分隔符。


6

05AB1E20 16字节

-4字节归功于Emigna

ð₄×svyAuykN+ǝ}ðÜ

在线尝试!


1
我认为您ð₄×svyAuykN+ǝ}ðÜ至少可以缩短到。另外,是否可以保证输入的字符串移位不超过1000个字符?如果没有,g₂+ð×应该工作。
Emigna '17

6

JavaScript(ES6),81个字节

s=>[...s].map((c,i)=>a[i+parseInt(c,36)-10]=c,a=[])&&[...a].map(c=>c||" ").join``

某种程度上源于里克·希区柯克Rick Hitchcock)不完整的答案,但最终却大为不同。

将字符放入空数组的相应索引中,然后使用数组spread([...a])将缺少的元素转换为undefined,从而map可以用空格替换空元素。

测试用例


非常好!我本来打算发布一个88字节的解决方案,但您的解决方案要好得多。
里克·希区柯克

5

Perl 5,42个字节

41个字节的代码+ 1 for -p\x1b代码中的s是文字转义字符。

依靠ANSI转义序列来定位光标,因此在TIO上不起作用。

s/./($-=-65+ord$&)?"\x1b[$-C$&\x1b[--$-D":$&/ge

用法

perl -pe 's/./($-=-65+ord$&)?"\x1b[$-C$&\x1b[--$-D":$&/ge' <<< 'HELLOWORLD'
     E H    DLL   OLO   R  W

1
这是一种适用于TIO的代码,但又多了一个字节(41个字节的代码+ 2个用于-F):在线尝试!
Xcali

1
@Xcali您应该发布该内容,以便我对其进行投票:)
Lynn

1
@Xcali与Lynn同意,更多的帖子很棒。我也喜欢语言比赛!
Dom Hastings



4

brainfuck,127个字节

,[[-<+<+>>]----[----<<->>]<<-[[>]>++++>[-<[-]<+>>]<[-<++++++++>]<[<]>-]>[>]<[-]+[<]>-[[>]<+[<]>-]>.[-]>[>]<[[->>+<<]<]>,]>>[.>]

在线尝试!

说明

,[                    Take input and start main loop
  [-<+<+>>]             Make two copies of input byte
  ----[----<<->>]<<-    Subtract 64 from one of them to get position in alphabet

                        There are two zero cells between the input and the
                        remaining output cells; we wish to move these zeroes
                        to indicate where the letter is to be moved

  [                     A number of times equal to the position in the alphabet:
    [>]                   Go to current position in output string
    >++++>                Create 4 (as part of creating a space if needed)
    [-<[-]<+>>]           Move output byte back two cells; zero the previous 4 if output existed
    <[-<++++++++>]        Otherwise move a space (32) into that position
    <[<]>-                Move back to counter and decrement
  ]
  >[>]<[-]              Delete last moved byte to make room for input byte
  +[<]>-                Initialize slot at 1 so it is always nonzero in this loop
  [[>]<+[<]>-]          Move input byte into slot
  >.[-]                 Output next output byte and clear
  >[>]<                 Move to space vacated in preparation to remove gap
                        (Moves to end instead if input was A; this causes no problems)
  [[->>+<<]<]           Move values two cells right until zero reached
  >,                    Get into position and take another byte of input
]
>>[.>]                Output characters beyond end of input

3

质子,78字节

x=>{t=[' ']*26*(q=len(x))for i:0..q{t[i+ord(k=x[i])-65]=k}"".join(t).rstrip()}

在线尝试!

移植Lynn的解决方案需要69个字节: x=>{t=[]i=65for k:x{t+=[' ']*26t[ord(k)-i]=k;i--}"".join(t).rstrip()}





2

Wolfram语言(Mathematica),76个字节

SparseArray[Reverse@MapIndexed[#&@@#2+LetterNumber@#-1->#&,#]]<>""/. 0->" "&

接受字符列表作为输入。这将生成一些可以忽略的错误消息。

我包括PrintCharacter在TIO链接,易用性页脚命令。(Character命令只是将字符串转换为字符列表)

在线尝试!


LetterNumber是用于查找字母在字母表中的位置的内置工具?天哪,这太荒谬了。
numbermaniac

2

37 31字节

[`]`(' '#~(1+>./)@])}(i.@#+65-~a.&i.)

[`]`(' '#~(1+>./)@])}#\-66-3&u:

-6字节归功于FrownyFrog

说明

整个过程是一个钩子:

[`]`(' '#~(1+>./)@])}  #\-66-3&u:

右侧将为所有字母计算新索引。

左侧首先使用Amend的gerund形式}创建一个必要数量的空格字符串:(' '#~(1+>./)@])。然后将原始字符串的每个字母放入全空格字符串中的相应索引中。

在线尝试!


(i.@#+65-~a.&i.)-> (i.@#+65-~3&u:)-> (i.@#-65-3&u:)-> (#\-66-3&u:)
FrownyFrog

您也可以删除括号。
FrownyFrog

@FrownyFrog tyvm。我忘记了这两个高尔夫技巧。
约拿(Jonah)

您可以保存3个字节,其中(]' '#~1+>./)
英里为

@miles。真好 我需要将二元钩子作为常规工具箱的一部分,我注意到您从今天早上开始也在该修订版中使用了它们。
约拿(Jonah)


2

Haskell,88个字节

f s|q<-zipWith((+).fromEnum)s[0..]=[last$' ':[c|(c,i)<-zip s q,i==p]|p<-[65..maximum q]]

在线尝试!

q是输入字符串字母的最终索引的列表(偏移为65)。循环浏览所有索引(从开始65),并为其找到所有字母,并在其前面加上一个空格。拿最后一个。


1
还有88字节的Haskell解决方案,请参见此处此处
nimi

2

C#(.NET核心)117 110 84个字节

由于Ayb4tu节省了7个字节。

从更改返回类型stringchar[]保存26个字节。

n=>{int i=0,l=n.Length;var t=new char[l+26];for(;i<l;)t[i+n[i]-65]=n[i++];return t;}

在线尝试!


更改t[i+((int)n[i]-65)]为可以节省7个字节t[i+n[i]-65]
Ayb4btu

@ Ayb4btu感谢您忘记char -> int转换是隐式的。
伊恩H.17年


2

Kotlin,207字节 189字节 187字节 177字节

fun main(){val i=(readLine()+" ".repeat(26)).toCharArray();for(x in(i.size-1) downTo 0){if(i[x]!=' '){i[x+i[x].toInt()-65]=i[x];i[x]=' '}};print(i.joinToString("").trim())}

如果要保留前导空白,我会打电话trimEnd()代替trim()

未缩小:

fun main() {
    val m = (readLine() + " ".repeat(26)).toCharArray()
    for (x in (m.size - 1) downTo 0) {
        if(m[x] != ' ') {
            m[x + m[x].toInt() - 65] = m[x]
            m[x] = ' '
        }
    }

    print(m.joinToString("").trim())
}

也许Kotlin并不是打高尔夫球的最佳语言,但我喜欢挑战,我想让自己更加熟悉Kotlin的标准库。


1

q / kdb +,37个字节

解:

@[max[1+m]#" ";m:!:[x#:]+.Q.A?x;:;]x:

例子:

q)@[max[1+m]#" ";m:!:[x#:]+.Q.A?x;:;]x:"AZ"
"A                         Z"
q)@[max[1+m]#" ";m:!:[x#:]+.Q.A?x;:;]x:"ABC"
"A B C"
q)@[max[1+m]#" ";m:!:[x#:]+.Q.A?x;:;]x:"ACE"
"A  C  E"
q)@[max[1+m]#" ";m:!:[x#:]+.Q.A?x;:;]x:"CBA"
"  A"
q)@[max[1+m]#" ";m:!:[x#:]+.Q.A?x;:;]x:"HELLOWORLD"
"     E H    DLL   OLO   R  W"

说明:

我认为这与J解决方案相同,为输入数组计算正确的索引,然后将它们分配给正确长度的空字符串:

@[max[1+m]#" ";m:til[count x]+.Q.A?x;:;]x: / ungolfed solution
                                        x: / save input as x
@[            ;                     ; ;]   / apply[variable;indices;function;parameters]
                                     :     / assignment
                              .Q.A?x       / location of x in uppercase alphabet
                             +             / added to
                     count x               / length of input
                 til[       ]              / range, 0..n
               m:                          / save as m
  max[   ]                                 / maximum of list
      1+m                                  / m + 1
          #" "                             / take " ", creates empty character list

1

jQuery 1.5,91字节

reduce(explode|[.,keys]|transpose[]|.[1]+=.[0]-65)as[$c,$p]([];.[$p]=$c)|map(.//32)|implode

展开式

  reduce(  explode         # convert string to array of ordinals
         | [.,keys]        # [ [v0,v1,...], [0,1,2,...] ]
         | transpose[]     # [ [v0,0], [v1,1], [v2,2]...]
         | .[1]+=.[0]-65   # adjust position of each value
  ) as[$c,$p] (
    []
  ; .[$p]=$c               # store each value at its position
  )
| map(.//32)               # map null values to spaces
| implode                  # convert back to string

在线尝试!


1

木炭,16字节

P FS«M⌕αι→ιM⌕αι←

在线尝试!链接是详细版本的代码。说明:

P                   Output a space to force the indent
   S                Input string
  F «               Loop over each letter
       α            Uppercase letters predefined variable
      ⌕ ι           Find index of current letter
     M   →          Move that many characters right
          ι         Implicitly print the current letter
           M⌕αι←    Move the same number of characters left

1

APL(Dyalog),26字节

匿名前缀lambda,它将输入字符串作为参数并返回输出字符串。假设⎕IOI ndex O rigin)0,这在许多系统上都是默认的。

{⍵@i''↑⍨1+⌈/i←(⎕A⍳⍵)+⍳≢⍵}

在线尝试!

{} 匿名lambda;代表论点

≢⍵ 论据相符

 比许多ɩ(0…LengthOfArgument-1)

()+ 加上:

  ⎕A⍳⍵ 争论的大写字母索引一个 lphabet

i← 走进去i(为我服务

⌈/ 最大(减少)

1+ 加一

''↑⍨ 从空字符串中提取那么多字符,并根据需要填充空格

 得到的是(用于分离i''

⍵@i 修改索引的自变量字母i


1

SOGL V0.12,10 个字节

ā,{ZFWē+1ž

在这里尝试!

说明:

ā           push an empty array
 ,{         for each char in the input
   ZFW        get its index in the uppercase alphabet
      ē+      add to that the 0-indexed counter
        1ž    at [pop; 1] insert in the array the current character

1

Pyth44 38字节

撞出44仍然是44 :(

血腥的Pyth初学者。

由于@Mr,节省了6个字节。Xcoder。

K*d+lz26Vlz K=XK-C@zN-65N@zN;.WqeHdPZK

在线尝试!


怎么样?

K*d+lz26Vlz K=XK-C@zN-65N@zN;.WqeHdPZK          Full program

K*d+lz26                                        Assign a string consisting of 
                                                  (26 + input.length) whitespaces to K
        Vlz                                     For-loop from 0 to input.length
                -C@zN-65N                       Calculate the index for the current letter
                         @zN                    The current letter
            K=XK                                Insert the current letter into K at
                                                  position i
                            ;                   End statement
                             .WqeHdPZK          While the last character of H is not a 
                                                  whitespace, pop the last character off K

38个字节:K*d+lz26Vlz K=XK-C@zN-65N@zN;.WqeHdPZK。当然可以WqeKd K=PK;K.W(功能性while)及其参数FNrZlz替换VrZlz,并且可以由替换,但由rZ...表示U...,并且U由自动生成V。所以FNrZlz变成Vlz
Xcoder先生

1

批处理,418331字节

仅适用于大写字母,较长的字符串将需要几秒钟。

在这里学到了新技巧,使用字符将字符转换为ASCII值%=exitcodeAscii%。此外,还if defined可以使用进行“数组”访问call。同样,打高尔夫球几乎是100个字节,这是很好的批处理代码高尔夫培训。

请注意中的尾随空格set z=set

@echo off
setlocal EnableDelayedExpansion
set z=set 
%z%a=%1
:a
%z%v=64
:b
%z%/Av+=1
cmd/Cexit %v%
if %=exitcodeAscii% neq %a:~0,1% goto b
%z%/Ao=v+c
%z%a%o%=%a:~0,1%
if %o%. geq %m%. %z%m=%o%
%z%/Ac+=1
%z%a=%a:~1%
if %a%. neq . goto a
for /l %%n in (65,1,%m%)do (
if defined a%%n (call %z%r=%%r%%%%a%%n%%
)else %z%r=!r! )
echo %r%


1

IBM PC DOS 8088组装34 33字节

b403 cd10 be80 00ad 8bc8 32ed ac8b de02 d880 ebc4 8ad3 b402 cd10 b40e cd10 e2ec c3

未装货(未组装):

    MOV  AH, 03H        ; get current cursor position row into DH
    INT  10H
    MOV  SI, 80H        ; point SI to PSP
    LODSW               ; fetch length into AL, increment SI to 82H
    MOV  CX, AX         ; move to CX
    XOR  CH, CH         ; clear CH
OUTPUT:
    LODSB               ; load DS:SI into AL
    MOV  BX, SI         ; input string offset into BX (so doesn't overwrite DH)
    ADD  BL, AL         ; add ASCII value of char
    SUB  BL, 'A'+83H    ; convert to numeric val (A=0, Z=25)
    MOV  DL, BL         ; DL is column number
    MOV  AH, 02H        ; BIOS set cursor position function    
    INT  10H            ; move to column
    MOV  AH, 0EH        ; BIOS display char function in AL
    INT  10H            ; write to screen
    LOOP OUTPUT
    RET                 ; return to DOS

这是一个完整的PC DOS可执行文件,它从命令行获取输入字符串,并将新的“更快”版本打印到屏幕上。至少需要DOS 1.0 ...希望您至少已经做到了。

输出量

A>SPEED.COM ABC
A B C
A>SPEED.COM AZ
A                         Z
A>SPEED.COM CBA
  A
A>SPEED.COM HELLOWORLD
     E H    DLL   OLO   R  W

0

PHP,127123字节

function b($i){for($q=0;$q<strlen($i);$q++){$n[ord($i[$q])-65]=$i[$q];}while($x++<26){$m.=$n[$x-1]?$n[$x-1]:" ";}return$m;}

在线尝试

必须修复不会输出'A'的错误...


对于曾被否决的人:您可能误按了向上按钮。请更正,或让我就为什么投票的
理由
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.