편지의 속도


43

문자열을 입력으로 받으면 알파벳 문자별로 각 문자를 오른쪽으로 밀고 새 문자열을 인쇄하십시오.

우리는 모두 A가 느리고 Z가 빠른 편지라는 것을 알고 있습니다. 즉, Z는 25 칸 오른쪽으로 이동하고 A는 전혀 이동하지 않으며 B는 1 칸 이동합니다.

프로그램은 AZ의 대문자 만 처리 할 수 ​​있으며 다른 문자, 공백, 구두점은 없습니다.

이동 후 둘 이상의 문자가 같은 공간에 떨어지면 최신 문자가 사용됩니다. (예 : 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 예, 이전 의견에 유의하십시오.
Ian H.

1
많은 후행 공백은 어떻습니까?
Okx

1
@Okx 금지, 하나는 당신이 얻는 전부입니다.
Ian H.

대신 소문자를 사용할 수 있다고 가정합니까?
Mr. Xcoder

답변:



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'

5
(: 멋진 내장
Outgolfer Erik

@EriktheOutgolfer 05AB1E와 비슷하다고 생각 ǝ합니까? 아, 그러나 그것은 두 번째 / 세 번째 입력을 통해 벡터화되지 않는 것 같습니다
Luis Mendo

1
정확히 왜 : p이며 MATL이 0s를 자동으로 채우고 0공간으로 표시 하는 방법 .
Outgolfer Erik

1
@LuisMendo 좋은 답변입니다. 호기심이 없으며이 질문은 대부분의 스택 기반 언어에 적용 할 수 있습니다 .MATL로 작성할 때 스택을 추적해야합니다 (예 : 코드 위의 줄이나 종이 등). 코드를 작성 하시겠습니까? 아니면 당신이하지 않을 정도로 자연스럽게되어 있습니까?
요나

1
그는 오늘 뭔가 새로운 것을 배웠다. MATL (AB)에서 아무런 문제없이 동일한 위치에 두 번 색인 할 수 있습니다. 나는 그렇지 않으면 오류가 발생할 것이라고 가정했기 때문에 이미 복잡한 루프 기반 답변을 작성하기 시작했습니다.
Sanchises

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

05AB1E , 20 16 바이트

Emigna 덕분에 -4 바이트

ð₄×svyAuykN+ǝ}ðÜ

온라인으로 사용해보십시오!


1
나는 ð₄×svyAuykN+ǝ}ðÜ적어도 당신이 단축 할 수 있다고 생각합니다 . 또한 이동 된 입력 문자열이 1000자를 넘지 않는다는 보장이 있습니까? 그렇지 않으면 g₂+ð×작동합니다.
Emigna

6

자바 스크립트 (ES6), 81 바이트

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

Rick Hitchcock의 불완전한 답변으로 인해 다소 발전 했지만 결국 다른 결과를 얻었습니다.

문자를 빈 배열의 해당 인덱스에 배치 한 다음 배열 확산 ( [...a])을 사용 하여 누락 된 요소를 로 바꾸고 빈 요소를 공백으로 바꿀 undefinedmap있습니다.

테스트 사례


아주 좋아요! 88 바이트 솔루션을 게시하려고했지만 훨씬 좋습니다.
Rick Hitchcock

5

펄 5, 42 바이트

41 바이트 코드 + 1 -p. \x1b코드에서의 리터럴 이스케이프 문자입니다.

커서를 배치하기 위해 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에서 작동하지만 1 바이트 이상 (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





2

Wolfram Language (Mathematica) , 76 바이트

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

문자 목록을 입력으로 사용합니다. 무시해도 안전한 일부 오류 메시지가 생성됩니다.

사용하기 쉽도록 TIO 링크 바닥 글에 포함 Print하고 Character명령했습니다. ( Character명령은 단순히 문자열을 문자 목록으로 변환합니다)

온라인으로 사용해보십시오!


LetterNumber알파벳에서 글자의 위치를 ​​찾기위한 빌트인입니까? 이런 쓰레기, 그건 말도 안돼.
numbermaniac

2

J, 37 31 바이트

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

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

FrownyFrog 덕분에 -6 바이트

설명

모든 것은 후크입니다.

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

오른쪽은 모든 문자에 대한 새로운 색인을 계산합니다.

왼쪽은 gerund 형식의 Amend를 }먼저 사용하여 필요한 수의 공백 문자열을 만듭니다 (' '#~(1+>./)@]). 그런 다음 원래 문자열의 각 문자를 모든 공간 문자열 내의 해당 인덱스에 넣습니다.

온라인으로 사용해보십시오!


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

괄호도 삭제할 수 있습니다.
FrownyFrog

@FrownyFrog tyvm입니다. 나는 그 두 가지 골프 트릭을 잊어 버렸습니다.
Jonah

당신은로 3 바이트를 저장할 수 있습니다(]' '#~1+>./)
마일

@ 마일. 좋은. 나는 일반 도구 상자의 일부가 아닌 고리를 만들어야합니다. 오늘 아침부터 그 개정판에서 사용했습니다.
Jonah


2

하스켈, 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 솔루션은 herehere을 참조 하십시오 .
nimi

2

C # (.NET 코어) , 117 (110) 84 바이트

Ayb4tu 덕분에 7 바이트가 절약되었습니다 .

26 바이트를 저장 string하도록 리턴 유형을에서 로 변경했습니다 char[].

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전환이 암시 적임을 잊어 버렸습니다 .
Ian H.


2

코 틀린, 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

Jq 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 바이트

입력 문자열을 인수로 사용하고 출력 문자열을 반환하는 익명 접두어 람다. 많은 시스템에서 기본값 인 ⎕IO( i ndex O rigin)을 가정 0합니다.

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

온라인으로 사용해보십시오!

{} 익명의 람다; 인수를 나타냅니다

≢⍵ 논쟁의 집계

 많은 ɩ ntegers 보다 (0… LengthOfArgument-1)

()+ 플러스 :

  ⎕A⍳⍵ 대문자 A lphabet 에있는 인수의 지표

i← strore에 i(대해 ndices)

⌈/ 최대 (감소)

1+ 하나 추가

''↑⍨ 빈 문자열에서 많은 문자를 가져 와서 필요에 따라 공백으로 채 웁니다.

 수확량 ( i로부터 분리 '')

⍵@i 인수 문자로 그 개정 i 인덱스



1

Pyth , 44 38 바이트

44가 여전히 44입니다.

블러디 피스 초보자.

@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'를 출력하지 않는 버그를 수정해야했습니다 ...


downvoted 한 사람에게 : 아마도 up-button을 잘못 클릭했을 것입니다. downvote 이유를 수정하거나 저에게 줄을
적으십시오
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.