Пошук алфавіту


10

Натхненний Codewars Kata .

Ваша мета - взяти рядок введення, такий як цей:

"'Twas a dark and stormy night..."

і повернути рядок, що містить положення кожного символу в алфавіті, розділений пробілами та ігноруючи неабетичні символи, як це:

"20 23 1 19 1 4 1 18 11 1 14 4 19 20 15 18 13 25 14 9 7 8 20"

Для додаткового виклику ви можете замінити будь-які числові символи в початковому рядку на себе + 27. Наприклад, "25"стане "29, 32". Це абсолютно необов’язково.

Ви повинні використовувати 1-індексування ( 'a'==1, 'b'==2і т.д.)

Додаткові правила:

  • Ви повинні повернути рядок, а не масив.

  • Пробіл пробігу в порядку.

Переможець має найменший кількість байтів.

Удачі!



5
@TheoC Чому? Загальний консенсус полягає в тому, що відповіді повинні бути в змозі виводити в будь-якому розумному форматі, оскільки це може додати занадто багато реклами і зробити це несправедливим щодо мов, які можуть стисло пробіли коротшим чином.
Ок

1
@TheoC Чому ти просто не дозволиш обом?
Okx

3
Ласкаво просимо до PPCG! Це загалом пристойний виклик, але наступного разу, коли ви опублікуєте виклик, ось деякі речі, про які слід пам’ятати. 1) Цей виклик досить простий. Я думаю, що було б цікавіше, якби необов'язкова частина була обов'язковою (зверніть увагу, не змінюйте цю частину зараз, це вже пізно). 2) Ви досить обмежуєте щодо деяких довільних частин. Чому не дозволити масив? Це наші стандарти, ніж масив символів - це рядок . Я рекомендую прочитати цю тему для ідей.
Джеймс

2
Майбутні примітки: 1 та 0 індексування, як правило, одне й те саме, і обидва, як правило, дозволені. Також обмежують вихідні формати. Якщо це список значень, нехай мова визначає формат. Завдання полягає не у форматуванні виводу, а не у зміні індексів. Таким чином, це не повинно бути обмеженням, коли ви можете просто дозволити мовам робити те, що вони роблять природним шляхом, і зосередитись на намірі виклику.
Чарівна восьминога урна

Відповіді:


5

05AB1E , (5?) 7 байт

Правіше два байти - це вихідне форматування

áÇ32%ðý

Порт моєї відповіді Jelly , але O5AB1E є більш лаконічним для фільтрації алфавіту.

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

Як?

áÇ32%ðý - take input implicitly
á       - filter keep alphabetical characters
 Ç      - to ordinals
  32    - thirty-two
    %   - modulo (vectorises)
     ð  - push a space character
      ý - join

Оскільки ОП хочуть, щоб він був надрукований розділеними пробілами, ðýможе бути доданий проміжок. Але оскільки половина списків вихідних відповідей, я думаю, покинути це поки що.
Кевін Круїссен

Ага. Я пропустив це у своїх відповідях ...
Джонатан Аллан

5

Java 8, 82 78 72 69 62 байт

s->{for(int c:s)System.out.print(c>64&~-c%32<26?c%32+" ":"");}

-13 байт завдяки @ OlivierGrégoire .

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

Пояснення:

s->                    // Method with character-array parameter and no return-type
  for(int c:s)         //  Loop over its characters as integers
    System.out.print(  //   Print:
     c>64&~-c%32<26?   //    If the current character is a letter:
      c%32+" "         //     Print the position in the alphabet with a trailing space
     :                 //    Else:
      "");}            //     Print nothing

1
s->s.chars().forEach(c->{if(c>64&~-c%32<26)System.out.print(c%32+" ");})(72 байт).
Олів'є Грегоар

1
@ OlivierGrégoire Дякую! І ще 3 байти, змінивши його на потрійний, якщо. :)
Кевін Кройсейсен

s->{for(int c:s)System.out.print(c>64&~-c%32<26?c%32+" ":"");}(62 байти), використовуючи a char[]як введення замість a String.
Олів'є Грегоар


4

R , 55 50 байт

cat(utf8ToInt(gsub("[^A-Za-z]","",scan(,"")))%%32)

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

Читає введення з stdin, перетворюється на великі регістри, видаляє не великі літери алфавіту, перетворює на кодові точки, віднімає 64 моди на 32 та друкує до stdout, розділених пробілами.

Дякуємо Кевіну Крейсейну за гольф!



@KevinCruijssen * facepalm * duh
Джузеппе

Я додав два коментарі (питання) до питання - залежно від відповіді є можливість пограти в цю гру до 46 або навіть 39 знаків.
JayCe

1
Можна зробити 47 за допомогою[^A-z]
MickyT

4

APL (Dyalog Unicode) , 24, 20, 14 13 байт

-4 байти дякую Захарі (та містеру Xcoder)!

-6 байт завдяки Adám!

-1 байт завдяки ngn!

A⍳⎕A∩⍨≡819⌶⊢

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

Пояснення:

        819⌶⊢  - to uppercase
   A∩⍨         - intersect with the letters A-Z (args swapped to preserve the order)
                 - index in
A               - the A-Z letters list

Моє початкове рішення:

APL (Dyalog Unicode) , 24 20 байт

{⍵/⍨27>⍵}⎕A1(819⌶)⊢

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

Пояснення:

                        indices of     
              1(819⌶)⊢  the right argument (⊢) changed to uppercase
          A            in the list of uppercase letters
{⍵/⍨     }              copy (filter) those items from the list of indeces
     27>⍵               which are smaller than 27 (all non A-Z chars will have index 27)

Не смійся з мене, я новачок у APL :)


1
Це насправді надзвичайно добре для когось нового в APL! Дужки вам не потрібні, вважається. Також {1(819⌶)⍵}може бути 1(819⌶)⊢. Інакше дивовижна робота! Сподіваюся, вам сподобається APL у майбутньому!
Zacharý

@ Zacharý Спасибі! Я сподіваюсь, що так (у мене є деякі знання з J, я не зовсім новий в мовах масиву)
Гален Іванов,

1
Як зазначив Закарі, дужки в дужках припускаються , тому вам не потрібно включати їх у кількість байтів, в результаті чого виходить 20 байт.
Містер Xcoder

1
@Jonah Я додав пояснення. Ви маєте рацію, з великої літери та самого алфавіту коштують набагато дорожче Дж.
Гален Іванов

1
Хороша робота! Ви можете зберегти байт, склавши 1до 819⌶і зберегти п'ять, видаливши безпосередньо 27 27~⍨⎕A⍳819⌶⍨∘1; або ⎕A⍳⎕A∩⍨819⌶⍨∘1
перейдіть

3

Python 2 , (45?) 55 байт

Для форматування виводу додано 11 байт, що також робить це несумісним з Python 3)

lambda s:' '.join(`ord(c)%32`for c in s if c.isalpha())

Ще один порт моєї відповіді на Jelly.

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


Неформатована версія (повернення списку цілих чисел):

lambda s:[ord(c)%32for c in s if c.isalpha()]

1
Схоже, що ОП наполягає на виведенні рядків, розділених пробілами, на жаль
Сок

1
Так - я пропустив, що на всі мої відповіді - людина так звикає до норм сайту!
Джонатан Аллан

3

JavaScript (Node.js) , 69 55 54 байт

t=>t.match(/[a-z]/gi).map(i=>parseInt(i,36)-9).join` `

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

Пояснення:

t =>                       // lambda function accepting a string as input
    t.match(/a-z/gi).      // returns all parts of string that match as an array 
        map(i=>            // map over that array with argument i 
            parseInt(i,36) // convert to base 36 
                - 9        // and subtract 9 from it
        ).                 // end map
        join` `            // convert to space separated string

11 байт збережено завдяки @Kevin

Ще 1 байт завдяки @Neil


Ви можете додати підтримку числових даних для деяких додаткових байтів (завдяки @neil)

JavaScript (Node.js) , 62 байти

t=>t.match(/[^_\W]/g).map(i=>(parseInt(i,36)+26)%36+1).join` `

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


-11 байт шляхом зміни a-zв A-Za-zі i.toLowerCase().charCodeAt()-96доi.charCodeAt()%32
Кевін Cruijssen

1
parseInt(i,36)-9зберігає ще один байт.
Ніл

.match(/[^_\W]/g).map(i=>(parseInt(i,36)+26)%36+1)дозволяє підтримувати номери, не впевнений, чи це найкращий спосіб.
Ніл

2

Желе , (7?) 8 байт

Крайній правий байт - це форматування виводу

fØẠO%32K

Повна програма, що приймає рядок у форматі Python, яка виводить результат на STDOUT

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

Як?

fØẠO%32K - Main Link: list of characters (created from the string input)
 ØẠ      - yield the alphabet = ['A','B',...,'Z','a','b',...,'z']
f        - filter keep (discard non alphabet characters)
   O     - ordinals          ('A':65, 'Z':90, 'a':97, 'z':122, etc.)
     32  - literal thirty-two
    %    - modulo            (65:1,   90':26,  97:1,  122:26,  etc.)
       K - join with spaces (makes a list of characters and integers)
         - implicit print

2

Japt v2.0a0 -S, 12 10 байт

r\L ¨c uH

Спробуй це


Пояснення

r              :Remove
 \L            :  Non-letter characters
    ¬          :Split to array
     ®         :Map
      c        :  Character code
        u      :  Modulo
         H     :  32
               :Implicitly join with spaces and output

2

x86 опкод, 35 байт

0080h: AC 3C 24 75 04 88 45 FF C3 0C 20 2C 60 76 F1 D4
0090h: 0A 0D 30 30 86 E0 3C 30 74 01 AA 86 E0 AA B0 20
00a0h: AA EB DD                                       

f:  lodsb
    cmp al, '$'
    jnz @f
        mov [di-1], al
        ret
    @@:
    or al, 32
    sub al, 96
    jbe f
    aam
    or ax, 3030H
    xchg ah, al
    cmp al, 48
    jz @f
        stosb
    @@:
    xchg ah, al
    stosb
    mov al, 32
    stosb
    jmp f

Якщо припустити, що результат містить хоча б одну букву, і ні {|}~

40 байт, що дозволяє всі символи ASCII

0080h: AC 3C 24 75 04 88 45 FF C3 0C 20 2C 60 76 F1 3C
0090h: 1A 77 ED D4 0A 0D 30 30 86 E0 3C 30 74 01 AA 86
00a0h: E0 AA B0 20 AA EB D9                           

Що таке "x86 опкод"? Це лише подання машинного коду x86?
Якоб

@Jakob правда. Я тут не кажу ".COM", оскільки це функція і не покладатися на формат ".COM"
l4m2

Хм. Так, я вважаю, що рішення машинного коду не повинні бути повноцінними виконуваними файлами. Насправді, можливо, краще просто позначити його "машинним кодом x86"
Якоб

2

Стакс , 9 10 9 байт

üpÉÿ%}},√

Запустіть і налагоджуйте його

-1 байт завдяки @recursive

Пояснення:

v{VaIvm0-J Full program, unpacked, implicit input
v          Lowercase
 {    m    Map:
  VaI        Index in lowercase alphabet (0-based, -1 for not found)
     ^       Increment
       0-  Remove zeroes
         J Join by space
           Implicit output

Стакс , 7 байт

É▌Xl»↔"

Запустіть і налагоджуйте його

Цей виводить розділений рядком новий рядок. Розпаковано:vmVaI^|c . Аналогічно, але з картою, яка неявно виводиться із заднім рядком.


Гм. Здається, є проблема упаковки програм, які закінчуються в просторі
рекурсивна

@recursive О, не помічав цього (зазвичай я пробую посилання, але, мабуть, тут забув). Я додав вирішення.
wastl

Я ніколи не помічав цієї помилки. Я виправлю це в наступному випуску Stax. Існуючі упаковані програми залишаться незмінними.
рекурсивний

Ось 9 повернень для ваших проблем.
рекурсивний

2

Пробіл , 152 117 байт

-35 байт завдяки @Lynn .

[N
S S N
_Create_Label_LOOP][S S S N
_Push_0][S N
S _Duplicate_0][T   N
T   S _Read_STDIN_as_character][T   T   T   _Retrieve][S N
S _Duplicate_input][S S S T S S S S S N
_Push_32][T S T T   _Modulo][S N
T   _Swap_top_two][S S S T  T   T   T   T   T   N
_Push_63][T S T S _Integer_divide][T    S S N
_Multiply][S N
S _Duplicate][S S S T   T   S T T   N
_Push_27][S T   S S T   N
_Copy_1st][S S S T  N
_Push_1][T  S S S _Add][T   S T S _Integer_divide][T    S S N
_Mulitply][N
T   S N
_If_0_Jump_to_Label_LOOP][T N
S T _Print_as_number][S S S T   S S S S S N
_Push_32_space][T   N
S S _Print_as_character][N
S N
N
_Jump_to_Label_LOOP]

Букви S(пробіл), T(вкладка) та N(новий рядок) додаються лише як підкреслення.
[..._some_action]додано лише як пояснення.

Спробуйте його в режимі он-лайн (лише із необробленими пробілами, вкладками та новими рядками).

Пояснення в псевдокоді:

Start LOOP:
  Character c = STDIN as character
  Integer n = (c modulo-32) * (c integer-divided by 63)
  Integer m = 27 integer-divided by (n + 1) * n;
  If(m == 0):
    Go to next iteration of LOOP
  Else:
    Print n as integer to STDOUT
    Print a space to STDOUT
    Go to next iteration of LOOP

1
У мене немає часу , щоб написати це в Whitespace, але , може бути , ви могли б написати що - щось на зразок цього
Lynn

1
Схоже, це 117 байт ! (* У коді я змінив 64 на 63, оскільки це рівнозначно, але коротше для представлення в Whitespace) :)
Лінн

@Lynn Непогано, -35 байт прямо там. Дякую. :)
Кевін Круїссен



1

Вугілля деревне , 21 байт

≔⁺β⭆χιβF↧S¿№βι«I⊕⌕βι→

Спробуйте в Інтернеті!Посилання на багатослівну версію коду. Пояснення:

≔⁺β⭆χιβ

Додайте цифри до заздалегідь визначеної змінної малих літер.

F↧S

Переведіть петлю на нижній регістр входу.

¿№βι«

Якщо поточний символ є буквою або цифрою,

I⊕⌕βι

надрукувати свій 1-індексований індекс,

і залиште пробіл для наступного значення.


1

Червоний , 93 байти

func[s][a: charset[#"a"-#"z"]parse lowercase s[any[copy c a(prin[-96 + to-char c""])| skip]]]

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


Я недостатньо знаю про Червоний, але його #"a"-#"z"можна змінити як на малі, так і прописні літери; і тоді lowercaseбалон можна зняти; а -96 + to-char cможе бути модуль-32? Не впевнений, чи це навіть економить байти в червоному.
Кевін Круїссен

@Kevin Cruijssen Спасибі, я спробую пізніше
Гален Іванов,

parseФункція @KevinCruijssen збирає рядки, навіть якщо відповідність є одним символом, тому мені завжди потрібна to-char. Для великих літер мені потрібно додати до діаграми № "A" - # "Z", яка псує виграш (якщо такий є) від усунення lowercase.
Гален Іванов

Так, я боявся, що він #"A"-#"Z"не набере багато порівняно з тим lowercase, що він лише на 1 байт коротший. І я знав, що вам знадобиться to-char, просто не був впевнений, чи буде -96 + модуль-32 схожим за розміром.
Кевін Кройсейсен


1

PHP , 70 байт

for(;$c=$argv[1][$i++];)if(($c=ord($c))>64&($c%=32)>0&$c<27)echo"$c ";

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

-5 байт завдяки Кевіну


Знімки тут не дозволено як подання, але ви можете зробити його функцією або повноцінною програмою.
Нісса

Вибачте, зараз він використовує перший аргумент як вхід
user2803033

Привіт, Ласкаво просимо до PPCG! Якщо ви ще цього не зробили, цікаві для прочитання поради щодо гольфу в PHP та поради щодо гольфу на <всіх мовах> . Що стосується деталей, то &&можна займатися гольфом: можна &, і ord(strtolower($c))-96можна ord($c)%32. Також, я думаю, ви можете видалити ~раніше $c, але я не впевнений. Не програмував багато в PHP, і не знаю, для чого ~тут все-таки використовується.
Кевін Круїссен

Дякуємо за ваш внесок. Mod 32 - хороша ідея. Він економить кілька байт, але вимагає додаткової перевірки, щоб переконатися, що ord ($ c) більше 64.
user2803033

1

Perl 5 -p , 35 байт

$_="@{[map{(-64+ord uc)%43}/\w/g]}"

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

Включає додаткову частину про цифри.


1
/\w/включає_
Бред Гілберт b2gills

Набагато менший за те, з чим я грався! Ви можете зберегти один байт та виправити згадану помилку @ BradGilbertb2gills, скориставшись -F/[^0-9\pL]|/: Спробуйте в Інтернеті!
Дом Гастінгс


1

Perl 6 , 32 байти (альфа), 41 байт (альфа + цифра)

{~(.uc.comb(/<:L>/)».ord X-64)}

Спробуйте (32 байти альфа)

{~((.uc.comb(/<:L+:N>/)».ord X-64)X%43)}

Спробуйте (41 байт альфа + цифра)

Розширено:

32 байти альфа

{  # bare block lambda with implicit parameter $_

  ~( # coerce to string (space separated)

      .uc                      # uppercase
      .comb( / <:L > / )\      # get letters as a sequence
      ».ord                    # get the ordinal of each
      X- 64                    # subtract 64 from each
  )
}

41 байт альфа + цифра

{  # bare block lambda with implicit parameter $_

  ~( # coerce to string (space separated)
    (
      .uc                      # uppercase
      .comb( / <:L + :N > / )\ # get letters and numbers as a sequence
      ».ord                    # get the ordinal of each
      X- 64                    # subtract 64 from each
    ) X% 43                    # modulus 43 for each
  )
}

Це також відповідає символам, що не належать до ASCII Э, але я попросив роз'яснити в ОП питання про те, чи вхід є лише ASCII чи ні.
Джо Кінг


1

PHP 108 105 байт

Спробуйте в Інтернеті (108 байт)

Перевірте це онлайн (105 байт)

-3 байти, завдяки @manassehkatz (Змініть рівень strtolower та видаліть AZ з регулярного виразу)

Код, намагався уникати будь-якого циклу

<?=strtr(implode(" ",str_split(preg_replace(
"/[^a-z]/",'',strtolower($argv)))),array_flip(range("`",z)));

Пояснення

$string = preg_replace("/[^a-z]/",'',strtolower($argv))  
//the string only contains letters

$string = implode(" ",str_split($string)); 
//the string has a space after every letter

$string = strtr($string, array_flip(range("`",z)));  
//replace every letter   acording to the array

$replacementArray = array_flip(range("`",z));
//this array contains the ansi characters from "`" to the "z"
//array_flip to change the keys with the values
//final array ["`"=>0,"a"=>1, "b"=>2...."z"=>26]

Щоб змусити це запуститись без попереджень, мені довелося (a) змінити $ argv на $ argv [1] і (b) додати "навколо останнього z. Але з тими чи без цих змін (які можуть залежати від версії - я я використовую 5.6), ви можете зберегти 3 байти, перемістивши strtolower () врівень strtolower($argv)і A-Z
вилучивши

На php 7 він загрожує попередженням, я зараз зміню відповідь. Мені дуже шкода, що жоден wi не встиг перевірити:
Франсіско Ган

1
@manassehkatz Взяв вашу пропозицію та врятував 3 байти, спасибі велике.
Франциско Хан

Це не повинно бути $argv[1]чи $argnзамість цього $argv? joinна 3 байти коротше implode.
Тит


0

Python 2, 110 байт 104 байти , з введенням користувача

a="abcdefghijklmnopqrstuvwxyz";print" ".join(str(a.index(l)+1)for l in list(input().lower())if l in a)

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


Python 2, 105 байт 104 байт 96 байт , де tпопередньо визначено:

a="abcdefghijklmnopqrstuvwxyz";print" ".join(str(a.index(l)+1)for l in list(t.lower())if l in a)

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

Давайте розбимо його з більш читаною версією:

alphabet = "abcdefghijklmnopqrstuvwxyz"
foo = [str(alphabet.index(letter) + 1) for letter in list(t.lower()) if letter in alphabet]
print " ".join(foo)

Спочатку ми визначаємо alphabetяк буття, ну абетка.

Далі ми використовуємо розуміння списку для:

  1. Складіть список, з якого кожен елемент є малим символом t
  2. Для кожної літери, якщо її немає в алфавіті, відмовтеся від неї.
  3. Якщо це так, знайдіть його індекс в алфавіті,
  4. додати до нього (адже ми починаємо рахувати з 1)
  5. і зробити це струною.

Нарешті ми приєднуємось до цього всі разом і друкуємо.


Редагувати: Змінено на print(і втрачено портативність), щоб зберегти байти і змусити працювати поза функцією

Редагування 2: Додана версія з input()замість попередньо визначених змінних

Редагування 3: Видалено 8 байтів у Рішеннях 1 і 2 завдяки Джо Кінгу


У вашому коді є 6 сторонніх пробілів
Джо Кінг,

@JoKing Я знайшов три (після крапки з комою, навколо +), де інші?
Тео С

Перед тим if, forі" "
Джо Кінг

Ви також можете видалити []вjoin
Jo King

Знову, ласкаво просимо до PPCG! За замовчуванням FYI (тобто, якщо це явно не перекреслено у запитанні), подання відповідей може бути функціями або повнопрограмними програмами (на зразок 104-байтної версії), але не фрагментами (наприклад, вашою 96-байтною версією). Тут ви можете надіслати версію, яка створює функцію, яка повертає рядок на 100 байт :)
Джонатан Аллан

0

PowerShell , 63 байти

"$(([char[]]"$args".ToUpper()|%{$_-($_,64)[$_-in65..90]})-ne0)"

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

(Здається довго ...)

Бере вхід $args, перетворює його .ToUpperрегістр, charпередає його як- масив, подає його в for eachцикл. Всередині циклу ми віднімаємо або себе, або 64 від значення (ASCII int), виходячи з того, чи є поточне значення -inдіапазоном 65до 90(тобто це велика літера ASCII). Ці значення залишаються на конвеєрі, і ми використовуємо -not ekval для усунення не буквених значень (тому що всі вони дорівнюють нулю). Ці числа інкапсульовані в рядок, тому що за замовчуванням класифікація масиву - це розділення його пробілом, тому ми отримуємо це досить дешево. Ця рядок залишена на конвеєрі, а вихід неявний.


0

MS-SQL, 133 байт

SELECT STRING_AGG(ASCII(substring(upper(s),number+1,1))-64,' ')FROM
spt_values,t WHERE type='P'AND substring(s,number+1,1)LIKE'[a-z]'

Згідно з нашими правилами вводу- виводу , введення приймається через попередньо існуючу таблицю t з полем varchar s .

Потрібен SQL 2017 або новішої версії. Необхідно також запустити в masterбазі даних, тому що я користуюсь системною таблицею під назвою spt_values, яка (коли відфільтровано поtype='P' ) містить підрахунок чисел від 0 до 2047.

В основному я приєднуюся до таблиці цифр із вхідним рядком, використовуючи SUBSTRING()який повертає окремий рядок для кожного окремого символу. Це фільтрується лише за допомогою букв LIKE'[a-z]', тоді ми отримуємо їх значення ASCII і віднімаємо 64. Ці числа з'єднуються назад у рядок за допомогою функції (нова для SQL 2017) STRING_AGG.


0

Pyth , 10 байт

jdfTmhxGr0

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

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


Ви можете видалити останні d(( jdfTmhGr010 байт).
Містер Xcoder

0

C (gcc) , 67 байт

c;f(char*s){for(;*s;)(c=tolower(*s++)-96)>0&c<27&&printf("%d ",c);}

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

Перетворює кожну таблицю в малі регістри, компенсує її код на -96 і, якщо вона потрапляє в діапазон 1-індексованого алфавіту, друкує код зміщення


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