贝纳迪诺确定不变的美元单词


47

定义

美元单词是一个单词,其中每个字母都给出一个分值(从a = 1到z = 26),并将这些字母相加,结果为100。是CodeReview的示例,是一个列表我在网上找到的美元词汇

输入项

输入将以一种语言的文本数据类型(允许使用数组)从z字母开始。您无需考虑任何其他输入-不会有空格,撇号或连字符。您可以采用小写,大写或组合形式。尾随换行符是允许的。

输出量

如果输入是美元单词,则输出真实值,否则输入错误值。

测试用例

真相:

buzzy
boycott
identifies
adiabatically
ttttt

虚假:

zzz
zzzzzzz
abcdefghiljjjzz
tttt
basic

这是代码高尔夫球,因此最短答案以字节为单位!适用标准漏洞和规则。领带去了第一张海报。


20
标题中包含美元字样,如果将您拒之门外,抱歉。
斯蒂芬

Answers:


7

GS2,6个字节

▲1Θd←q

输入必须为大写。

在线尝试!

这个怎么运作

  Θ       Combine the previous two tokens into a block and map it over the input.
▲             Push 64.
 1            Subtract 64 from the character on the stack.
   d      Take the sum of the resulting character array.
    ←     Push 100.
     q    Compare the two items on the stack for equality.



11

Perl 6,21个字节

{100==[+] .ords X%32}

试试吧

备用:

{Ⅽ==[+] .ords X%32}

试试吧

请注意,ROMAN NUMERAL ONE HUNDREDU + 216D用的... 100 UNIVAL
这需要3个字节来编码。

展开:

{  # bare block lambda with implicit parameter $_

  100     # is 100
  ==      # equal to
  [+]     # the sum of the following

    .ords # the ordinals of the input (implicit method call on $_)
    X[%]  # crossed using the modulus operator
    32    # with 32 to get 65..90 or 97..122 to become 1..26
}

11

MATL,8字节

96-s100=

使用小写输入。

在线尝试!

说明

该代码具有可读性:

96-   % Implicitly input string. Subtract 96 from each char interpreted as ASCII code
s     % Sum of array
100=  % Does it equal 100? Implicitly display

7

JavaScript(ES6),46个字节

返回01

let f =

w=>[...w].map(c=>p-=parseInt(c,36)-9,p=100)|!p

console.log(f('buzzy'))
console.log(f('qwerty'))


有趣的是,当我尝试reduce递归时,它们的输出时间都增加了2个字节。
尼尔

@Neil实际上,reduce()最初在宽限期的前几分钟使用了它。
Arnauld

7

Haskell,32个字节

f s=sum[1|c<-s,_<-['a'..c]]==100

在线尝试!

这个想法是为列表中的a每个字符创建一个从字符到给定字符的字符列表,并检查总长度为100。

其他尝试:

f s=sum[1|c<-s,_<-['a'..c]]==100

f s=sum[fromEnum c-96|c<-s]==100
f s=100==length((\c->['a'..c])=<<s)
(==100).length.(>>= \c->['a'..c])
(==100).length.(=<<)(\c->['a'..c])
(==100).length.(enumFromTo 'a'=<<)
f s=100==length(do c<-s;['a'..c])

太糟糕了enumFromTo


1
您是对的,长度太可惜了- (100==).length.(enumFromTo 'a' =<<)如此干净利落地使用了自由点
朱利安·沃尔夫

7

C,45 43字节

感谢@Neil节省了两个字节并使解决方案不区分大小写!

n;f(char*s){for(n=100;*s;)n-=*s++&31;n=!n;}

在线尝试!


好像可以通过n=0全局设置然后跳过循环规范的第一子句来保存字节,不是吗?编辑:没关系-我猜这只会在第一次通话时起作用。
朱利安·沃尔夫

3
可以从100个保存字节开始递减计数吗?另外,&31可能会使您的代码不区分大小写。
尼尔,

出于好奇,如何n=!n运作?我了解它会检查是否n为零,因为基于某些测试,我看到了!0return 1!15回报0; 并!-15返回0。但为什么?将!C用作哪个操作数!integer
凯文·克鲁伊森

@KevinCruijssen !只是合乎逻辑的not。在C中,0表示false,而任何其他整数值表示true。因此!0 == 1,并!n == 0为每一个n != 0
Steadybox '17

@Steadybox嗯,我不知道这部分:“ 和其他任何整数值都表示true ”,但这确实是有道理的。我总是(错误地)认为它是0=false; 1=true替代品,因此我感到困惑。感谢您的回答。
凯文·克鲁伊森


6

Mathematica,23个字节

100==Tr@LetterNumber@#&

将字符串(或字母数组)作为输入,不区分大小写并返回True或的纯函数False。这里Tr只是将字母数字加在一起;其他一切都是不言自明的。


6

果冻9 7?* 8字节

ɠO%32S⁼³

完整程序,如果输入是美元字,则输出1,否则输入0。

在线尝试!

怎么样?

ɠO%32S⁼³ - Main link
ɠ        - read a line of input from STDIN
 O       - cast to ordinals
  %32    - mod 32 (vectorises) (-3*32=96 from lowercase; -2*32=64 from uppercase)
     S   - sum
       ³ - literal: 100
      ⁼  - equal?

*可以是7个字节吗?

此输入了与唯一原因ɠ是保持³作为文字100,而不是3 的命令行输入(1 ST程序输入)。

正如Dennis所指出的,一种避免这种情况的方法是使用原始文字形式ȷ210 2创建100 。这导致了另一个8字节O%32S=ȷ2,但是这是现在的未命名一元函数(以及操作为具有3全程序RD参数)。

由于在高尔夫运动中,可能会创建变量或辅助函数来限制它们可能驻留的程序(在不停止功能可重用的情况下,无法在范围内重用名称),因此可能会将程序限制为仅从STDIN输入也可以接受,在这种情况下7字节O%32S=³在这里可以作为未命名函数使用。


1
或者,O%32S=ȷ2。适用于大写和小写输入。
丹尼斯

@Dennis可能是临界点,但O%32S⁼³实际上并不会是有效条目,因为它确实定义了未命名的可重用函数,只要程序中的其余部分不使用命令行参数作为输入?
乔纳森·艾伦

嗯,我想可以做到的。例如,与在C语言中使用全局变量没什么不同。
丹尼斯

6

爱丽丝,23字节

/o!
\i@/e)q&w[?'`-+k3-n

在线尝试!

输入应为小写。打印1美元字等0

说明

是时候炫耀爱丽丝的录音带和一些高级控制流程了。尽管Alice擅长分别处理整数和字符串,但Alice并没有内置功能来a)确定字符串的长度,b)在字符及其代码点之间进行转换。原因是所有Alice的命令要么将整数映射为整数,要么将字符串映射为字符串。但是这两个都需要将字符串映射到整数,反之亦然,因此它们都不适合Alice的任何一种模式。

但是,除了堆栈之外,Alice还拥有一个磁带,并且Cardinal和Ordinal模式以不同的方式解释磁带上的数据

  • 在Cardinal模式下,它是Brainfuck等其他语言所熟悉的常规磁带。您可以在每个单元格中存储一个整数,并且可以左右移动磁带头。磁带无限长,最初在每个单元格中都为-1。单元也被索引,并且磁带头从索引0开始。
  • 顺序模式具有自己的磁带头(也从索引0开始),它将磁带解释为字符串列表。字符串以非字符单元(即不是有效Unicode代码点的任何值)终止,尤其是-1。因此对于“序数”模式,磁带最初填充有空字符串。

该磁带可用于以上两种操作:要获得字符串长度,我们以“序数”模式将其写入磁带,在“基数”模式下寻找终止-1并获取磁带头的位置。要将字符转换为它们的代码点,我们只需在基数模式下从磁带上读取它们即可。

此解决方案中使用的其他两个重要功能是返回堆栈和迭代器。爱丽丝有一个返回栈,该栈通常在使用jump命令时填满j,您可以从中弹出一个地址跳回k。但是,也可以将当前地址压入返回堆栈,而无需使用跳转到任何地方w。如果我们wrepeat命令结合使用&,我们可以将当前地址压入返回栈n次。现在,每次到达时k,都会从返回堆栈中弹出一个副本,然后从执行任何操作开始另一次迭代,w(从其后的单元开始,因为IP在执行另一条命令之前就移动了)。当返回堆栈变空时,k什么也不做,IP只是通过。因此,&w...k弹出一个整数n,然后执行... n + 1时间,这为我们提供了一种非常简洁的方式来表达一个简单的for循环。

代码本身...

/     Reflect to SE. Switch to Ordinal.
i     Read the input word as a string.
      Bounce off bottom boundary, move NE.
!     Store the input word on the tape.
      Bounce off top boundary, move SE.
/     Reflect to E. Switch to Cardinal.
e     Push -1.
)     Seek right on the tape for a -1, which finds the -1 terminating
      the input word.
q     Push the tape head's position, which gives us the string length N.
&w    Repeat this loop n+1 times (see above for an explanation)...
  [     Move the tape head left by one cell.
  ?     Retrieve the code point of the character in that cell.
  '`    Push 96.
  -     Subtract it from the code point to convert the letters to 1...26.
  +     Add the result to a running total. This total is initialised to 
        zero, because in Cardinal mode, the stack is implicitly filled with
        an infinite amount of zeros at the bottom.
k    End of loop.
     Note that the above loop ran once more than we have characters in the
     string. This is actually really convenient, because it means that we've
     added a "-1 character" to the running total. After subtracting 96 to
     convert it to its "letter value" this gives 97. So dollar words will
     actually result in 100 - 97 = 3, which we can check against for one
     byte less than for equality with 100.
3-   Subtract 3 to give 0 for dollar words.
n    Logical NOT. Turns 0 (dollar words) into 1 and everything else into 0.
     The IP wraps around to the beginning of the first line.
\    Reflect to NE. Switch to Ordinal.
o    Implicitly convert the result to a string and print it.
     Bounce off top boundary, move SE.
@    Terminate the program.

真好!我的第一次尝试获得了41分
Kritixi Lithos

6

R,55 54字节

function(x)sum(match(el(strsplit(x,"")),letters))==100

-1字节归功于BLT

  • 返回执行所需计算的函数,该函数将返回TRUE并按FALSE预期执行。

  • 以小写形式输入;只能是从lettersLETTERS所有大写的切换


1
function(x)sum(match(el(strsplit(x,"")),letters))==100保存一个字节。
BLT

6

Ruby,25个字节

->s{s.sum-s.size*64==100}

适用于大写。

我看到了几个更复杂的Ruby条目,但这确实很简单。s.sum加上输入字符串的ASCII码,然后我们减去字符串长度的64倍。

使用例

f=->s{s.sum-s.size*64==100}

puts f["ADIABATICALLY"]
puts f["ZZZ"]

这仅适用于Ruby 2.4,目前不适用于TIO
GB

1
@GB感谢您的评论,但我运行的是2.2.6,对我来说很好。自1.9.3起已记录该功能。我也可以在TIO.run和Ideone.com上使用。
Level River St

你说得对,我还以为是一样的阵列#总和,这在2.4是新的
GB

实际上,它不是ASCII值的总和,其定义是“返回str中字符的基本n位校验和”。在这种情况下,当然可以。
GB


5

05AB1E,9个字节

5bIvAyk>-

在线尝试!

说明

由于1是05AB1E中唯一的真实值,因此我们可以通过减去100来节省一个字节。

5b         # convert 5 to binary (results in 101)
  Iv       # for each letter in input word
    Ayk    # get the index of the letter in the alphabet
       >   # increment
        -  # subtract from total

5

Perl 5,30个字节

-1个字节感谢@Neil(31&而不是-96+)。

29个字节的代码+ -p标志。

$@+=31&ord for/./g;$_=$@==100

在线尝试!


您可以31&ord改用吗?
尼尔

@Neil Hum ...我一直在用-96+这种东西。。非常感谢!(但现在我觉得我应该回过头看旧帖子,并替换每个-96+:x)
Dada

问题指定允许数组作为输入。因此,这可以作为子例程更简短:({$@+=31&ord for@_;$@==100}未测试)
msh210 '17

我猜这取决于上下文-在这里您在中使用它+=,但是在其他情况下,您可能会浪费掉括号中的内容。
尼尔

@ msh210挑战说 your one language's text datatypes。数组几乎不是Perl的文本数据类型...(否则,它实际上会节省1个字节)
Dada

5

的PowerShell36 30字节

$args|%{$s+=$_[0]-96};$s-eq100

在线尝试!

输入为数组,但我想知道是否有更好的方法来处理字符。

编辑错过了一个简单的空间,但是@AdmBorkBork也请让我知道:P,事实上,还有一种更好的方式来处理字符!


Hiya-情侣快速高尔夫。您不需要周围的括号[char]$_-96,也不需要在-eq和之间的空格100,使您降至33。也可以"$_"[0]代替[char]$_,使您降至32。可以在线尝试!
AdmBorkBork '17

"周围$_有必要吗?它似乎不需要演员就可以工作。可能是由于输入已经是字符串数组吗?
Sinusoid

啊,确实你是对的。将"不需要在这个特定的实例。
AdmBorkBork '17

5

爱丽丝28 18字节

感谢@MartinEnder打高尔夫球10个字节

=I.!'`-+?hn
>3-nO@

在线尝试!

此提交使用与@MartinEnder答案不同的方法。

该提交输出 0x00是虚假的和0x01真实的。

因此,这里有一个输出01替代的版本:试试吧!

说明

以下说明适用于“可见”版本。两者非常相似,除了在第一个程序中,最后一个o不将01转换为字符串(因为我们处于基数模式),而是取数字并在该代码点输出字符。

=                 Does nothing, but will be useful later on
I                 Read a character and push its code point onto the stack
                  If there is no more input, -1 is pushed instead
.                 Duplicate it
!                 Store it on the tape
#                 Skip the next command
o                 Gets skipped
'`                Push 96
-                 Subtract it from the character
+                 And add it to the total
?                 Load the number on the tape
h                 Increment it
n                 And negate it
                  For all characters that are read, ?hn results in 0,
                  but if -1 is pushed, then the result becomes 1

之后,IP会绕到IP的左边缘=。如果栈顶值为0,则IP继续其路径,增加所有字符的总和,一旦输入完成(栈顶将为1),则IP向右转(90度)。

需要注意的一点是,输入结束后,第一行的循环将迭代一次。这将从总数中减去9796'`和中减去-1输入)。

>                Set the direction of the IP to East
3-               Subtract 3 from it (yields 0 if sum is 100, something else otherwise)
n                Negate it; Zero becomes 1, non-zero numbers become 0
/                Mirror; the IP gets redirected South-East
                 The IP reflects off the bottom and goes North-East
                 Now the program is in Ordinal mode, where numbers are automatically converted into strings when being used
o                Output the top of the stack as a string
                 IP reflects off the top and heads South-East
@                End the program

5

出租车,1259字节

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to Auctioneer School.Go to Auctioneer School:s 1 r 1 l 1 l.Pickup a passenger going to Chop Suey.0 is waiting at Starchild Numerology.Go to Starchild Numerology:s 1 l.Pickup a passenger going to Addition Alley.Go to Chop Suey:e 1 l 2 r 3 r 3 r.[a]Switch to plan "b" if no one is waiting.Pickup a passenger going to Charboil Grill.Go to Charboil Grill:n 1 l 3 l 3 l.Pickup a passenger going to What's The Difference.Go to Go More:e.64 is waiting at Starchild Numerology.Go to Starchild Numerology:e 2 r.Pickup a passenger going to What's The Difference.Go to What's The Difference:e 1 l 2 r 1 l.Pickup a passenger going to Addition Alley.Go to Addition Alley:e 2 r.Pickup a passenger going to Addition Alley.Go to Chop Suey:n 1 r 2 r.Switch to plan "a".[b]Go to Addition Alley:n 1 l 2 l.Pickup a passenger going to Equal's Corner.100 is waiting at Starchild Numerology.Go to Starchild Numerology:n 1 l 1 l 3 l 2 r.Pickup a passenger going to Equal's Corner.Go to Equal's Corner:w 1 l.Switch to plan "c" if no one is waiting."TRUE" is waiting at Writer's Depot.[c]"FALSE" is waiting at Writer's Depot.Go to Writer's Depot:n 1 l 1 r.Pickup a passenger going to Post Office.Go to Post Office:n 1 r 2 r 1 l.

带有换行符,它看起来像这样:

Go to Post Office:w 1 l 1 r 1 l.
Pickup a passenger going to Auctioneer School.
Go to Auctioneer School:s 1 r 1 l 1 l.
Pickup a passenger going to Chop Suey.
0 is waiting at Starchild Numerology.
Go to Starchild Numerology:s 1 l.
Pickup a passenger going to Addition Alley.
Go to Chop Suey:e 1 l 2 r 3 r 3 r.
[a]
Switch to plan "b" if no one is waiting.
Pickup a passenger going to Charboil Grill.
Go to Charboil Grill:n 1 l 3 l 3 l.
Pickup a passenger going to What's The Difference.
Go to Go More:e.
64 is waiting at Starchild Numerology.
Go to Starchild Numerology:e 2 r.
Pickup a passenger going to What's The Difference.
Go to What's The Difference:e 1 l 2 r 1 l.
Pickup a passenger going to Addition Alley.
Go to Addition Alley:e 2 r.
Pickup a passenger going to Addition Alley.
Go to Chop Suey:n 1 r 2 r.
Switch to plan "a".
[b]
Go to Addition Alley:n 1 l 2 l.
Pickup a passenger going to Equal's Corner.
100 is waiting at Starchild Numerology.
Go to Starchild Numerology:n 1 l 1 l 3 l 2 r.
Pickup a passenger going to Equal's Corner.
Go to Equal's Corner:w 1 l.
Switch to plan "c" if no one is waiting.
TRUE is waiting at Writer's Depot.
[c]
FALSE is waiting at Writer's Depot.
Go to Writer's Depot:n 1 l 1 r.
Pickup a passenger going to Post Office.
Go to Post Office:n 1 r 2 r 1 l.

它接受大写或小写,因为Auctioneer School将其全部转换为大写。
Chop Suey将其分解为单个字符。
Charboil Grill将字符转换为其ASCII码。
我们一次拾取一个字符,将其转换为ASCII,减去65,然后将其添加到运行总计中。
一旦没有更多字符,将总数与100进行比较。

返回TRUE美元单词和FALSE其他所有内容。


1
在一个“无聊的”无法理解的代码高尔夫球语言中,答案少于20bytes的世界,我欢迎您,亲切的陌生人。
奥利维尔·杜拉克

5

IA-32机器码,21个字节

十六进制转储:

33 c0 6a 64 5a 8a 01 41 24 1f 75 05 83 ea 01 d6
c3 2b d0 eb f0

汇编代码:

    xor eax, eax;   initialize eax to 0
    push 100;       initialize edx
    pop edx;            to 100
myloop:
    mov al, [ecx];  load a byte
    inc ecx;        go to next byte
    and al, 31;     convert from letter to number
    jnz cont;       not done? continue

    ;               done:
    sub edx, 1;     check whether edx got to 0; result is in CF
    __emit(0xd6);   aka SALC - set al to CF
    ret
cont:
    sub edx, eax
    jmp myloop

从100到0计数。如果到达0,则返回true(0xff);否则,返回true。否则为假(0x00)。


5

Dyalog APL,17 15字节

100=+/17-⍨⎕AV⍳⍞

使用Dyalog Classic字符集。

              ⍞  ⍝ string input
          ⎕AV⍳   ⍝ index in the character map
      17-⍨       ⍝ subtract 17 from each ('a' = 18)
    +/           ⍝ sum
100=             ⍝ equal to 100?

默认情况下,所有提交都必须是完整的程序或功能。只要识别出REPL程序即可。但是,您仍然必须请求用户输入。
丹尼斯

4

Python,38个字节

lambda s:sum(map(ord,s))==4-96*~len(s)

在线尝试!

ovs解决方案的长度相同。而不是从每个ord值中减去96,而是检查ord总数是否等于100+96*len(s)。它表示为短一个字节4-96*~len(s),等于4-96*(-len(s)-1)


在Python 3中,lambda s:sum(s.encode(),96*~len(s))==4也可以使用。
丹尼斯


4

视网膜47 23字节

\w
!$&
}T`l`_l
^!{100}$

在线尝试!注意:标头将输入小写并将其拆分为单词;结果显示在单独的行上。编辑:由于@MartinEnder,节省了太多字节。


这是一个很大较短逐渐降低他们计算字母的数值而插入字符:tio.run/nexus/...
马丁安德

4

八度,18字节

@(x)sum(x-96)==100

96从输入字符串中减去x(小写),以获得字母的数值。接受sum并将其与进行比较1001对于真实情况返回逻辑,0对于虚假情况返回逻辑。

如果可以将“美元字”设为false,将“非美元字”设为true,则可以节省一个字节。


4

Japt13 12 10字节

L¥U¬x_c %H

说明:

L¥ U¬x _c %H
L¥(U¬x(_c %H))
L¥(          )   // 100==
   U¬            //   Input split into a char array
     x(     )    //   The sum of:
       _         //     At each char:
        c        //       Get the char-code and
          %H     //       Mod 32

在线测试!

12个字节:

L¥U¬mc m%H x

在线尝试!

另一种采用不同技术的12字节解决方案

L¥U¬x@;CaX Ä

在线尝试!


很好!我认为您可以在第一个上保存一个字节,m%H而不是m-96(它现在可以在两种情况下工作,加分!),以及在第二个上保存一个字节L¥U¬x@;CaX Ä
ETHproductions

@ETHproductions谢谢!m%H是一个不错的发现。x@也是个好主意!
奥利弗

@ETHproductions将其缩减为10个字节;)
奥利弗(Oliver

3

Ruby(2.4 +),38个字节

以小写形式输入。需要Ruby 2.4,Array#sum因此它不能在TIO上运行。

->a{a.chars.map{|c|c.ord-96}.sum==100}

2
使用String#bytes代替,String#chars这样您就不必致电c.ord
价值墨水

sum在阵列上使用,而不是map
GB

3

///564个 210 189 185字节

/~/1\/\///4/11~3/41//6/33//2/66//5/22~a/~b/1~c/4~d/3~e/31~f/34~g/6~h/16~i/46~j/36~k/316~l/346~m/2~n/12~o/42~p/32~q/312~r/342~s/62~t/162~u/462~v/362~w/3162~x/3462~y/22~z/122~5555/0///1/0

在线尝试!

如果它是“美元单词”,则输出1;否则,输出“ 0”。

输入内容如下:(一直滚动到右侧)

/~/1\/\///4/11~3/41//6/33//2/66//5/22~a/~b/1~c/4~d/3~e/31~f/34~g/6~h/16~i/46~j/36~k/316~l/346~m/2~n/12~o/42~p/32~q/312~r/342~s/62~t/162~u/462~v/362~w/3162~x/3462~y/22~z/122~5555/0//INPUT WORD HERE/1/0

通过将每个字母替换为其一进制值,然后将一进制100替换为0来工作。然后将单词的值替换为1。如果单词的值为0,则它​​将打印1,因为在末尾代码,它将替换为0。如果单词的值是其他任何值,它将仅打印该0。

高尔夫球通过使用代码中的常见出现来代替。


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.