Auto BATCH高尔夫球手


25

我喜欢BATCH,尽管它由于缺乏非整数支持而令人震惊地缺乏功能性命令。为什么?因为这有效:

SET var=SET
%var% i=0

这将评估为:

SET var=SET
SET i=0

太棒了,不是吗?我以前在BATCH程序中使用过此技术,因为它可以节省字节!

您应该接受的挑战是,以这种方式“高尔夫” BATCH程序。您将通过包含SET会评估程序部分内容的语句来减少输入BATCH程序的字节大小,并且不得以其他任何方式修改程序。(例如,这不允许将变量名称重命名为更短的名称。请记住,BATCH(从变量开始)是不区分大小写的。)您的得分计算如下:

score = # of characters in your program + 5*(net result bytes in test cases below)

我保留添加更多测试用例的权利,以阻止为测试用例优化程序的工作。

对于这一挑战的缘故,你的SET语句不能包含控制字符(|<>%)或换行。除了在set语句内移动代码段外,您不能修改代码。(也就是说,您可能不会删除不必要的空格,将其替换EQU==,等等。)我们假设行以结束\n

测试用例

每个测试用例都在单独的代码块中,并且每个测试用例都是独立的,这意味着您仅应假设其中给出了内容。(即,如果您SET d=SET在一个程序中,该语句将不会自动提供给任何其他程序)。每个示例结果都可以在每个测试用例之后找到。测试用例之间有界线。

@回声关闭
SET增量= 10
:环
IF%increment%EQU 0 GOTO结束
回声%increment%
SET / A%increment%-= 1
GOTO循环
:结束
出口

@回声关闭
SET / p INPUT =在此处输入输入:
SET R =%1
回声此处输入的最后一个字符:%R:〜-1%

@回声关闭
SET增量= 10
:e
转到
回声f
:F
转到g
回声
:G
转到h
回声
:H
转到我
回声
:一世
转到j
回声
:j
如果3 == 4(ECHO 4)否则(ECHO 5)
如果5 == 3(GOTO l)否则(GOTO k)
:k
回声完成。
回声出局!
出口
:l
转到g

回声你好,你好,你好,你好,你好,你好,你好,你好!,你好,你好!

输出示例:

@回声关闭
SET增量= 10
:环
IF%increment%EQU 0 GOTO结束
回声%increment%
SET / A%increment%-= 1
GOTO循环
:结束
出口
(保存了0个字节)

@回声关闭
SET%i%=在此处输入:
SET / p INPUT =输入%i%
SET R =%1
ECHO%i %% R:〜-1%的最后一个字符
(获得3个字节)

@回声关闭
SET增量= 10
设置g = GOTO 
设置e = Echo 
:e
%g%f
%e%f
:F
%g%g
%例如
:G
%g%h
%e%h
:H
%g%i
%e%i
:一世
%g%j
%e%j
:j
如果3 == 4(%e%4)ELSE(%e%5)
如果5 == 3(%g%l)ELSE(%g%k)
:k
%e%完成。
%e%抢购!!
出口
:l
%g%g
(节省了10个字符)

SET%h%= ello,
回声H%h%H%h%H%h%h%h%h%h%H%h%Hello !, h%h%ello !, Lello。
(已保存1个字符)


2
缩短批次以获得乐趣和利润!
Alex Carlsen

您需要更多规格。当然AAA %increment%set a=increment¶AAA %%a%%是无效的,而AAA %1 BBB %2set a= BBB ¶AAA %1%a%%2是有效的。(iirc)因此,您需要对其进行形式化。(代表换行符)
user202729

我们是否需要处理已启用延迟扩展,百分号转义或/ if语句的多行代码?根据最后一个测试用例(由于打开回声会产生额外的输出,而在@之前没有SET),高尔夫程序是否接受了无关的输出?
很有可能

1
Tcl又来了
Ven

1
尽管由于
阿达姆

Answers:


4

爪哇8,爪哇103884 795分之799程序+ 484输出= 4368 1279分之1283总

此代码有两个限制:

  • 假定从A到Z的变量是自由的。(大写)
  • 假定替换不超过27个。
  • 哦,而且由于Scanner不能完全削减它,所以空输入会转出stacktrace。

但是,嘿-有个专家!

  • 输出最佳代码。总是。

该代码设法比挑战作者提供的示例更好地执行。

这个高尔夫球版本是凯文制造的。

Java 8

c->{List<String>S=new Stack();HashMap<String,Integer>h=new HashMap(),s=new HashMap();int v=65,l=c.length(),b,e;do{for(b=0,l=c.length(),s.clear();b!=l;b++)for(e=b;++e<=l;)S.add(c.substring(b,e));S.removeIf(t->t.length()<5|t.matches(".*[\n|<%>].*"));S.forEach(t->h.merge(t,1,Integer::sum));S.clear();h.entrySet().removeIf(t->t.getValue()==1);String Y=c;int L=l;char V=(char)v;h.forEach((k,x)->{String i=Y,t;for(int j,I,q;i.contains(k);i=t+"%"+V+"%"+i.substring(j+k.length(),i.length())){for(I=-1,t=i.substring(q=0,j=i.indexOf(k));(I=t.indexOf("%",++I))>=0;q++);if(q%2>0)return;}i="SET "+V+"="+k+"\n"+i;if(i.length()<L)s.put(i,L-i.length());});h.clear();v++;c=s.isEmpty()?c:s.entrySet().stream().max((x,y)->x.getValue()>y.getValue()?1:-1).get().getKey();}while(l>c.length());return c;}

在线尝试!

Java 10

c->{var S=new Stack<String>();HashMap<String,Integer>h=new HashMap(),s=new HashMap();int v=65,l=c.length(),b,e;do{for(b=0,l=c.length(),s.clear();b!=l;b++)for(e=b;++e<=l;)S.add(c.substring(b,e));S.removeIf(t->t.length()<5|t.matches(".*[\n|<%>].*"));S.forEach(t->h.merge(t,1,(x,y)->x+y));S.clear();h.entrySet().removeIf(t->t.getValue()==1);var Y=c;int L=l;var V=(char)v;h.forEach((k,x)->{String i=Y,t;for(int j,I,q;i.contains(k);i=t+"%"+V+"%"+i.substring(j+k.length(),i.length())){for(I=-1,t=i.substring(q=0,j=i.indexOf(k));(I=t.indexOf("%",++I))>=0;q++);if(q%2>0)return;}i="SET "+V+"="+k+"\n"+i;if(i.length()<L)s.put(i,L-i.length());});h.clear();v++;c=s.isEmpty()?c:s.entrySet().stream().max((x,y)->x.getValue()>y.getValue()?1:-1).get().getKey();}while(l>c.length());return c;}

在线尝试!

原始版本

它根本不打高尔夫球,我只是想找点乐子,而不是受苦。亲爱的读者,如果您想得到这个答案,请这样做。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Predicate;

public class Main {
	List<String> substrings = new ArrayList<String>();
	HashMap<String, Integer> hm = new HashMap<String, Integer>();
	HashMap<String, Integer> scores = new HashMap<String, Integer>();
	
	private int v1 = 65;
	
	public static String rfos(String inputString, String stringToReplace,
	        String stringToReplaceWith) {

	    int length = stringToReplace.length();
	    int inputLength = inputString.length();

	    int startingIndexofTheStringToReplace = inputString.indexOf(stringToReplace);

	    if(count(inputString.substring(0, startingIndexofTheStringToReplace), "%") % 2 == 1)
	    	return null;
	    
	    String finalString = inputString.substring(0, startingIndexofTheStringToReplace) + stringToReplaceWith
	            + inputString.substring(startingIndexofTheStringToReplace + length, inputLength);

	    return finalString;

	}
	
	public static int count(String text, String find) {
        int index = 0, count = 0, length = find.length();
        while( (index = text.indexOf(find, index)) != -1 ) {                
                index += length; count++;
        }
        return count;
	}
	
	private String process(String program) {
		int begin = 0, end, il = program.length();
		
		scores.clear();
		
		while(begin != program.length()) {
			for(end = begin + 1; end < program.length() + 1; end++)
				substrings.add(program.substring(begin, end));
			begin++;
		}
		
		substrings.removeIf(new Predicate<String>() {
			@Override
			public boolean test(String arg0) {
				return arg0.length() <= 4 || arg0.contains("\n")
						|| arg0.contains("|")
						|| arg0.contains("<")
						|| arg0.contains("%")
						|| arg0.contains(">");
			}
		});
		
		substrings.forEach(new Consumer<String>() {

			@Override
			public void accept(String t) {
				if(hm.containsKey(t)) {
					hm.replace(t, hm.get(t) + 1);
				} else {
					hm.put(t, 1);
				}
			}
			
		});
		
		substrings.clear();
		
		hm.entrySet().removeIf(new Predicate<Map.Entry<String, Integer>>() {

			@Override
			public boolean test(Map.Entry<String, Integer> t) {
				return t.getValue() == 1;
			}
			
		});
		
		hm.forEach(new BiConsumer<String, Integer>() {
			
			@Override
			public void accept(String arg0, Integer arg1) {
				String iteration = program;
				boolean between = false;
				while(iteration.contains(arg0)) {
					iteration = rfos(iteration, arg0, "%" + Character.toString((char) v1) + "%");
					if(iteration == null)
						return;
				}
				iteration = "SET " + Character.toString((char) v1) + "=" + arg0 + "\n" + iteration;
				if(iteration.length() < program.length())
					scores.put(iteration, program.length() - iteration.length());
			}
			
		});
		
		hm.clear();
		v1++;
		
		if(scores.isEmpty())
			return program;
		else
			return scores.entrySet().stream().max((entry1, entry2) -> entry1.getValue() > entry2.getValue() ? 1 : -1).get().getKey();
	}

	public static void main(String[] args) {
		Main processor = new Main();
		int genid = 0, before = 0, after = 0;
		String currentCode = new Scanner(System.in).useDelimiter("\\Z").next();
		
		System.out.println("Calculating first generation...");
		
		do {
			String cc = processor.process(currentCode);
			before = currentCode.length();
			after = cc.length();
			
			currentCode = cc;
			
			if(before > after) {
				System.out.println("Generation " + genid++);
				System.out.println(before + " -> " + after);
				System.out.println("***\n" + cc + "\n***");
			} else {
				System.out.println("Generation FAIL " + genid++);
				System.out.println(before + " -> " + after);
				System.out.println("***\n" + cc + "\n***");
			}
		} while(before > after);
		
		
	}

}

输出示例:

SET B=GOTO 
SET A=ECHO 
@%A%OFF
SET increment=10
:e
%B%f
%A%f
:f
%B%g
%A%g
:g
%B%h
%A%h
:h
%B%i
%A%i
:i
%B%j
%A%j
:j
IF 3==4 ( %A%4 ) ELSE ( %A%5 )
IF 5==3 ( %B%l ) ELSE ( %B%k )
:k
%A%Done.
%A%BATCH OUT!!
EXIT
:l
%B%g

在线尝试!


我认为所有这些都是“ java.util”。是重复的。您可能希望将代码简化为import java.util.*
一个

我以为jdk的进口不算?
Mark Jeronimus

@A_您可以根据需要修改我的答案(除非它有效并保持精神)
Krzysztof Szewczyk

1
如果是你,亲爱的读者,想高尔夫这样的回答,请做到这一点。799个字节中的Java 8795个字节中的Java 10+。别客气。:)当然可以打更多的球,但是现在就可以了。
凯文·克鲁伊森

2
@KevinCruijssen感谢您的贡献。我已将您的版本添加到帖子中。随时编辑它,而不会问我是否找到更好的东西。
Krzysztof Szewczyk
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.