The Speed ​​of Letters

43

Diberikan string sebagai input, cetak string baru dengan setiap huruf didorong ke kanan oleh indeks alfabet masing-masing.

Kita semua tahu bahwa A lambat dan Z adalah huruf cepat. Ini berarti bahwa Z akan bergeser ke kanan dengan 25 ruang, A tidak bisa bergeser sama sekali dan B akan digeser oleh 1 ruang.

Program Anda hanya perlu menangani huruf besar dari AZ, dan tidak ada karakter lain, tidak ada spasi putih, tidak ada tanda baca.

Perhatikan bahwa jika 2 atau lebih huruf jatuh ke ruang yang sama setelah bergeser, karakter terbaru akan digunakan. (Contoh: BA->  A)

Contohnya

"AZ" -> "A                         Z"

"ABC" -> "A B C"

"ACE" -> "A  C  E"

"CBA" -> "  A"

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

Aturan

  • Ini adalah , jadi kode terpendek dalam byte bahasa apa pun yang menang.
  • Celah standar dilarang.

  • Input harus diterima sebagai string.

  • Anda dapat mencetak hasilnya ke stdoutatau mengembalikan string.
  • Sebuah tunggal miring spasi dan / atau baris baru diperbolehkan.
  • Anda juga dapat menggunakan huruf kecil sebagai input atau output, tetapi hanya menggunakan kedua case.
Ian H.
sumber
Mengejar ruang kosong oke?
Okx
@ OKK Ya, perhatikan komentar saya sebelumnya.
Ian H.
1
Bagaimana dengan banyak ruang tambahan?
Okx
1
@ OKK Terlarang, satu-satunya yang Anda dapatkan.
Ian H.
Saya kira kita bisa menggunakan huruf kecil saja, bukan?
Tn. Xcoder

Jawaban:

11

MATL , 11 byte

''jtfy65-+(

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

Pengindeksan MATL berbasis 1. Trik golf ini digunakan di sini. Yang lain ini tidak dapat digunakan karena kita membutuhkan string kosong, bukan array numerik kosong.

Pertimbangkan input 'ACE'sebagai contoh. Isi tumpukan ditampilkan dari bawah ke atas.

''     % 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'
Luis Mendo
sumber
5
(: nice builtin
Erik the Outgolfer
@EriktheOutgolfer Saya pikir ini mirip dengan 05AB1E ǝ? Ah, tapi itu sepertinya tidak membuat vektor pada input kedua / ketiga
Luis Mendo
1
Persis mengapa ini unik: p dan juga bagaimana MATL otomatis terisi dengan 0s dan ditampilkan 0sebagai ruang.
Erik the Outgolfer
1
@LuisMendo Jawaban yang bagus. Karena penasaran, dan pertanyaan ini mungkin berlaku untuk sebagian besar pangkalan berbasis tumpukan, ketika Anda menulis dalam MATL, Anda perlu melacak tumpukan (misalnya, dalam baris di atas kode, atau selembar kertas, dll) saat Anda menulis kode? Atau apakah sudah cukup alami bagi Anda sehingga Anda tidak?
Jonah
1
Heh - belajar sesuatu yang baru hari ini; Anda dapat mengindeks ke posisi yang sama dua kali tanpa masalah di MATL (AB). Saya sudah mulai menulis jawaban berbasis loop yang rumit karena saya menganggap itu akan memberikan kesalahan sebaliknya.
Sanchises
7

R , 140 133 129 74 byte

Menyimpan satu ton byte yang porting pendekatan nilai ASCII seperti orang lain. Sedih aku tidak memikirkannya sebelumnya :(

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

Cobalah online!

jawaban asli, 129 byte:

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='')}

Cobalah online!

menghasilkan daftar oruang yang terlalu panjang , kemudian beralih melalui s, mengganti nilai-nilai odengan nilai yang benar dan memperbarui F, posisi karakter paling kanan. Kemudian cetak Felemen pertama otanpa pemisah di antara mereka.

Giuseppe
sumber
6

05AB1E , 20 16 byte

-4 byte terima kasih kepada Emigna

ð₄×svyAuykN+ǝ}ðÜ

Cobalah online!

Okx
sumber
1
Saya pikir Anda bisa mempersingkat ð₄×svyAuykN+ǝ}ðÜsetidaknya. Juga, apakah ada jaminan bahwa string input bergeser tidak lebih besar dari 1000 karakter? Jika tidak, g₂+ð×harus bekerja.
Emigna
6

JavaScript (ES6), 81 byte

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

Agak membangun dari jawaban yang tidak lengkap Rick Hitchcock tetapi akhirnya agak berbeda.

Tempatkan karakter ke dalam indeks mereka masing-masing dari array kosong, kemudian gunakan array array ( [...a]) untuk mengubah elemen yang hilang menjadi undefined, memungkinkan mapuntuk mengganti elemen kosong dengan spasi.

Uji Kasus

Justin Mariner
sumber
Sangat bagus! Saya hendak memposting solusi 88-byte, tetapi milik Anda jauh lebih baik.
Rick Hitchcock
5

Perl 5, 42 byte

41 byte kode +1 untuk -p. The \x1bs dalam kode karakter escape literal.

Bergantung pada urutan pelarian ANSI untuk memposisikan kursor dan karenanya tidak bekerja pada TIO.

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

Pemakaian

perl -pe 's/./($-=-65+ord$&)?"\x1b[$-C$&\x1b[--$-D":$&/ge' <<< 'HELLOWORLD'
     E H    DLL   OLO   R  W
Dom Hastings
sumber
1
Berikut ini salah satu yang berfungsi pada TIO tetapi datang pada satu byte lebih (41 byte kode + 2 untuk -F): Cobalah online!
Xcali
1
@Xcali Anda harus mempostingnya agar saya dapat membatalkannya :)
Lynn
1
@Xcali Setuju dengan Lynn terlalu banyak pos yang hebat. Saya suka kompetisi bahasa juga!
Dom Hastings
5

Java (OpenJDK 8) , 207 191 189 183 178 174 173 170 byte

s->{char i=0,l,c[]=new char[s.chars().map(j->j+s.lastIndexOf(j)).max().getAsInt()-64];for(;i<s.length();c[i+l-66]=l)l=s.charAt(i++);return"".valueOf(c).replace('',' ');}

Cobalah online!

Roberto Graham
sumber
4

Perl 5 , 41 + ( -F) = 43 byte

map$r[$i++-65+ord]=$_,@F;print$_||$"for@r

Cobalah online!

Hanya untuk @lynn

Xcali
sumber
4

brainfuck , 127 byte

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

Cobalah online!

Penjelasan

,[                    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
Nitrodon
sumber
3

Proton , 78 byte

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

Cobalah online!

69 byte dengan mem-porting solusi Lynn: x=>{t=[]i=65for k:x{t+=[' ']*26t[ord(k)-i]=k;i--}"".join(t).rstrip()}

HyperNeutrino
sumber
3

Haskell , 90 88 byte

d=drop 1
[a]#s|s<"A"=a:d s|0<1=s
b#s=(s++" ")!!0:d b#d s
f(c:t)=['A'..c]#(' ':f t)
f s=s

Cobalah online!

Zgarb
sumber
@Laikoni Oh sial, aku salah baca itu. Akan diperbaiki ...
Zgarb
Ya, tidak lagi lebih pendek. : /
Zgarb
2

Bahasa Wolfram (Mathematica) , 76 byte

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

Mengambil daftar karakter sebagai input. Ini menghasilkan beberapa pesan kesalahan yang aman untuk diabaikan.

Saya memasukkan Printdan Charactermemerintahkan di footer tautan TIO untuk kemudahan penggunaan. ( Characterperintah cukup mengkonversi string ke daftar karakter)

Cobalah online!

JungHwan Min
sumber
LetterNumberApakah ada built-in untuk menemukan posisi huruf dalam alfabet? Omong kosong, itu konyol.
numbermaniac
2

J, 37 31 byte

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

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

-6 byte berkat FrownyFrog

penjelasan

Semuanya adalah sebuah kait:

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

Sisi kanan menghitung indeks baru untuk semua huruf.

Sisi kiri menggunakan bentuk gerund dari Mengamandemen }pertama untuk membuat sebuah string dari jumlah yang diperlukan ruang: (' '#~(1+>./)@]). Dan kemudian menempatkan setiap huruf dari string asli ke dalam indeks yang sesuai dalam string semua-ruang.

Cobalah online!

Jonah
sumber
(i.@#+65-~a.&i.)-> (i.@#+65-~3&u:)-> (i.@#-65-3&u:)-> (#\-66-3&u:)
FrownyFrog
Anda juga bisa menjatuhkan tanda kurung.
FrownyFrog
@FrownyFrog tyvm. Saya sudah lupa tentang kedua trik golf itu.
Jonah
Anda dapat menyimpan 3 byte dengan(]' '#~1+>./)
mil
@miles. Bagus. Saya perlu membuat kait diad sebagai bagian dari kotak alat reguler saya, saya perhatikan Anda menggunakannya dalam revisi itu sejak pagi ini juga.
Jonah
2

Haskell , 88 byte

foldr(\c->(((['B'..c]>>" ")++[c])#).(' ':))[]
(x:r)#(y:t)|y>' '=y:r#t|1<3=x:r#t
r#t=r++t

Cobalah online!

Laikoni
sumber
2

Haskell, 88 byte

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

Cobalah online!

qadalah daftar indeks akhir dari huruf-huruf dari string input (dengan offset 65). Lingkari semua indeks (mulai dari 65) dan temukan semua huruf untuk itu, tambahkan spasi. Ambil yang terakhir.

nimi
sumber
1
Namun solusi Haskell 88 byte lainnya, lihat di sini dan di sini .
nimi
2

C # (.NET Core) , 117 110 84 byte

Disimpan 7 byte berkat Ayb4tu .

Jenis pengembalian diubah dari stringke char[]untuk menyimpan 26 byte.

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;}

Cobalah online!

Ian H.
sumber
Anda dapat menyimpan 7 byte dengan mengubah t[i+((int)n[i]-65)]ke t[i+n[i]-65].
Ayb4btu
@ Ayb4btu Terima kasih lupa bahwa char -> intkonversi bersifat implisit.
Ian H.
2

C # .NET, 89 Bytes 87 Bytes

-2 byte terima kasih kepada Lan H.

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;}

Cobalah secara Online!

Emiliano
sumber
Selamat datang di situs ini! :)
DJMcMayhem
Terima kasih! Saya harap tidak masalah untuk mengirim beberapa jawaban dalam bahasa yang sama
Emiliano
Anda bisa menghilangkan kurung keriting di for-loop Anda untuk -2 byte.
Ian H.
2

Kotlin, 207 byte 189 byte 187 byte 177 byte

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())}

Jika bagian depan kosong tetap ada, saya hanya akan menelepon trimEnd()saja trim().

Tidak dijinakkan:

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())
}

Mungkin Kotlin bukan bahasa terbaik untuk kode golf tetapi saya menyukai tantangan dan saya ingin membuat diri saya lebih akrab dengan perpustakaan standar Kotlin.

Willi Mentzel
sumber
1

q / kdb +, 37 byte

Larutan:

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

Contoh:

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"

Penjelasan:

Saya pikir ini adalah ide yang sama dengan solusi J, menghitung indeks yang benar untuk array input dan kemudian menetapkannya ke string kosong dengan panjang yang benar:

@[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
streetster
sumber
1

Jq 1.5 , 91 byte

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

Diperluas

  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

Cobalah online!

jq170727
sumber
1

Arang , 16 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

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
Neil
sumber
1

APL (Dyalog) , 26 byte

Lambda awalan anonim yang mengambil string input sebagai argumen dan mengembalikan string output. Mengasumsikan ⎕IO( I ndex O rigin) 0, yang merupakan default pada banyak sistem.

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

Cobalah online!

{... } lambda anonim; mewakili argumen

≢⍵ penghitungan argumen

 dari banyak ɩ ntegers (0 ... LengthOfArgument-1)

(... )+ ditambah:

  ⎕A⍳⍵ indeks argumen dalam lfabet huruf A besar

i← strore in i(for i ndices)

⌈/ maksimum (reduksi)

1+ tambahkan satu

''↑⍨ ambil banyak karakter dari string kosong, padding dengan spasi sesuai kebutuhan

 hasil yang (berfungsi untuk memisahkan idari '')

⍵@i mengubah bahwa dengan huruf argumen di dalam iindeks

Adm
sumber
1

SOGL V0.12 , 10 byte

ā,{ZFWē+1ž

Coba Di Sini!

Penjelasan:

ā           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
dzaima
sumber
1

Pyth , 44 38 byte

Dipukul 44 masih 44 :(

Pemula berdarah Pyth.

Disimpan 6 byte berkat @Mr. Xcoder.

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

Cobalah online!


Bagaimana?

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
Ian H.
sumber
38 byte:K*d+lz26Vlz K=XK-C@zN-65N@zN;.WqeHdPZK . WqeKd K=PK;Kdiganti dengan .W(sementara fungsional) dan argumennya tentu saja, dan FNrZlzdapat diganti VrZlz, tetapi rZ...berarti U..., dan Udihasilkan secara otomatis oleh V. Jadi FNrZlzmenjadiVlz
Tn. Xcoder
1

Batch, 418 331 byte

Hanya bekerja dengan huruf besar dan membutuhkan beberapa detik untuk string yang lebih panjang.

Pelajari trik baru di sini, konversi karakter ke ASCII menggunakan %=exitcodeAscii%. Juga, if defineddan akses "array" menggunakan call. Juga, golf dengan hampir 100 byte adalah pelatihan golf kode batch yang baik.

Perhatikan spasi tambahan di 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%
schnaader
sumber
1

IBM PC DOS 8088 Assembly ,34 33 byte

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

Tidak disatukan (tidak dirangkai):

    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

Ini adalah PC DOS yang dapat dieksekusi yang mengambil string input dari baris perintah dan mencetak versi "lebih cepat" ke layar. Membutuhkan minimal DOS 1.0 ... mudah-mudahan Anda punya setidaknya itu.

Keluaran

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
640KB
sumber
0

PHP, 127 123 byte

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;}

Cobalah online

Harus memperbaiki bug yang tidak akan menghasilkan 'A' ...

steenbergh
sumber
Untuk yang pernah downvoted: Anda mungkin salah mengklik tombol atas. Harap perbaiki, atau berikan saya satu baris mengapa downvote ... Tnx
steenbergh