Harflerin Hızı


43

Girdi olarak bir dize verildiğinde, her harf kendi alfabe dizini tarafından sağa itildiğinde yeni bir dize yazdırın.

Hepimiz A'nın yavaş ve Z'nin hızlı bir mektup olduğunu biliyoruz. Bu, Z'nin 25 boşluk sağa, A ise hiç kaymadığı ve B'nin 1 boşluk kayar olduğu anlamına gelir.

Programınız yalnızca A'dan Z'ye büyük harflerle işlemelidir, başka karakter yok, boşluk yok, noktalama yok.

Kaydırdıktan sonra 2 veya daha fazla harf aynı alana düşerse, en son karakterin kullanılacağını unutmayın. (Örnek: BA->  A)

Örnekler

"AZ" -> "A                         Z"

"ABC" -> "A B C"

"ACE" -> "A  C  E"

"CBA" -> "  A"

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

kurallar

  • Bu , yani herhangi bir dilde bayttaki en kısa kod kazanır.
  • Standart boşluklar yasaktır.

  • Giriş bir dize olarak alınmalıdır.

  • Sonucu yazdırabilir stdoutveya bir dize döndürebilirsiniz.
  • Bir tek arka boşluk ve / veya satır bırakılır.
  • Ayrıca küçük harfleri giriş veya çıkış olarak da kullanabilirsiniz, ancak yalnızca iki harften de kullanın.

İzleyen boşluklar tamam mı?
Okx

@Okx Evet, önceki yorumuma dikkat edin.
Ian H.

1
Pek çok takip eden boşluktan ne haber?
Okx

1
@Okx Yasak, aldığınız tek şey.
Ian H.

Küçük harfleri kullanabiliriz, değil mi?
Bay Xcoder,

Yanıtlar:



11

MATL , 11 bayt

''jtfy65-+(

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

MATL endekslemesi 1 tabanlıdır. Bu golf hilesi burada kullanılmaktadır. Diğeri kullanılamaz çünkü boş bir dize değil boş bir dizgeye ihtiyacımız var.

'ACE'Bir örnek olarak girişi düşünün . Yığın içeriği alttan üste gösterilir.

''     % 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
(: güzel yerleşik
Erik Outgolfer

@EriktheOutgolfer 05AB1E'ninkiyle aynı olduğunu düşünüyorum ǝ? Ah, ama bu ikinci / üçüncü girdiler üzerinden vektörleşmiyor gibi görünüyor
Luis Mendo

1
Tam olarak neden eşsiz: p ve ayrıca MATL'nin s ile nasıl otomatik doldurduğu 0ve 0boşluk olarak gösterdiği.
Outgolfer Erik,

1
@LuisMendo Güzel cevap. Meraktan uzak ve bu soru muhtemelen çoğu yığın tabanlı dilime uygulanabilir, MATL yazarken yığını takip etmeniz gerekir (örneğin, kodun üstünde bir satırda veya bir kağıt parçası vb.) kod oluştur Yoksa senin yapmadığın kadar doğal hale geldi mi?
Jonah

1
Heh - bugün yeni bir şey öğrendim; MATL (AB) 'de herhangi bir problem olmadan aynı pozisyona iki kez indeksleyebilirsiniz. Zaten karmaşık bir döngü temelli cevap yazmaya başladım, çünkü bunun tersine bir hata vereceğini varsaymıştım.
Sanchises

7

R , 140 133 129 74 bayt

Herkes gibi bir ASCII değer yaklaşımı taşıyan tonlarca bayt kurtardı. Üzgünüm daha önce düşünmedim :(

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

Çevrimiçi deneyin!

Orijinal cevap, 129 bayt:

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

Çevrimiçi deneyin!

Çok uzun bir oboşluklar listesi oluşturur, ardından sdeğerleri odoğru değerle değiştirerek ve en doğru Fkarakterin konumunu güncelleyerek değiştirir . Ardından, aralarında ayırıcı olmayan ilk Föğeleri yazdırır o.


6

05AB1E , 20 16 bayt

Emigna sayesinde -4 bayt

ð₄×svyAuykN+ǝ}ðÜ

Çevrimiçi deneyin!


1
Bence ð₄×svyAuykN+ǝ}ðÜen azından kısaltabilirsin . Ayrıca, kaydırılan giriş dizesinin 1000 karakterden daha büyük olmaması garantisi var mı? Olmazsa, g₂+ð×çalışması gerekir.
Emigna

6

JavaScript (ES6), 81 bayt

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

Rick Hitchcock'un eksik cevabından bir miktar kaynaklanıyor ama oldukça farklı sonuçlandı.

Karakterleri boş bir dizinin kendi dizinine yerleştirir, sonra boş elemanları bir boşlukla değiştirmeye izin vererek [...a]eksik elemanları çevirmek için array spread ( ) işlevini kullanır .undefinedmap

Test Kılıfları


Çok hoş! 88 baytlık bir çözüm göndermek üzereydim, ama seninki daha iyi.
Rick Hitchcock,

5

Perl 5, 42 bayt

İçin 41 bayt kodu + 1 -p. Koddaki \x1bs değişmez kaçış karakterleridir.

İmleci konumlandırmak için ANSI çıkış dizilerine güvenir ve bu nedenle TIO'da çalışmaz.

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

kullanım

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

1
İşte TIO üzerinde çalışan ancak bir bayt daha gelen (41 bayt + 2 için kod -F): Çevrimiçi deneyin!
Xcali

1
@Xcali Bunu göndermelisin ki ben bunu değiştirebilirim :)
Lynn

1
@Xcali Katılıyorum Lynn ile çok daha fazla mesaj harika. Ben de dil yarışmasını seviyorum!
Dom Hastings



4

brainfuck , 127 bayt

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

Çevrimiçi deneyin!

açıklama

,[                    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

Proton , 78 bayt

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

Çevrimiçi deneyin!

Lynn'in çözümünü taşıyarak 69 bayt: x=>{t=[]i=65for k:x{t+=[' ']*26t[ord(k)-i]=k;i--}"".join(t).rstrip()}





2

Wolfram Dili (Mathematica) , 76 bayt

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

Girdi olarak bir karakter listesi alır. Bu, göz ardı edilmesi güvenli olan bazı hata mesajları oluşturur.

Kullanım kolaylığı için TIO bağlantısının alt bölümüne dahil ettim Printve Characterkomut verdim . ( Characterkomut sadece bir dizgiyi karakter listesine dönüştürür)

Çevrimiçi deneyin!


LetterNumberbir harfin alfabedeki konumunu bulmak için yerleşik olarak mı? Vay canına, bu çok saçma.
numbermaniac

2

J, 37 31 bayt

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

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

FrownyFrog sayesinde -6 bayt

açıklama

Her şey bir kanca:

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

Sağ taraf tüm harfler için yeni indeksleri hesaplar.

Sol yan Amend bir gerund formu kullanır }boşlukların gerekli sayıda bir dizi oluşturmak için ilk: (' '#~(1+>./)@]). Ve sonra orijinal dizginin her harfini tüm-boşluk dizgisindeki uygun indeksine yerleştirmek için.

Çevrimiçi deneyin!


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

Parantezleri de bırakabilirsiniz.
FrownyFrog 13:17

@ FrownyFrog tyvm. İkimiz de golf numaralarını unuttum.
Jonah

3 byte ile kaydedebilirsiniz(]' '#~1+>./)
miles

@miles. Güzel. İkili kancaları normal alet kutumun bir parçası yapmam gerekiyor, onları bu sabahki revizyonda kullandığınızı fark ettim.
Jonah


2

Haskell, 88 bayt

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

Çevrimiçi deneyin!

qGiriş dizesinin harflerinin son endekslerinin listesidir (bir ofset ile 65). Tüm endeksleri arasında 65dolaşın (başlangıçta ) ve bunun için tüm harfleri bulun, bir boşluk hazırlayın. Sonuncuyu al.


1
Yine bir 88 baytlık Haskell çözümü, buraya ve buraya bakın .
nimi,

2

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

Ayb4tu sayesinde 7 bayt kaydedildi .

26 bayt kaydetmek stringiçin dönüş tipi değiştirildi 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;}

Çevrimiçi deneyin!


Sen değiştirerek 7 bayt kaydedebilirsiniz t[i+((int)n[i]-65)]için t[i+n[i]-65].
Ayb4btu

@ Ayb4btu Teşekkürler, char -> intdönüşümlerin örtük olduğunu unuttum .
Ian H.

2

C # .NET, 89 Bayt 87 Bayt

Lan H sayesinde -2 bayt

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

Çevrimiçi Deneyin!


Siteye Hoşgeldiniz! :)
DJMcMayhem

Teşekkürler! İnşallah aynı dilde birden fazla cevap gönderebilirsin
Emiliano

forKıvrımlı parantezleri -loop'ta -2 bayt için çıkartabilirsiniz.
Ian H.

2

Kotlin, 207 bayt 189 bayt 187 bayt 177 bayt

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

Öndeki boşluk kalmalıysa ben trimEnd()yerine sadece ararım 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())
}

Belki de Kotlin, kod golf oynamak için en iyi dil değildir, ancak mücadeleyi sevdim ve kendimi Kotlin'in standart kütüphanesinde daha yakından tanımak istedim.


1

q / kdb +, 37 bayt

Çözüm:

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

Örnekler:

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"

Açıklama:

Bunun J çözümü ile aynı fikir olduğunu düşünüyorum, giriş dizisi için doğru endeksleri hesaplayın ve sonra bunları doğru uzunlukta boş bir dizeye atayın:

@[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 bayt

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

Expanded

  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

Çevrimiçi deneyin!


1

Kömür , 16 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

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 bayt

Giriş dizesini argüman olarak alan ve çıktı dizesini döndüren adsız önek lambdası. Devraldı ⎕IO( Ben nDex Ç rigin) 0, birçok sistemde varsayılan olan.

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

Çevrimiçi deneyin!

{} Anonim lambda; argümanı temsil eder

≢⍵ argüman taksitli

 çok sayıda şirketten (0… LengthOfArgument-1)

()+ Artı:

  ⎕A⍳⍵ büyük argüman endeksleri bir lphabet

i← içinde strore iiçin ( i ndices)

⌈/ maksimum (azaltma)

1+ bir tane ekle

''↑⍨ boş dizgiden gelen birçok karakteri alın, gerektiği kadar boşluk bırakın

 ki (ayrılmasını sağlar verim iden '')

⍵@i argüman harflerle o değişiklik dei endeksleri


1

SOGL V0.12 , 10 bayt

ā,{ZFWē+1ž

Burada dene!

Açıklama:

ā           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

Pyth , 44 38 bayt

Çıkarılan 44 hala 44 :(

Kanlı Pyth acemi.

@Mr sayesinde 6 bayt kaydedildi. Xcoder.

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

Çevrimiçi deneyin!


Nasıl?

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 bayt:K*d+lz26Vlz K=XK-C@zN-65N@zN;.WqeHdPZK . WqeKd K=PK;Kile değiştirilir .W(işlevsel süre) ve tabii ki bağımsız değişkenleri ve FNrZlzikame edilmiş olabilir VrZlz, ama rZ...aracı U...ve Uotomatik olarak oluşturulur V. Böylece FNrZlzolurVlz
Bay Xcoder

1

Toplu İş, 418 331 bayt

Yalnızca büyük harflerle çalışır ve daha uzun dizeler için birkaç saniye sürebilir.

Burada yeni numaralar öğrenilmiş, karakter kullanılarak ASCII değer dönüşümüne geçilmiştir %=exitcodeAscii%. Ayrıca if definedve "dizi" erişimini kullanarak call. Ayrıca, yaklaşık 100 baytlık golf, iyi bir toplu iş kodu golf eğitimiydi.

İçindeki sondaki boşluğa dikkat edin 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 Düzeneği ,34 33 bayt

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

Ungolfed (birleştirilmemiş):

    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

Bu, girdi dizesini komut satırından alan ve yeni "daha hızlı" sürümünü ekrana basan tam bir PC DOS çalıştırılabilir dosyasıdır. En az DOS 1.0 gerektirir ... umarım en azından buna sahipsindir.

Çıktı

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 bayt

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

Çevrimiçi deneyin

'A' çıkmayan bir hatayı düzeltmek zorunda kaldım ...


Hiç kim için oy kullanmadı: Muhtemelen yukarı düğmesini yanlış tıkladınız. Lütfen düzeltin ya da neden aşağı oyladığımı söyleyin ... Tnx
steenbergh 13:17
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.