字母位置查找器


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为什么?普遍的共识是,答案应该能够以任何合理的格式输出,因为这可能会增加过多的膨胀,并使其对可以通过较短的空格进行连接的语言不公平。
Okx

1
@TheoC为什么您不只允许两个?
Okx

3
欢迎来到PPCG!总体而言,这是一个不错的挑战,但是下次您发布挑战时,请记住以下几点。1)这个挑战非常简单。我认为,如果可选部分是强制性的,那会更有趣(请注意,现在不要更改该部分,为时已晚)。2)您对某些任意部分有严格的限制。为什么不允许数组?字符数组字符串,这是我们的标准。我建议您仔细阅读本主题的思路。
詹姆斯

2
将来的注意事项:1和0索引通常是相同的,并且通常都允许。同样,束缚输出格式的问题也被拒之门外。如果是值列表,则由语言决定格式。挑战不在于格式化输出,也不在于移位索引。因此,当您只允许语言做他们自然会做的事情并专注于挑战意图时,就不应该成为约束。
魔术章鱼缸

Answers:


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

由于OP希望将其打印成空格,ðý因此可以添加尾随。但是,既然答案输出列表减半了,我想暂时保留一下。
凯文·克鲁伊森

啊。我在回答中错过了它
乔纳森·艾伦

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谢谢!通过将其更改为三进制if还有-3个字节。:)
Kevin Cruijssen

s->{for(int c:s)System.out.print(c>64&~-c%32<26?c%32+" ":"");}(62个字节)使用a char[]作为输入而不是String
奥利维尔·格雷戈尔


4

R55 50字节

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

在线尝试!

从stdin读取输入,转换为大写,删除非大写字母,转换为代码点, 32 减去64 mod,并打印为stdout,以空格分隔。

感谢Kevin Cruijssen的高尔夫!



@KevinCruijssen * facepalm * duh
朱塞佩

我在问题中添加了两个评论(问题)-根据答案,有机会将高尔夫球打低至46甚至39个字符。
JayCe '18年

1
您可以使用[^A-z]
MickyT '18

4

APL(Dyalog Unicode)的24,20,14 13个字节

-4个字节感谢Zacharý(和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ý谢谢!我希望如此(我对J有一定的了解,我对数组语言不是很
Galen Ivanov

1
正如Zachary所指出的那样,括号是假定的,因此您不必将它们包括在字节数中,从而可以得到20个字节。
Xcoder先生18年

1
@Jonah我加了一个解释。你说得对,资本和字母本身更J.多少钱
盖伦·伊万诺夫

1
不错的工作!您可以通过组合保存一个字节1819⌶直接去除27S和保存五:27~⍨⎕A⍳819⌶⍨∘1; 或采取的交点以字母表:⎕A⍳⎕A∩⍨819⌶⍨∘1
ADAM

3

Python 2((45?)55字节

添加了11个字节来格式化输出,这也使其与Python 3不兼容)

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

果冻答案的另一个端口。

在线尝试!


非格式化版本(返回整数列表):

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

1
不幸的是,OP似乎坚持使用空格分隔字符串输出
Sok,

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

@Kevin节省了11个字节

@Neil多了1个字节


您可以为一些额外的字节添加对数字的支持(感谢@neil)

JavaScript(Node.js),62字节

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

在线尝试!


-11个字节,通过改变a-zA-Za-zi.toLowerCase().charCodeAt()-96i.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 -S12 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机器代码提交吗?
雅各布

@雅各布是真的。我在这里不说“ .COM”是因为它是一个函数,也不依赖“ .COM”格式
l4m2

嗯 是的,我认为假定机器代码解决方案不一定是完整的可执行文件。实际上,最好将其标记为“ x86机器代码”
Jakob

2

Stax9 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

Stax,7 个字节

É▌Xl»↔"

运行并调试

这个输出用换行符分隔。开箱:vmVaI^|c。与map类似,但与map一起隐式输出尾随换行符。


嗯 打包程序似乎在空间中结束时存在问题
递归

@recursive哦,没有注意到(通常我尝试链接,但是显然我在这里忘记了)。我添加了一种解决方法。
wastl

我也从未注意到此错误。我将在下一个Stax版本中修复它。现有打包程序将保持不变。
递归

这是给您带来麻烦的9背
递归

2

空白152117字节

-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
我没有把它写在空白的时间,但也许你可以写类似这样
林恩

1
看起来是117个字节!(*我将代码中的64更改为63,因为它是等效的,但在空白中表示较短):)
Lynn

@Lynn不错,-35字节就在那里。谢谢。:)
Kevin Cruijssen



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

在线尝试!


我对Red还不太了解,但是可以#"a"-#"z"同时更改为小写和大写字母。然后lowercase可以将其删除;并-96 + to-char c可以取模32?不确定是否可以将字节保存为红色。
凯文·克鲁伊森

@Kevin Cruijssen谢谢,我稍后再试
Galen Ivanov

parse即使匹配项是单个字符,@ KevinCruijssen 函数也会收集字符串,这就是为什么我始终需要to-char。对于大写字母,我需要将其添加到字符集#“ A”-#“ Z”中,这会破坏消除的收益(如果有的话)lowercase
加伦·伊万诺夫

是的,我有点担心#"A"-#"Z"与相比可能不会获得太多收益lowercase,因为它只短了1个字节。而且我知道您将需要to-char,只是不确定-96 + 与modulo-32的大小是否相似。
凯文·克鲁伊森

1

Perl 5,47个字节

解析数字还有其他挑战:

print map{(ord(uc)-64)%43," "}<>=~/([A-Z\d])/gi

在线尝试!

通过忽略数字减少到38个字节

print map{ord()%32," "}<>=~/([A-Z])/gi

1

PHP,70字节

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

在线尝试!

-5字节感谢Kevin


此处不允许将摘要作为提交,但是您可以使其成为功能或完整程序。
尼莎(Nissa)'18年

抱歉,现在它将第一个参数用作输入
user2803033 '18年

嗨,欢迎来到PPCG!如果您还没有阅读过PHP高尔夫技巧<all language>高尔夫技巧,可能会很有趣。至于零件,您可以打高尔夫球:&&可以&ord(strtolower($c))-96也可以ord($c)%32。另外,我认为您可以删除~before $c,但是我不确定。还没有用PHP进行太多编程,也真的不知道在~这里用了什么。
凯文·克鲁伊森

感谢您的输入。Mod 32是个好主意。这样可以节省一些字节,但需要额外的检查,以确保ORD($ C)比64大
user2803033


1

Japt 2.0 -S,9个字节

f\l ®c %H

在线运行

说明:

f\l ®c %H                                    Input: "Hello..."
f            Match:
 \l             [A-Za-z]                     ["H","e","l","l","o"]
    ®        Map Z over the results:
     c         char-code of Z                [72,101,108,108,111]
       %H      mod 32                        [8,5,12,12,15]
-S           Join the chars with a space     8 5 12 12 15

1

Perl 6,32个字节(字母),41个字节(字母+数字)

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

尝试一下(32个字节的字母)

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

试试看(41个字节的字母+数字)

展开:

32个字节的alpha

{  # 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字符,例如Э,但是我已经要求OP澄清输入是否仅为ASCII。
Jo King


1

PHP 108105字节

在线尝试(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),你可以通过在水平移动用strtolower()保存3个字节strtolower($argv),并解除资本A-Z从正则表达式。
manassehkatz移动2 Codidact

在php 7上它发出警告,我将立即修改答案。很抱歉,没有时间来检查:-D
Francisco Hahn

1
@manassehkatz采纳了您的建议,并保存了3个字节,非常感谢。
弗朗西斯科·哈恩

不应该是$argv[1]$argn代替$argv?。join比短3个字节implode
泰特斯(Titus)


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:感谢Jo King,在解决方案1和2中删除了8个字节


您的代码中有6个多余的空格
Jo King

@JoKing我找到了三个(在分号之后,周围+),其他在哪里?
Theo C

在此之前iffor以及" "
乔·金

您也可以[]join
Jo King

再次,欢迎来到PPCG!FYI默认情况下(即,如果未在问题中明确覆盖),答案提交可能是函数或完整程序(例如104字节版本),而不是摘要(例如96字节版本)。在这里,您可以提交一个版本,该版本创建一个函数,该函数返回 100字节的字符串:)
乔纳森·艾伦

0

PowerShell,63字节

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

在线尝试!

(似乎很长...)

接受输入$args,将其转换为.ToUpper大小写,将其转换为char-array ,并将其输入for each循环。在循环中,我们从(ASCII INT)值自行或64减,基于当前的值是否为-in范围65,以90(即它是一个ASCII大写字母)。这些值留在管道上,我们使用-not equal消除非字母值(因为它们全为零)。这些数字被封装在字符串中,因为数组的默认字符串化是将其以空格分隔,因此我们可以很便宜地得到它。该字符串保留在管道上,并且输出是隐式的。


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]'

根据我们的IO规则,输入通过带有varchar字段s的预先存在的表t进行。

需要SQL 2017或更高版本。还必须在master数据库中运行,因为我正在利用称为的系统表spt_values,该表(按过滤时type='P')包含从0到2047的计数数字。

基本上,我使用SUBSTRING()来将数字表与输入字符串连接在一起,这将为每个字符返回单独的一行。使用仅对字母进行过滤LIKE'[a-z]',然后获得其ASCII值并减去64。使用(SQL 2017的新功能)将这些数字重新组合为字符串STRING_AGG


0

Pyth,10个字节

jdfTmhxGr0

我很确定这可以打一点点... -2字节,如果我可以将其输出为列表,似乎有一些答案,但这不在规格中

在线尝试!


您可以删除最后一个djdfTmhGr0,10个字节)。
Xcoder先生

0

C(gcc),67个字节

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

在线尝试!

将每个字符转换为小写字母,将其代码偏移-96,如果它位于1索引字母的范围内,则输出偏移代码


0

jq,45个字节

[gsub("\\W";"")|explode[]%32|@text]|join(" ")

 gsub("\\W";"")                                # remove non-alpha characters
               |explode[]                      # get decimal values of characters
                         %32                   # get positions in alphabet
                            |@text             # convert back to string
[                                 ]|join(" ")  # join with a space

在线尝试

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.