熄灭7段版本


14

给定一个7段显示,其中某些段处于打开状态而某些段处于关闭状态,请找到一个数字序列(0-9),以便在切换每个数字的相应段之后,所有段均被关闭。

  _
  _    [3] =>     |   [1] =>    [OFF]
  _               |

数字及其对应的段:

 _         _   _         _    _    _    _    _ 
| |    |   _|  _|  |_|  |_   |_     |  |_|  |_|
|_|    |  |_   _|    |   _|  |_|    |  |_|   _|

规则

Codegolf⊨最短进入获胜。

输入值

已打开的段的非空列表,给出为

  1. 一连串数字。段从上到下,从左到右编号;从0或1开始。数字不必按顺序排列。

  2. 一个7位数字。未指定MSB / LSB(因此可以选择)。

允许使用数字之间的非数字字符(但不要求支持)。

例如。对数713610100100100101

输出量

一系列要“应用于”显示器的数字。不作任何限制,例如数字顺序。例如。对应于数初始状态1,有效输出将是1111010,等。

备用输出是10位数字(同样,您可以选择MSB / LSB)。例如。对1作为输入,输出将是10000000000000000001

一些组合具有几种非重复的解决方案,例如。H可以通过013489和来关闭与大写字母相对应的句段0258

如果不存在解决方案(我认为不可能),则输出为空。


2
这需要更多规范。每个数字中包括哪些段(例如,9是否包括底部的段?)请绘制所有数字并指出每个数字中包含的段的编号。
圣河水准

另外,允许输入什么格式?段号会按顺序给出吗?如果没有解决方案,我们该怎么办?
级圣河

“某些组合具有多个非重复解决方案”另外,解决方案的任何排列都是另一个解决方案,对吗?(如301H)。
Arnauld

1
证明解决方案始终存在:足以为每个细分市场找到解决方案。为水平段的解决方案,从顶部到底部,是1708,和1479。从左到右,垂直上段的解为3959。从左到右,垂直下段的解决方案是562389
格雷格·马丁

1
@GregMartin 2并不总是必要的,因为你可以用任何取代它04681358或者1369,这取决于您是否想要一个089在你的答案,但有没有办法消除7的一切,我认为你必须至少有一个的13
尼尔

Answers:


4

果冻26 25字节

2ṗ⁵’µ×“wØ][:koR¶{‘^/=µÐfḢ

在线尝试!

将输入作为7位整数。返回10位整数的二进制形式。

蛮力迫使所有可能性。删除以获得所有可能的输出,或将其替换为X以获得可能的随机输出。

魔术可视化程序!

怎么运行的

2ṗ⁵’µ×“wØ][:koR¶{‘^/=µÐfḢ  - main link, takes one integer
2ṗ⁵’                       - generate all length-10 binary arrays
    µ                µÐf   - now we find those arrays which correspond to digit-
                              sequences which work to switch off all segments:
                              Filter (keep) those arrays which:
     ×                      - multiplied by 
      “wØ][:koR¶{‘          - [119, 18, 93, 91, 58, 107, 111, 82, 127, 123] 
                               (encoding for turned-on segments given number)
                  ^/        - reduced by XOR
                    =      - are equal to (implicit) the program's input
                        Ḣ  - output the first of these valid arrays

1
数字数组(“wØ][:koR¶z‘)可能包含错误。您的号码9缺少最底层的部分(9在可视化中与任务描述中的相比)。否则非常好,尤其是可视化!
kyrill

1
@kyrill固定!只需要对列表文字进行些微更改。
fireflame241

2

JavaScript(ES6),60个字节

n=>[65,35,55,42,48,54,110].reduce((r,v,i)=>r^=n>>i&1&&v+v,0)

之所以有效,是因为:

  • 切换1和7仅切换顶部
  • 切换1、2和6仅切换左上部分
  • 切换1、2、3、5和6仅切换右上方的片段
  • 切换2、4和6仅切换中心线段
  • 切换5和6仅切换左下部分
  • 切换2、3、5和6仅切换右下方的片段
  • 切换2、3、4、6和7仅切换底部

1
不确定是否应该将其视为赢家,因为显然您从Arnauld获得了一些启发。但随后,他也从您的评论中得到了一些启发。无论如何,两个人都很好的答案!
kyrill

@kyrill我更新的答案也是Neil的建议。毫无疑问,他的回答到目前为止是成功的。
Arnauld

2

JavaScript(ES6),117 107 101 86 84字节

感谢尼尔节省了15个字节

将输入作为7位整数,其中LSB是高位段。返回LSB为digit的10位整数0

f=(n,k)=>[83,0,57,73,10,71,87,1,91,75].reduce((n,v,i)=>n^=k>>i&1&&v+36,n)?f(n,-~k):k

演示版


1
递归是更短:f=(n,k=1023)=>[83,0,57,73,10,71,87,1,91,75].reduce((n,v,i)=>n^=k>>i&1&&v+36,n)?k--&&f(n,k):k。或者,如果您认为存在答案,则f=(n,k=0)=>[83,0,57,73,10,71,87,1,91,75].reduce((n,v,i)=>n^=k>>i&1&&v+36,n)?f(n,k+1):k
尼尔

1
@尼尔谢谢!是的,答案永远存在。
Arnauld

1
由于总是可以使用数字来创建答案1-7,因此您可以通过删除83,91,75和来另外节省8个字节k+2
尼尔

2

Mathematica,40个字节

BitXor@@{260,802,10,514,3,266,293}[[#]]&

(通过仔细选择每个段的输出并在LSB和MSB之间切换,可能会更多。)

以输入作为位置列表为例,{2,4,5,7}并以MSB顺序(0,...,9)输出10位数字(384= 0110000000二进制)。

在示例中,它对应于

  |_
  |_

并且输出对应于 {7,8}

说明:

幻数(硬编码列表)是为每个段返回的输出。(以二进制编码)并且,如果一个数字在列表中出现两次,则效果与未出现的效果相同,因此使用按位XOR。我们只需要对打开的段的可能值进行输出异或。


2

果冻,12字节

ị“A#7*06n‘^/

在线尝试!

这不是蛮力的,比我的其他解决方案短得多。将输入作为打开的段的列表,将输出作为LSB的顶部段。

输出为数字移动列表。

怎么运行的

这将很快

ị“A#7*06n‘^/ - main link, takes input as a list of turned-on segments (eg. [1,3,6])
 “A#7*06n‘   - list literal [65,35,55,42,48,54,110] where each element is a 7-bit
                 integer, where each integer corresponds to how to turn off
                 a segment (eg. turn off the first segment with 7 and 1 =>2^7+2^1=>64)
ị            - get the elements in the list corresponding to the input indices
          ^/ - XOR reduce these elements to get a single 7-bit integer

您不能利用以下事实这一事实:使用此算法时允许使用重复解决方案,用较短的内容(例如,展平的内容)代替XOR-reduce?还是我错过了什么?

我现在拥有的代码现在生成一个大约等于的7位整数列表1*use digit 1 + 2*use digit 2 + 4*use digit 3 ... 64*use digit 7,然后XOR减少它们@ ais523。拼合将对使用的数字列表起作用,该列表需要更多字符。
fireflame241
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.