Швидкість букв


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 Так, зверніть увагу на мій попередній коментар.
Ян Х.

1
А як щодо безлічі просторів?
Okx

1
@Okx Заборонено - це все, що ти отримуєш.
Ян Х.

Я припускаю, що ми можемо замість цього використовувати малі літери, правда?
Містер 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
(: nice
buildin

@EriktheOutgolfer Я думаю, що це схоже на 05AB1E ǝ? Ах, але це, здається, не векторизується над другим / третім введеннями
Луїс Мендо

1
Саме тому він унікальний: p, а також те, як MATL автоматично заповнюється 0s і відображається 0як простір.
Ерік Аутгольфер

1
@LuisMendo Приємна відповідь. З цікавості, і це питання, мабуть, стосується більшості мов, що базуються на стеках, коли ви пишете в MATL, чи потрібно стежити за стеком (наприклад, у рядку над кодом, або аркуші паперу тощо) скласти код? Або вам стало досить природно, що ви цього не зробите?
Іона

1
Хе - сьогодні дізналися щось нове; Ви можете проіндексувати в одній позиції двічі без жодних проблем у MATL (AB). Я вже почав писати складну відповідь на основі циклу, тому що я припускав, що це призведе до помилки в іншому випадку.
Санчіз

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 байт

-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``

Дещо перешкоджає неповній відповіді Ріка Хічкока, але закінчився зовсім іншим.

Розміщує символів у відповідний індекс порожнього масиву, а потім використовує спред масиву ([...a] ) для перетворення відсутніх елементів у undefined, дозволяючи mapзамінити порожні елементи пробілом.

Випробування


Дуже хороша! Я збирався розмістити 88-байтне рішення, але ваше набагато краще.
Рік Хічкок

5

Perl 5, 42 байти

41 байт код + 1 для -p. The\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, але входить на ще один байт (41 байт коду + 2 для -F): Спробуйте в Інтернеті!
Xcali

1
@Xcali Ви повинні опублікувати це, щоб я міг його висловити :)
Lynn

1
@Xcali Погодьтеся з Лінн також більше публікацій чудово. Мені також подобається мовна конкуренція!
Дом Гастінгс



4

мозковий ебать , 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

Мова Вольфрама (Mathematica) , 76 байт

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

Візьме список символів як вхідний. Це створює деякі повідомлення про помилки, які можна ігнорувати.

Я включив Printі Characterкомандую в нижньому колонтитулі посилання TIO для зручності використання. ( Characterкоманда просто перетворює рядок у список символів)

Спробуйте в Інтернеті!


LetterNumberє вбудованим для пошуку положення літери в алфавіті? Святе лайно, це смішно.
numbermaniac

2

J, 37 31 байт

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

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

-6 байт завдяки FrownyFrog

пояснення

Вся справа - гачок:

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

Права сторона обчислює нові індекси для всіх літер.

Ліва сторона використовує }спочатку форму «Змінити», щоб створити рядок необхідної кількості пробілів:(' '#~(1+>./)@]) . А потім помістити кожну букву вихідного рядка у відповідний індекс у рядку все простору.

Спробуйте в Інтернеті!


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

Ви також можете скинути дужки.
FrownyFrog

@FrownyFrog tyvm. Я забув про обидва ці хитрощі.
Йона

Ви можете зберегти 3 байти за(]' '#~1+>./)
миль

@miles. Приємно. Мені потрібно зробити діадикові гачки частиною мого звичайного набору інструментів, я помітив, що ви використовували їх у цій редакції з цього ранку.
Іона


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 дивіться тут і тут .
німі

2

C # (.NET Core) , 117 110 84 байт

Збережено 7 байт завдяки Ayb4tu .

Змінено тип повертається значення від 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;}

Спробуйте в Інтернеті!


Ви можете зберегти 7 байт, змінивши t[i+((int)n[i]-65)]на t[i+n[i]-65].
Айб4бту

@ Ayb4btu Спасибі забули, що char -> intконверсії неявні.
Ян Х.

2

C # .NET, 89 байт 87 байт

-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 байти.
Ян Х.

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

Можливо, Котлін - не найкраща мова для кодового гольфу, але мені сподобалось завдання, і я хотів ознайомитись зі стандартною бібліотекою Котліна.


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⍳⍵)+⍳≢⍵}

Спробуйте в Інтернеті!

{} Анонімна лямбда; представляє аргумент

≢⍵ підсумок аргументу

 ніж багато категорій (0… LengthOfArgument-1)

()+ Плюс:

  ⎕A⍳⍵ індекси аргументу у верхньому регістрі A lphabet

i← бадьорити i(для i ndices)

⌈/ максимум (зменшення)

1+ додати одну

''↑⍨ візьміть, що багато символів з порожнього рядка, прошивши пробілами, якщо потрібно

 урожай, який (служить для відділення iвід '')

⍵@i змінити , що з аргументами букви в тих iіндексів



1

Піта , 44 38 байт

Страйкований 44 все ще 44 :(

Кривавий піт-новачок.

Збережено 6 байт завдяки @Mr. 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(функціональний час) і його аргументи, звичайно, і FNrZlzможуть бути замінені VrZlz, але rZ...означає U..., і Uгенерується автоматично V. Так FNrZlzстаєVlz
Містер 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

Це повноцінний виконуваний комп'ютер 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.