解码7段显示器


17

大家可能都知道7段显示器,除了其他以外,它还可以显示所有数字:09

7段显示(wikipedia.org)

挑战

我们仅考虑段,您的任务是给定已打开段的位来解码单个数字。一种G

可以将其编码为8位整数,这是每个数字的表格,其中包含二进制表示形式以及相应的little-endian和big-endian值:

数字.ABCDEFG小端大端0011111101260x7E1260x7E1个00110000480x30120x0C2011011011090x6D1820xB63011110011210x791580x9E400110011510x332040xCC501011011910x5B2180xDA601011111950x5F2500xFA7011100001120x70140x0E8011111111270x7F2540xFE9011110111230x7B2220xDE

规则和I / O

  • 输入将是以下之一
    • 单个整数(如上表中两个给定顺序之一)
    • 位列表/数组/ ..
    • 一个由字符组成的字符串ABCDEFG(您可能假设它已排序,例如ABC编码),它们的大小写由您选择(不区分大小写)7
  • 输出将是其编码的数字
  • 您可以假设没有无效的输入(无效意味着没有相应的数字)

测验

由于此挑战允许多种表示形式,请参阅下表。



我们可以接受任何指定的位顺序或仅显示的两个整数(或数组)吗?
乔纳森·艾伦

@JonathanAllan:我会澄清,只有已经显示的那些。
ბიმო

哦,废话,您不必处理所有输入类型吗?只有一个?糟糕...
魔术章鱼缸

@MagicOctopusUrn:确实是这样:)
ბიმო

Answers:




7

Wolfram语言(Mathematica),41个字节

9[,6,0,8,2,3,1,7,5,4][[#~Mod~41~Mod~11]]&

在线尝试!

使用整数的little-endian列作为输入。忽略语法警告。

对于输入X,我们首先采用X mod 41,然后采用结果mod11。结果是不同的mod 11,因此我们可以从表中提取它们。例如,126 mod 41 mod 11为3,因此,如果使位置3等于0,则对于126的输入将获得正确的答案。

桌子是9[,6,0,8,2,3,1,7,5,4]。第0部分是头部,即9。缺少第1部分,所以它是Null保存一个字节:我们永远不需要参加第1部分。然后,第2部分是6,第3部分是0,依此类推。


乔纳森·艾伦的回答给了我们 1[4,9,8,6,2,0,5,3,7][[384~Mod~#~Mod~13]]&。这并没有缩短,但确实避免了语法警告!


Wolfram语言(Mathematica)27 25字节

Mod[Hash[")dD}"#]+2,11]&

(抱歉,这里有些字符没有显示出来。单击下面的链接,您会看到它。)

在线尝试!

这就是将某个字符串强行Hash插入其中,以使散列最终具有正确的mod 11值。更多的强行强制可能会使我们得到更短的解决方案。


您能为不认识Mathematica的人解释一下此答案吗?
jrook

我以为任何人都可以阅读,但是好的,我将在解释中进行编辑。
米沙·拉夫罗夫

恭喜; 41字节的解决方案破坏了我的Mathematica压缩器。
lirtosiast





3

空白,152字节

强制性的“ S,T和L并不真正存在,它们只是命令的可见表示形式”。

S S S T	S S L
S S S T	S T	L
S S S T	T	T	L
S S S T	L
S S S T	T	L
S S S T	S L
S S S T	S S S L
S S S L
S S S T	T	S L
S S S L
S S S T	S S T	L
S S S L
S L
S T	L
T	T	T	T	T	S S S T	S T	S S T	L
T	S T	T	S S S T	S T	T	L
T	S T	T	L
S S L
S L
S L
T	S S L
S T	L
S T	L
S S S T	L
T	S S T	L
S L
L
L
S S S L
S L
L
T	L
S T	

在线尝试!

结束错误。

等效的类似于汇编的语法:

	push 4
	push 5
	push 7
	push 1
	push 3
	push 2
	push 8
	push 0
	push 6
	push 0
	push 9
	push 0
	dup
	readi
	retrieve
	push 41
	mod
	push 11
	mod
slideLoop:
	dup
	jz .slideLoop
	slide 1
	push 1
	sub
	jmp slideLoop
.slideLoop:
	drop
	printi

您可以删除三个尾随的换行符以节省3个字节。它在STDERR中给出了一个错误,但是该程序仍然可以运行,并且被meta-rules允许
凯文·克鲁伊森

3

brainfuck474个 176 154 151 149 137字节

采用的输入串8 01包括第一个0小数点。

(例如帖子中表格的第二列)

输出0到9之间的数字。

,>,>,>,,,>,>,>+[[->]<++<<<<<<]>[>[>[>[->[>++++++<-<]>[--<]<]>>.>>]<[>
>[>->++<<-]>-[+>++++<]>+.>]]>[>>>+<<<-]>[>>+++.>]]>[>>>[>+++<-]>-.>]

在线尝试!

算法

通过观察特定段的状态,我们可以将一组可能的数字拆分为较小的子集。下面是我的代码中使用的静态二进制搜索树。左子树对应于段ON状态,右子对应于段OFF状态。

                                         0,1,2,3,4,5,6,7,8,9
                                                  |    
                                         /-------[A]-------------------------\
                                 0,2,3,5,6,7,8,9                             1,4
                                        |                                     |
                         /-------------[B]----------------\             /----[G]----\
                   0,2,3,7,8,9                            5,6          4             1   
                        |                                  |
              /--------[E]--------\                  /----[E]----\    
            0,2,8                3,7,9              6             5
              |                    |
        /----[F]----\        /----[F]----\
      0,8            2      9            3,7   
       |                                  |
 /----[G]----\                      /----[G]----\
8             0                    3             7

一些对打高尔夫球有用的观察

  1. C和D位是冗余的,可以忽略。
  2. 前导零(小数点位)可以用作(值48),这对于解析输入和准备输出都很重要。
  3. 当到达叶子并打印数字时,我们只需要跳过所有其他条件。可以通过将数据指针移到足够零的区域以至于它不能返回来完成此操作。
  4. 为了兼容性,最好在右边使用零,因为某些BF实现不支持负数据指针。
  5. 因此,最好将输出值存储在最右边的单元格中,这样我们就可以轻松到达右边的零区域。
  6. 因此最好从左到右检查位:A,B,E,F,G,这样我们可以更轻松地到达输出单元。
  7. 不同的数字可能共享输出代码。例如,5和6在同一子树中。我们可以+++++对两个值都做,然后+仅对六个值做。
  8. +如果预先在输出值上加2,则可以减少命令数。在这种情况下,我们需要减少它01仅获得优势,为其他数字。

2

视网膜,96字节

^(A)?(B)?C?(D|())(E|())(F)?(G)?
$.($.5*$.8*$(6*$7$2$2)$#6*$.3*$($.2*$(___$7)5*$7)$#4*$(6*$1_3*$8

在线尝试!可能不是最好的方法,但这是Retina中有趣的编程方法。说明:

^(A)?(B)?C?(D|())(E|())(F)?(G)?

尝试捕获有趣的案例。积极的捕获只是捕获存在的字母。因此,捕获的长度(如果存在)为1,如果不存在则为0。特殊情况是捕获4和6,仅当D或E分别不存在时才存在。这些只能用和十进制表示$#4$#6但这就是我们在这里所需要的。然后将捕获内容构建为一个字符串,该字符串的长度是所需的数字。例如,如果我们编写,6*$1则此字符串的长度为6(如果存在A),长度为0(如果不存在)。为了在不同的表达式之间进行选择,我们使用$.(用于正向捕获)或$#(用于负向捕获),其结果为0或1,然后可以乘以到目前为止的字符串。

$.5*$.8*$(6*$7$2$2)

F被重复6次和B两次(通过串联,因为它是高尔夫球手)。但是,除非同时存在EG,否则结果将被忽略。处理26和的情况8

$#6*$.3*$($.2*$(___$7)5*$7)

F重复5次,如果B存在,则将其相加第六次加上额外的3次(由长度为3的恒定字符串表示)。但是,除非结果存在且不D存在,否则结果将被忽略E。处理35和的情况9

$#4*$(6*$1_3*$8

A重复6次,G重复3次,1再加上一个额外的字符(因为这是高尔夫球手,所以在两者之间用恒定的字符表示)。但是,除非D没有结果,否则结果将被忽略。处理14和的情况7

$.(

然后将上述字符串连接起来并获取长度。如果以上都不适用,则不会生成任何字符串,因此其长度为0

结果字符串(在获取长度之前)如下:

1   _
2   BB
3   ___
4   _GGG
5   FFFFF
6   FFFFFF
7   AAAAAA_
8   FFFFFFBB
9   ___FFFFFF

2

MATL,14个字节

'/lx2Z^o~z'Q&m

输入是一个数字,以little-endian格式表示分段。

在线尝试!

说明

'/lx2Z^o~z'  % Push this string
Q            % Add 1 to the codepoint of each char. This gives the array
             % [48 109 ... 123], corresponding to numbers 1 2 ... 9. Note that
             % 0 is missing
&m           % Implicit input. Call ismember function with second output. This
             % gives the 1-based index in the array for the input, or 0 if the
             % input is not present in the array.
             % Implicit display



1

Japt,15个字节

以big-endian值作为输入。

"~¶ÌÚúþÞ"bUd

尝试一下


说明

该字符串包含big-endian值的每个代码点处的字符;Ud在输入的代码点获取字符,并b在字符串中找到该字符的索引。


1

Neim,15字节

&bᚫJ𝕂𝕨O𝐖𝐞ℤ£ᛖ𝕪)𝕀

说明:

&bᚫJ𝕂𝕨O𝐖𝐞ℤ£ᛖ𝕪)      create list [126 48 109 121 51 91 95 112 127 123]
                 𝕀     index of

在线尝试!



1

TI-BASIC(TI-83 + / 84 +系列),15字节

int(10fPart(194909642ln(Ans

使用小端输入。哈希在TI-BASIC中相当普遍,因此我针对此类情况编写了哈希函数brute-forcer

我们在这里有点幸运,因为乘数是9位数字而不是预期的10位数字。

      fPart(194909642ln(Ans   hash function mapping onto [0,1)
int(10                        take first digit after decimal point

1

05AB1E17 16 15 12 字节

•NŽyf¯•I41%è

-1个字节感谢@ErikTheOutgolfer
通过创建@MishaLavrov的Mathematica答案的端口来生成-1字节。
-3个字节,感谢@Grimy

在线尝试验证所有测试用例

说明:

NŽyf¯•       # Push compressed integer 99608231754
       I41%   # Push the input modulo-41
           è  # Index this into the integer (with automatic wraparound)
              # (and output the result implicitly)

看到这个05AB1E尖矿(部分如何压缩大整数?理解为什么•NŽyf¯•99608231754



@EriktheOutgolfer当然,是啊。巧合的是128в。忘了有128一半的内置功能256。谢谢!
凯文·克鲁伊森

我尝试了一些不能超过15的怪异东西。最疯狂的尝试:¦C•26¤æÈÛµÀš•2ô₂+sk(19)。
魔术章鱼缸

1
@肮脏的谢谢!现在,我看到它很明显,由于压缩整数尺寸11和回绕踢英寸
凯文Cruijssen

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.