首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >类罗马数字代码生成器

类罗马数字代码生成器
EN

Code Golf用户
提问于 2021-03-08 17:09:01
回答 6查看 2.2K关注 0票数 22

背景

罗马数字是一个简单的数字系统,具有以下属性:

  • 系统中的每个符号映射到特定的值。(例如I = 1, V = 5, X = 10, C = 100)
  • 罗马数字的值可按以下方式计算:
    • 首先,查找所有相邻的符号对,其中一个严格较小的值符号优先(例如IVXC)。每个这样的对被计算为两个值(例如IV = 5 - 1 = 4)的向后差分。
    • 然后,将其余的符号解释为-is,并将其中的所有值之和。MMCMXCIV =M+M+ CM + XC + IV = 1000 + 1000 +(1000-100)+(100-10)+(5-1)= 2994

任务

您的工作是编写一个函数/程序F,它接受一个正整数n并生成一个代码片段F(n) (不一定用同一种语言)。输出的代码片段必须具有以下属性:

  • F(n)作为一个完整的程序必须输出数字n
  • F(a)+\!\!\!+\,F(b)作为一个程序( +\!\!+的意思是级联)必须输出a+b,如果a≥bb−a则不然。
  • 这必须扩展到程序以b−a大小写优先的方式发出的任意数量的代码片段(请考虑一个带有+s和-s的算术表达式,但是-D39的两边被翻转,其优先级高于+)。
    • 您不需要考虑三个连续输入数字严格增加的情况(等效的算术表达式有两个连续的-s)。

你的分数是F的字节计数。以字节为单位的最短代码获胜。

示例

如果F(10)输出代码片段ABC,而F(3)输出代码片段xyz

  • 程序ABC应该输出10。
  • 程序xyz应该输出3。
  • 程序ABCxyz应该输出13。
  • 程序xyzABC应该输出7。
  • 程序ABCABCABC应该输出30。
  • 程序ABCABCxyzxyzABCxyzxyzABC应该输出40,因为=> 10 + 10 +3+ (10-3) +3+ (10-3) = 40

此外,如果F(8)输出代码片段****

  • 程序ABC****xyz应该输出10 + 8 + 3 = 21
  • 程序****ABCxyz应该输出(10-8) + 3 = 5
  • 程序xyz********ABC应该输出(8-3) + (10-8) = 7
  • 您不需要考虑程序xyz****ABC,它包含三个连续严格递增的数字(3、8、10)。
EN

回答 6

Code Golf用户

发布于 2021-03-09 11:17:27

JavaScript (V8),66字节

代码语言:javascript
运行
复制
n=>`t=this;s=~~t.s-(t.p<${n}&&2*p)+(p=${n}),{get x(){print(s)}}.x`

在网上试试!

核心思想是将print()放在getter函数后面。如果访问.x属性,它将打印总s。这被放置在生成的代码的末尾,以便在最后一次迭代中访问.x,当连接时,它变成.xt=this (不访问.x)。

票数 4
EN

Code Golf用户

发布于 2021-03-09 18:29:43

Java,696字节

代码语言:javascript
运行
复制
n->"import java.util.*;import java.io.*;import java.util.jar.*;interface Main{Listl=new ArrayList();static void main(String[]a)throws Exception{var z=Main.class.getPackageName();for(var e:System.getProperty(\"java.class.path\").split(System.getProperty(\"path.separator\"))){if(!e.endsWith(\".jar\")){var b=new File(e+File.separatorChar+z);var d=b.listFiles();Arrays.sort(d);for(var f:d){var n=f.getName();if(n.endsWith(\".class\")){Class.forName(n.substring(0,n.length()-6));}}}}int s=0;for(int i=0;i0&&l.get(i)>l.get(i-1)?l.get(i-1)*2:0);System.out.print(s);}}\nclass _"+new java.util.Date().getTime()+"_"+System.nanoTime()+"{static{Main.l.add("+n+");}}//"

Main接口有一个静态List字段,所有生成的类都在它们的静态初始化器中添加一个整数。main方法尝试加载包中的所有类以运行它们的静态初始化器。F(a)每次都会返回不同的值,因为它试图使用当前时间使类名唯一,因此不能通过使用变量来存储F(a)的结果来缩短F(a) + F(a)

生成器

生成程序

票数 3
EN

Code Golf用户

发布于 2021-03-10 19:03:03

Python 3.7.3 (输出Python3.7.3),174个字节

代码语言:javascript
运行
复制
import sys;print("""R=%s
class A():
 def __del__(s):print(a)
if"a"in locals():
 if"p"in locals()and p

代码的更易读版本:

代码语言:javascript
运行
复制
import sys
print("""
number = %s
class PrintOnExit():
   def __del__(self):
      # This object will only be destroyed when the interpreter exits
      print(result)

if "result" in locals():
   if "previous" in locals() and previous < number:
       result -= previous
       result += number - previous
   else:
       result += number

if "print_on_destroy" not in locals():
    print_on_destroy = PrintOnExit()
    result = number

previous = number
""" % sys.argv[1])
```#qcStackCode#
代码语言:javascript
运行
复制
票数 3
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/220403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档