Prędkość listów

43

Biorąc pod uwagę ciąg znaków, wypisz nowy ciąg z każdą literą przesuniętą w prawo przez odpowiedni indeks alfabetu.

Wszyscy wiemy, że A jest wolne, a Z to szybka litera. Oznacza to, że Z zostaje przesunięty w prawo o 25 pól, A w ogóle się nie zmienia, a B zostaje przesunięty o 1 pole.

Twój program musi obsługiwać tylko wielkie litery od AZ, bez żadnych innych znaków, bez białych znaków i interpunkcji.

Zauważ, że jeśli 2 lub więcej liter spadnie na to samo miejsce po przesunięciu, zostanie użyty najnowszy znak. (Przykład: BA->  A)

Przykłady

"AZ" -> "A                         Z"

"ABC" -> "A B C"

"ACE" -> "A  C  E"

"CBA" -> "  A"

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

Zasady

  • To jest , więc wygrywa najkrótszy kod w dowolnym bajcie językowym.
  • Standardowe luki są zabronione.

  • Dane wejściowe należy odbierać jako ciąg.

  • Możesz wydrukować wynik stdoutlub zwrócić ciąg.
  • Pojedynczy pozostawia odstępy na końcu i / lub nowej linii.
  • Możesz także używać małych liter jako danych wejściowych lub wyjściowych, ale używaj tylko obu liter.
Ian H.
źródło
Końcowe białe znaki, dobrze?
Okx,
@Okx Tak, zwróć uwagę na mój poprzedni komentarz.
Ian H.,
1
A co z wieloma końcowymi spacjami?
Okx,
1
@Okx Forbidden, jeden to wszystko, co dostajesz.
Ian H.,
Zakładam, że zamiast tego możemy używać małych liter, prawda?
Pan Xcoder,

Odpowiedzi:

11

MATL , 11 bajtów

''jtfy65-+(

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

Indeksowanie MATL jest oparte na 1. Tutaj stosuje się tę sztuczkę golfową . Tego drugiego nie można użyć, ponieważ potrzebujemy pustego ciągu, a nie pustej tablicy numerycznej.

Rozważ dane wejściowe 'ACE'jako przykład. Zawartość stosu pokazana jest od dołu do góry.

''     % 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
źródło
5
(: ładne wbudowane
Erik the Outgolfer
@EriktheOutgolfer Myślę, że jest podobny do 05AB1E ǝ? Ach, ale wydaje się, że nie jest to wektoryzacja drugiego / trzeciego wejścia
Luis Mendo
1
Dokładnie dlaczego jest wyjątkowy: p, a także jak MATL automatycznie wypełnia się 0s i wyświetla 0jako spację.
Erik the Outgolfer
1
@LuisMendo Ładna odpowiedź. Z ciekawości, to pytanie prawdopodobnie dotyczy większości języków opartych na stosie, kiedy piszesz w MATL-ie, musisz śledzić stos (np. W linii nad kodem lub kartkę papieru itp.) Podczas pisania skomponować kod? Czy stało się dla ciebie na tyle naturalne, że nie?
Jonasz
1
Heh - nauczył się dzisiaj czegoś nowego; w MATL (AB) możesz dwukrotnie indeksować do tej samej pozycji bez żadnego problemu. Już zacząłem pisać skomplikowaną odpowiedź opartą na pętli, ponieważ zakładałem, że w przeciwnym razie dałby błąd.
Sanchises
7

R , 140 133 129 74 bajtów

Zaoszczędzono mnóstwo bajtów przenoszących podejście oparte na wartości ASCII, jak wszyscy inni. Smutne, że wcześniej o tym nie myślałem :(

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

Wypróbuj online!

oryginalna odpowiedź, 129 bajtów:

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

Wypróbuj online!

generuje zbyt długą listę ospacji, a następnie iteruje s, zastępując wartości opoprawną wartością i aktualizując Fpozycję znaku znajdującego się najbardziej po prawej stronie. Następnie drukuje pierwsze Felementy obez separatorów między nimi.

Giuseppe
źródło
6

05AB1E , 20 16 bajtów

-4 bajty dzięki Emignie

ð₄×svyAuykN+ǝ}ðÜ

Wypróbuj online!

Okx
źródło
1
Myślę, że możesz ð₄×svyAuykN+ǝ}ðÜprzynajmniej skrócić . Czy istnieje również gwarancja, że ​​przesunięty ciąg wejściowy nie jest większy niż 1000 znaków? Jeśli nie, g₂+ð×powinno działać.
Emigna
6

JavaScript (ES6), 81 bajtów

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

Trochę wywodzi się z niepełnej odpowiedzi Ricka Hitchcocka, ale okazało się, że jest zupełnie inna.

Umieszcza znaki w odpowiednim indeksie pustej tablicy, a następnie używa tablicy spread ( [...a]), aby zamienić brakujące elementy undefined, umożliwiając mapzastąpienie pustych elementów spacją.

Przypadki testowe

Justin Mariner
źródło
Bardzo dobrze! Właśnie miałem opublikować rozwiązanie 88-bajtowe, ale twoje jest znacznie lepsze.
Rick Hitchcock
5

Perl 5, 42 bajtów

41 bajtów kodu + 1 dla -p. W \x1bów w kodzie są literalne znaki ewakuacyjne.

Opiera się na sekwencjach ucieczki ANSI do pozycjonowania kursora i dlatego nie działa na TIO.

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

Stosowanie

perl -pe 's/./($-=-65+ord$&)?"\x1b[$-C$&\x1b[--$-D":$&/ge' <<< 'HELLOWORLD'
     E H    DLL   OLO   R  W
Dom Hastings
źródło
1
Oto jeden, który działa na TIO, ale pojawia się o jeden bajt więcej (41 bajtów kodu + 2 dla -F): Wypróbuj online!
Xcali,
1
@Xcali Powinieneś to opublikować, abym mógł głosować :)
Lynn,
1
@Xcali Zgadzam się z Lynn, zbyt więcej postów jest świetnych. Lubię też konkursy językowe!
Dom Hastings,
5

Java (OpenJDK 8) , 207 191 189 183 178 174 173 170 bajtów

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('',' ');}

Wypróbuj online!

Roberto Graham
źródło
4

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

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

Wypróbuj online!

Tylko dla @lynn

Xcali
źródło
4

pieprzenie mózgu , 127 bajtów

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

Wypróbuj online!

Wyjaśnienie

,[                    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
źródło
3

Proton , 78 bajtów

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

Wypróbuj online!

69 bajtów przez przeniesienie rozwiązania Lynn: x=>{t=[]i=65for k:x{t+=[' ']*26t[ord(k)-i]=k;i--}"".join(t).rstrip()}

HyperNeutrino
źródło
3

Haskell , 90 88 bajtów

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

Wypróbuj online!

Zgarb
źródło
@Laikoni O rany, źle to odczytałem.
Naprawi
Cóż, nie jest już krótszy. : /
Zgarb
2

Wolfram Language (Mathematica) , 76 bajtów

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

Pobiera na wejściu listę znaków. To generuje pewne komunikaty o błędach, które można bezpiecznie zignorować.

Włączyłem Printi Characterdowodziłem w stopce łącza TIO dla łatwości użytkowania. ( Characterpolecenie po prostu konwertuje ciąg znaków na listę znaków)

Wypróbuj online!

JungHwan Min
źródło
LetterNumberjest wbudowany do wyszukiwania pozycji litery w alfabecie? Cholera jasna, to niedorzeczne.
numbermaniac
2

J, 37 31 bajtów

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

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

-6 bajtów dzięki FrownyFrog

wyjaśnienie

Całość jest hakiem:

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

Prawa strona oblicza nowe indeksy dla wszystkich liter.

Lewa strona używa Gerund formę Zmienić }najpierw stworzyć ciąg niezbędną liczbę miejsc: (' '#~(1+>./)@]). Następnie umieść każdą literę oryginalnego łańcucha w odpowiednim indeksie w łańcuchu spacji.

Wypróbuj online!

Jonasz
źródło
(i.@#+65-~a.&i.)-> (i.@#+65-~3&u:)-> (i.@#-65-3&u:)-> (#\-66-3&u:)
FrownyFrog
Możesz także upuścić nawiasy.
FrownyFrog,
@FrownyFrog tyvm. zapomniałem o obu tych sztuczkach golfowych.
Jonasz
Możesz zapisać 3 bajty za pomocą(]' '#~1+>./)
miles
@miles. Miły. Muszę włączyć dyadyczne haczyki do mojego zwykłego zestawu narzędzi. Zauważyłem, że używałeś ich również w tej wersji od rana.
Jonasz
2

Haskell , 88 bajtów

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

Wypróbuj online!

Laikoni
źródło
2

Haskell, 88 bajtów

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

Wypróbuj online!

qjest listą ostatecznych indeksów liter ciągu wejściowego (z przesunięciem 65). 65Zapętlaj wszystkie indeksy (zaczynając od ) i znajdź wszystkie litery, przygotowując spację. Weź ostatnie.

nimi
źródło
1
Kolejne 88-bajtowe rozwiązanie Haskell, patrz tutaj i tutaj .
nimi
2

C # (.NET Core) , 117 110 84 bajtów

Zaoszczędzono 7 bajtów dzięki Ayb4tu .

Zmieniono typ zwrotu z stringna, char[]aby zapisać 26 bajtów.

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

Wypróbuj online!

Ian H.
źródło
Możesz zapisać 7 bajtów, zmieniając t[i+((int)n[i]-65)]na t[i+n[i]-65].
Ayb4btu
@ Ayb4btu Dzięki zapomniałem, że char -> intkonwersje są niejawne.
Ian H.,
2

C # .NET, 89 bajtów 87 bajtów

-2 bajty dzięki 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;}

Wypróbuj online!

Emiliano
źródło
Witamy na stronie! :)
DJMcMayhem
Dzięki! Mam nadzieję, że można opublikować wiele odpowiedzi w tym samym języku
Emiliano,
Możesz pominąć nawiasy klamrowe w forpętli dla -2 bajtów.
Ian H.,
2

Kotlin, 207 bajtów 189 bajtów 187 bajtów 177 bajtów

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

Jeśli pozostanie puste miejsce, po prostu zadzwonię trimEnd()zamiast trim().

Unminified:

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

Może Kotlin nie jest najlepszym językiem do gry w golfa, ale podobało mi się to wyzwanie i chciałem zapoznać się ze standardową biblioteką Kotlina.

Willi Mentzel
źródło
1

q / kdb +, 37 bajtów

Rozwiązanie:

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

Przykłady:

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"

Wyjaśnienie:

Myślę, że to ten sam pomysł, co rozwiązanie J, oblicz prawidłowe wskaźniki dla tablicy wejściowej, a następnie przypisz je do pustego ciągu o odpowiedniej długości:

@[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
źródło
1

Jq 1,5 , 91 bajtów

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

Rozszerzony

  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

Wypróbuj online!

jq170727
źródło
1

Węgiel drzewny , 16 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

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
źródło
1

APL (Dyalog) , 26 bajtów

Anonimowy przedrostek lambda, który przyjmuje ciąg wejściowy jako argument i zwraca ciąg wyjściowy. Zakłada ⎕IO( I ndex O rigin) 0, co jest domyślne w wielu systemach.

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

Wypróbuj online!

{} Anonimowa lambda; reprezentuje argument

≢⍵ suma argumentu

 niż wiele ɩ ntegerów (0… LengthOfArgument-1)

()+ Plus:

  ⎕A⍳⍵ indeksy argumentu wielkimi literami alfabetu A.

i← strore w i(na i ndices)

⌈/ maksymalna (redukcja)

1+ Dodaj jeden

''↑⍨ weź tyle znaków z pustego ciągu, wypełniając spacjami w razie potrzeby

 wydajność, która (służy do oddzielenia iod '')

⍵@i zmiany, które z literami argumentów w tych iindeksach

Adám
źródło
1

SOGL V0.12 , 10 bajtów

ā,{ZFWē+1ž

Wypróbuj tutaj!

Wyjaśnienie:

ā           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
źródło
1

Pyth , 44 38 bajtów

Przekreślony 44 to wciąż 44 :(

Początkujący Bloody Pyth.

Zaoszczędź 6 bajtów dzięki @Mr. Xcoder.

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

Wypróbuj online!


W jaki sposób?

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.
źródło
38 bajtów:K*d+lz26Vlz K=XK-C@zN-65N@zN;.WqeHdPZK . WqeKd K=PK;Kjest zastąpiony przez .W(funkcjonalny while) i jego argumenty oczywiście i FNrZlzmoże być zastąpiony VrZlz, ale rZ...oznacza U...i Ujest generowany automatycznie przez V. Tak się FNrZlzstajeVlz
Pan Xcoder
1

Partia, 418 331 bajtów

Działa tylko z dużymi literami i dłuższe ciągi znaków potrwają kilka sekund.

Nauczyłem się tutaj nowych trików, konwersji postaci na ASCII za pomocą %=exitcodeAscii%. Ponadto if definedi dostęp do „tablicy” za pomocą call. Również gra w golfa o prawie 100 bajtów była dobrym treningiem golfowym partii.

Zwróć uwagę na końcowe miejsce w 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
źródło
1

IBM PC DOS 8088 Assembly ,34 33 bajty

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

Nie golfowane (niezmontowane):

    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

Jest to kompletny plik wykonywalny DOS dla komputera PC, który pobiera ciąg wejściowy z wiersza poleceń i drukuje nową „szybszą” wersję na ekranie. Wymaga minimum DOS 1.0 ... mam nadzieję, że przynajmniej to masz.

Wynik

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
640 KB
źródło
0

PHP, 127 123 bajtów

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

Wypróbuj online

Musiałem naprawić błąd, który nie wyświetlałby „A” ...

Steenbergh
źródło
Do kogo kiedykolwiek głosował: Prawdopodobnie źle kliknąłeś przycisk w górę. Proszę poprawić lub napisz do mnie, dlaczego opinia ... Tnx
steenbergh