使用说明
给定一个未知的输入字符串i
与任一值的头或尾,返回1
的头或-1
用于尾巴用最短的代码。
样本未打高尔夫球的代码(55b):
if(i == "heads"){
print(1);
}else{
print(-1);
}
示例高尔夫球代码(16b):
print("t">i||-1)
示例中使用了Javascript,但这不是必需的。抱歉,如果对于大多数用户来说太简单了,可以对其进行改进。
给定一个未知的输入字符串i
与任一值的头或尾,返回1
的头或-1
用于尾巴用最短的代码。
if(i == "heads"){
print(1);
}else{
print(-1);
}
print("t">i||-1)
Answers:
p
?在CJam中是标准吗?
p
不需要。
相当简单,但是让我们玩只是为了好玩...
puts("-1"+*i/8%2);
给定字符串,将在后跟换行符的同时显示char *i
1 heads
和-1 tails
。
在C中,"-1" + 1
向前指向1个字符,因此与相同"1"
。让我们看一下第一个字符:
"heads"[0] = 'h' = 104 = 0b01101000
"tails"[0] = 't' = 116 = 0b01110100
如果我们从最右边的一位开始(从零开始)计数,则位3是1 in heads
和0 in tails
:将其相加"-1"
得出正确的字符串。看起来像这样:
"-1" + ((i[0] >> 3) & 1)
现在,替代i[0]
以*i
与功率的两分频的右移,以节省一些字节。还要删除无用的括号:
"-1" + (*i / 8 & 1)
现在,& 1
可以用代替% 2
。字符数相同,但是模数优先级更高,允许删除括号。删除空格:
"-1"+*i/8%2
我认为在C中获取整数1或-1(不是字符串)的最短方法是:
18-*i/6
说明:
'h' = 104
't' = 116
('h' + 't') / 2 = 110
110 - 'h' = 6
110 - 't' = -6
(110 - 'h') / 6 = 1
(110 - 't') / 6 = -1
Apply distributive property (integer division):
18 - 'h' / 6 = 1
18 - 't' / 6 = -1
<?=1-$i^=F;
这之所以起作用是因为'tails' ^ 'F'
→ '2'
和'heads' ^ 'F'
→ '.'
(当输入为整数时为)0
。
您可以通过以下方式测试此解决方案(或以下任何一种):
<?php foreach(['heads', 'tails'] as $i): ?>
<?=1-$i^=F;
endforeach; ?>
备择方案
15:<?=1-md5($i)%3;
16:<?=md5($i)[5]-5;
16:<?=-crc32($i)%5;
cos(πʳinString(Ans,"t
直截了当。“ t”位于“ tails”的位置1,但“ t”不在字符串“ heads”中,因此inString(对于尾部返回1,对于头返回0。
如果您的计算器处于弧度模式(与任何数学家一样),则仅占用9个字节:
cos(πinString(Ans,"t
请注意,TI计算器没有命名字符串,因此输入在计算器的答案变量中。还要注意,小写字母每个都是两个字节,因此,该解决方案实际上比单词“ heads”占用更少的内存。
t
和inString(
各自是两个字节。
puts(*i>'h'?"-1":"1");
说明:
如果字符串的第一个字符大于'h'
,"-1"
则打印该字符串。否则,"1"
将打印字符串。请注意,此方法附带一个结尾的换行符。
旧版本(25字节):
printf("%d",*i>'h'?-1:1);
说明:
如果字符串的第一个字符大于'h'
,则打印-1。否则,将打印1。
h
和7 t
。
puts(*i>'h'?"-1":"1");
会更好吗?(22个字节)
(如果仅计算参数,则为14 10…)
tr -s ta-s -1
样品运行:
bash-4.3$ tr -s ta-s -1 <<< heads
1
bash-4.3$ tr -s ta-s -1 <<< tails
-1
简要说明:
tr
代表音译,即用在第二个参数中相同位置的字符替换在第一个参数中找到的输入的每个字符:
tr ta -1 <<< tails # replaces t ⇢ -, a → 1
⇒ -1ils
如果第一个参数较长,则第二个参数中没有位置匹配的字符将替换为第二个参数的最后一个字符:
tr tals -1 <<< tails # replaces t ⇢ -, a → 1, l → 1, s → 1
⇒ -1i11
使用-s
(--squeeze-repeats
)选项时,将立即替换将被相同字符替换的连续字符:
tr -s tals -1 <<< tails # replaces t ⇢ -, a → 1, l+s → 1
⇒ -1i1
因此,如果我们用“尾巴”枚举所有字符,我们将得到所需的信息:
tr -s tails -1 <<< tails # replaces t ⇢ -, a+i+l+s → 1
⇒ -1
对于“ heads”也一样,但是我们需要将“ t”放在前面以消耗减号(字符是按字母顺序排列的,以确保蠕变):
tr -s taedhs -1 <<< heads # replaces h+e+a+d+s → 1
⇒ 1
将“ tails”和“ heads”的所有唯一字符合并到一个第一个参数中,将“ t”放在前面可导致最终解决方案:
tr -s tadehils -1 <<< tails # replaces t → -, a+i+l+s → 1
⇒ -1
tr -s tadehils -1 <<< heads # replaces h+e+a+d+s → 1
⇒ 1
为避免枚举字符,可以改用从- 到格式的间隔。
tr
。posixly:tr -s ta-s '-[1*]'
00000000: b402 0826 8200 7a04 b22d cd21 b231 cd21 ...&..z..-.!.1.!
00000010: c3
未组装:
B4 02 MOV AH, 02H ; DOS API display char function
08 26 0082 OR DS:[82H], AH ; set parity flag from input
7A 04 JPE HEADS ; if even, heads - display just '1'
B2 2D MOV DL, '-' ; otherwise first display a '-''
CD 21 INT 21H ; output DL to console
HEADS:
B2 31 MOV DL, '1' ; display the '1'
CD 21 INT 21H ; output DL to console
C3 RET
说明:
使用CPU的奇偶校验标志来确定第一个字符是'h'
(二进制数的偶数1
)还是't'
(二进制数的奇数1
)。这样就比用ASCII比较char节省了一个字节。
从命令行输入,输出到控制台。
输入输出:
expr $i : he - 1
在线尝试!
感谢@StéphaneChazelas在unix.stackexchange.com
尝试了其他解决方案:
echo $[30#$i%7-1] # 17 bytes but only in bash, zsh.
在线试用!
echo $((30#$i%7-1)) # 19 bytes but only bash,ksh,zsh.
在线尝试!
he=2;echo $[${i%a*}-1] # 22 bytes But only in bash,zsh .
在线尝试!
a=${i%h*};echo ${a:+-}1 # 23 .
便携式的。 在线尝试!
he=2;echo $((${i%a*}-1)) # 24 bytes .
便携式的。 在线尝试!
IFS=h;set $i;echo ${1:+-}1 # 26 (change IFS) .
便携式的。 在线尝试!
(IFS=h;set $i;echo ${1:+-}1) # 28 (subshell) .
便携式的。 在线尝试!
(IFS=h;set $i;echo $(($#*2-3))) # 31 bytes .
便携式的。 在线尝试!
注意:dash
用作便携式外壳测试仪的合理比喻。
expr $i : he - 1
通过计算匹配多少个字符he
来工作$i : he
。甲heads
匹配2
和tails
匹配0(无)。然后从其减去1
用- 1
。
$[30#$i%7-1]
通过将字符串转换为整数来工作。选择30的基数和7的mod来获得heads
和之间的差2 tails
。然后减去1将数字转换为1
和-1
。
请注意,a $[...]
是算术表达式的古老形式,$((...))
仅在某些shell中有效。
he=2;echo $[${i%a*}-1]
通过使某个变量具有某个值,然后使用算术扩展来扩展该变量(从文本值开始)来工作。在${i%a*}
转换heads
到he
和tails
到t
(即,作为一个变量,具有为0的值)。
IFS=h;set $i;echo ${1:+-}1
分两步工作。将IFS设置为可以h
将未引用$i
的set $i
部分分成多个字符h
,这些字符由heads
划分为''
和'eads'
,因此设置$1
为null。tail
不受分割h
,从而使得$1
等于tails
。然后,如果的值是非null(如中的)或没有值(如null ),则${1:+-}
生成一个。该符号(或什么都没有)与串联。-
$1
tails
$1
1
(IFS=h;set $i;echo $(($#*2-3)))
的工作方式类似,但使用的$#
是将字符串$i
分成的部分()的数量。
这一定是我写过的最短的QBasic。
c=i>"t
?c^c
说明:
上面是一些打得很重的QBasic。自动格式化程序通过后,将如下所示:
c = i > "t"
PRINT c ^ c
第一行将字符串i
与进行比较"t"
。如果i
是"heads"
,i > "t"
则为,且为c = 0
。如果i
是"tails"
,i > "t"
则为true和c = -1
。是的,-1
在QBasic中,布尔值的默认值为true吗!
第二行映射-1
到-1
,并0
以1
通过数学技巧:(-1)^(-1) == 1/(-1) == -1
和0^0
,虽然在技术上数学不确定,退货1
。
此代码要求将i
其显式声明为字符串变量;否则,必须为i$
。完整的测试程序(在QB64上测试):
DIM i AS STRING
DATA heads, tails
FOR x = 1 TO 2
READ i
c=i>"t
?c^c
NEXT x
'eI(
类似于Dennis的CJam答案,找到e
输入字符串中的索引
保存了一个字节,因为如果堆栈值不足,我不会意识到输入会自动用作参数
'e Push e
I Index of e in the the input. 2 if heads, 0 if tails
( Subtract One
Stack gets automatically outputted
F.~%.7/-_<
将输入的字符的ASCII值除以7。从15减去商。当IP用尽程序空间时,执行将停止。这是可行的,因为Triangular只能管理整数除法。方便地,“ h”的值为104,当整数除以7时为14。“ t”为116,当整数除以7时为16。
取消高尔夫/说明:
F
. ~
% . 7
/ - _ <
---------------------------------------------------------------
F - Push 15 to Top of Stack
~ - Read a character from input, push its value to ToS
7 - Push 7 to ToS
<_ - Change directions, then pop ToS-1 and ToS, push their integer quotient
- - Pop ToS-1 and ToS, push their difference
% - Print ToS as an integer
先前版本(14字节):
~\81|m/,!<.>i%
从输入中读取一个字符;如果该字符的ASCII值除以8有余数,则打印-1,否则打印1。
_d=2*1-.
_ Take input and discard the last item
d= If the top of the stack is d:
2* Re-set the top of the stack as 2
1- Decrement the top of the stack by 1
. Explicitly output the top of the stack
-4字节归功于manatwork
^
。