手紙のスピード


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.

1
多くの後続スペースはどうですか?
Okx

1
@Okx禁じられた、1つだけです。
イアンH.

代わりに小文字を使用できると思いますか?
ミスターXcoder

回答:



11

MATL、11バイト

''jtfy65-+(

オンラインでお試しください!または、すべてのテストケースを確認します

説明

MATLインデックスは1ベースです。このゴルフのトリックはここで使用されます。空の数値配列ではなく空の文字列が必要なため、このもう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
(:素敵な
ビルトイン

@EriktheOutgolfer 05AB1Eのものに似ていると思うǝ?ああ、しかし、それは2番目/ 3番目の入力にわたってベクトル化されていないようです
ルイスメンドー

1
なぜそれがユニークなのか:pおよびMATLが0sで自動入力し0てスペースとして表示する方法
エリックアウトゴルファー

1
@LuisMendoすてきな答え。好奇心から、この質問はおそらくほとんどのスタックベースの言語に当てはまります。MATLで書くとき、あなたはスタックを追跡する必要がありますか(たとえば、コードの上の行や紙など)コードを作成しますか?それとも、あなたにとってそうではないほど自然になりましたか?
ジョナ

1
へー-今日は何か新しいことを学びました。MATL(AB)で問題なく同じ位置に2回インデックスを作成できます。そうしないとエラーが発生すると想定していたため、すでに複雑なループベースの回答を書き始めました。
-Sanchises

7

R140の 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バイト

ð₄×svyAuykN+ǝ}ðÜ

オンラインでお試しください!


1
ð₄×svyAuykN+ǝ}ðÜ少なくとも短縮できると思います。また、シフトされた入力文字列が1000文字を超えないという保証はありますか?そうでない場合、動作するg₂+ð×はずです。
エミグナ

6

JavaScript(ES6)、81バイト

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

リック・ヒッチコックの不完全な答えから幾分構築されたが、結局はかなり異なったものになった。

文字を空の配列のそれぞれのインデックスに配置し、配列spread([...a])を使用して欠落している要素をに変換しundefinedmap空の要素をスペースに置き換えることができます。

テストケース


非常に素晴らしい!88バイトのソリューションを投稿しようとしていましたが、あなたの方がはるかに優れています。
リックヒッチコック

5

Perl 5、42バイト

41バイトのコード+ 1の場合-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で機能するが、さらに1バイト(41バイトのコード+の場合は2バイト-F)入っているものがあります。オンラインで試してみてください!
Xcali

1
@Xcaliそれを投稿する必要がありますので、私はそれを賛成できます:)
Lynn

1
@Xcali Lynnに同意する投稿が多すぎるのは素晴らしいことです。言語競争も好きです!
ドムヘイスティングス



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言語(Mathematica)、76バイト

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

入力として文字のリストを受け取ります。これにより、無視しても安全なエラーメッセージが生成されます。

私は含まPrintCharacter使いやすさのためにTIOリンクのフッターにコマンド。(Characterコマンドは単に文字列を文字のリストに変換します)

オンラインでお試しください!


LetterNumberアルファベットの文字の位置を見つけるためのビルトインですか?なんてこった、ばかげている。
numbermaniac

2

J、37 31バイト

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

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

FrownyFrogのおかげで-6バイト

説明

全体がフックです:

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

右側では、すべての文字の新しいインデックスが計算されます。

左側では、}最初に動名詞形式のAmend を使用して、必要な数のスペースの文字列を作成します(' '#~(1+>./)@])。そして、元の文字列の各文字を、全スペース文字列内の適切なインデックスに配置します。

オンラインでお試しください!


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

括弧も削除できます。
FrownyFrog

@FrownyFrog tyvm。私はそれらの両方のゴルフのトリックを忘れていました。
ジョナ

あなたはとの3つのバイトを保存することができます(]' '#~1+>./)
マイル

@マイル。いいね ダイアディックフックを通常のツールボックスの一部にする必要があります。今朝からそのリビジョンでも使用されていることに気付きました。
ジョナ


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 Core)117 110 84バイト

Ayb4tuのおかげで7バイト節約されました

戻り値の型をからstringに変更しchar[]て、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.

2

C#.NET、89バイト 87バイト

Lan Hのおかげで-2バイト

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

オンラインでお試しください!


サイトへようこそ!:)
DJMcMayhem

ありがとう!私はそれは同じ言語で複数の答えを投稿しても大丈夫だ願っています
エミリアーノ

あなたは、あなたの中に波括弧を省略することができfor-2バイトを-loopを。
イアンH.

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

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バイト

入力文字列を引数として受け取り、出力文字列を返す匿名プレフィックスlambda。想定している⎕IOI NDEX O RIGIN)0多くのシステムではデフォルトです。

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

オンラインでお試しください!

{} 匿名ラムダ; 引数を表します

≢⍵ 議論の集計

 than個以上の整数(0…LengthOfArgument-1)

()+ さらに:

  ⎕A⍳⍵ 大文字のA lphabetの引数のインデックス

i← strore in i(for i ndices)

⌈/ 最大(削減)

1+ ひとつ追加

''↑⍨ 空の文字列から多くの文字を取り出し、必要に応じてスペースを埋めます

 それをもたらす(から分離iするのに役立つ''

⍵@i 引数の文字でその改正i指標



1

Pyth44 38バイト

打たれた44はまだ44です:(

Bloody 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;.WqeHdPZKWqeKd K=PK;K.W(functional while)とその引数FNrZlzによって置き換えられVrZlz、もちろん置き換えられますが、rZ...はを意味しU...Uはによって自動的に生成されVます。そうFNrZlzなりますVlz
Mr. Xcoder

1

バッチ、418 331バイト

大文字のみで動作し、長い文字列の場合は数秒かかります。

ここで、新しいトリック、つまりを使用した文字から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、127 123バイト

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」を出力しないバグを修正する必要がありました...


誰もがダウン投票した場合:おそらく、アップボタンを誤ってクリックした可能性があります。修正するか、ダウン投票の理由を教えてください... Tnx
steenbergh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.