অটো ব্যাচ গল্ফার


25

আন্তঃসংখ্যক সমর্থন না থাকা সত্ত্বেও, কার্যকরী কমান্ডগুলির বিস্ময়কর অভাব সত্ত্বেও আমি ব্যাচকে ভালবাসি। কেন? কারণ এটি কাজ করে:

SET var=SET
%var% i=0

এটি মূল্যায়ন করবে:

SET var=SET
SET i=0

কল্পনাপ্রসূত, তাই না? আমি আগে এই ব্যাচটি কোনও ব্যাচ প্রোগ্রামে ব্যবহার করেছি , কারণ এটি বাইট সংরক্ষণ করে!

আপনার চ্যালেঞ্জ, আপনি যদি এটি গ্রহণ করেন তবে এইভাবে "গল্ফ" ব্যাচ প্রোগ্রামগুলি হ'ল। আপনি প্রোগ্রামের অংশগুলিতে SETমূল্যায়ন করতে পারে এমন বিবৃতিগুলি অন্তর্ভুক্ত করে কোনও ইনপুট ব্যাচ প্রোগ্রামের বাইট আকার হ্রাস করতে হবে এবং অন্য কোনও উপায়ে প্রোগ্রামটি পরিবর্তন করতে পারবেন না। (এটি অস্বীকার করে, বলুন, একটি পরিবর্তনশীল নামের নামকে সংক্ষিপ্ত কিছুতে নামকরণ করা mind মনে রাখবেন যে ব্যাচ, ভেরিয়েবলগুলি বাদ দিলে সংবেদনশীল নয়)) আপনার স্কোরটি এইভাবে গণনা করা হয়:

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

আমি আরও পরীক্ষার কেস যুক্ত করার অধিকার সংরক্ষণ করি, যাতে পরীক্ষার ক্ষেত্রে প্রোগ্রামটির অনুকূলকরণে কাজ করা নিরুৎসাহিত করা যায়।

এই প্রতিদ্বন্দ্বিতা অনুরোধে জন্য, আপনার SETবক্তব্য নিয়ন্ত্রণ অক্ষর (থাকতে পারে না |, <, >, %) অথবা linebreaks। আপনি কোনও সেট স্টেটমেন্টের অভ্যন্তরে কোডের টুকরো সরানো ছাড়া অন্য কোডটি সংশোধন করতে পারবেন না। (অর্থাৎ, আপনি অপ্রয়োজনীয় হোয়াইটস্পেস সরাতে নাও পারি প্রতিস্থাপন EQUসঙ্গে== ইত্যাদির) আমরা যে লাইন দিয়ে শেষ অনুমান করা হবে \n

পরীক্ষার মামলা

প্রতিটি পরীক্ষার কেস পৃথক কোড ব্লকে থাকে এবং প্রতিটি পরীক্ষার কেস স্ব-অন্তর্ভুক্ত থাকে, যার অর্থ আপনার কেবল গল্ফকে ধরে নেওয়া উচিত এটির মধ্যে যা দেওয়া আছে। (অর্থাৎ আপনি যদি কোনও SET d=SETপ্রোগ্রামে থাকেন তবে সেই বিবৃতিটি অন্য কোনও প্রোগ্রামে স্বয়ংক্রিয়ভাবে দেওয়া হবে না)। প্রতিটি উদাহরণের ফলাফল প্রতিটি পরীক্ষার ক্ষেত্রে পরে পাওয়া যাবে। পরীক্ষার মামলার মধ্যে একটি লাইন রয়েছে।

@ECHO বন্ধ
SET বৃদ্ধি = 10
:লুপ
যদি% বর্ধিত% EQU 0 গোটো শেষ হয়
ইকো% ইনক্রিমেন্ট%
SET / A% ইনক্রিমেন্ট% - = 1
লুপ লুপ
:শেষ
প্রস্থান করুন

@ECHO বন্ধ
SET / p INPUT = এখানে ইনপুট প্রবেশ করুন:
সেট আর =% 1
ECHO ইনপুটটির শেষ চর এখানে:% আর: 1 -1%

@ECHO বন্ধ
SET বৃদ্ধি = 10
: ই
যান চ
ECHO f
: F
যান জি
ইসিও জি
: গ্রাম
যান এইচ
ECHO h
: H
যাও i
ECHO i
: আমি
যান জ
ইসিও জে
: ঞ
যদি 3 == 4 (ECHO 4) ELSE (ECHO 5)
যদি 5 == 3 (যান l) ELSE (গোটো কে)
: K
ECHO সম্পন্ন।
ECHO ব্যাচ আউট !!
প্রস্থান করুন
: L
যান জি

ECHO হ্যালো, হ্যালো, হ্যালো, হ্যালো, হ্যালো, হ্যালো, হ্যালো, হ্যালো, ইলো!, লেলো

উদাহরণ ফলাফল:

@ECHO বন্ধ
SET বৃদ্ধি = 10
:লুপ
যদি% বর্ধিত% EQU 0 গোটো শেষ হয়
ইকো% ইনক্রিমেন্ট%
SET / A% ইনক্রিমেন্ট% - = 1
লুপ লুপ
:শেষ
প্রস্থান করুন
(0 বাইট সংরক্ষিত)

@ECHO বন্ধ
SET% i% = ইনপুট এখানে:
SET / p INPUT =% i% লিখুন
সেট আর =% 1
% I %% আর এর ECHO সর্বশেষ চর: ~ -1%
(3 বাইট অর্জন)

@ECHO বন্ধ
SET বৃদ্ধি = 10
SET g = GOTO 
SET e = ECHO 
: ই
% ছ% চ
% ই% চ
: F
% ছ% ছ
% ই% ছ
: গ্রাম
% ছ% জ
% ই% জ
: H
% ছ% i টি
%ই আই
: আমি
% ছ% ঞ
% ই% ঞ
: ঞ
যদি 3 == 4 (% ই% 4) ই এল এস ই (% ই% 5)
যদি 5 == 3 (% g% l) ELSE (% g% কে)
: K
% ই% সম্পন্ন।
% ই% ব্যাচ আউট !!
প্রস্থান করুন
: L
% ছ% ছ
(10 টি অক্ষর সংরক্ষিত)

সেট% হ% = ইলো,
ECHO H% h% H% h% H% h% h% h% h% h% H% h% হ্যালো !, h% h% ইলো !, লেলো!
(1 টি চরিত্র সংরক্ষিত)


2
মজা এবং লাভের জন্য ব্যাচকে ছোট করা!
অ্যালেক্স কার্লসেন

আপনার আরও কিছু স্পেসিফিকেশন দরকার। অবশ্যই AAA %increment%set a=increment¶AAA %%a%%অবৈধ, এবং AAA %1 BBB %2set a= BBB ¶AAA %1%a%%2বৈধ। (iirc) সুতরাং আপনি এটি আনুষ্ঠানিক করা প্রয়োজন। ( একটি নতুন লাইন প্রতিনিধিত্ব করে)
ব্যবহারকারী 202729

আমাদের কি এমন হ্যান্ডেলের দরকার যা প্রসারণকে বিলম্বিত করে, শতাংশ-সাইন পলায়ন করে, বা বিবৃতিগুলির জন্য মাল্টি-লাইন দিয়েছে? সর্বশেষ পরীক্ষার কেস অনুসারে (যা প্রতিধ্বনি চালু @হওয়ার সাথে সাথে অতিরিক্ত আউটপুট উত্পাদন করে এবং এর আগে কোনও নেই SET) গল্ফযুক্ত প্রোগ্রাম থেকে বহিরাগত আউটপুট গ্রহণযোগ্য?
aturous

1
আবার পুরোহিত টিসিএল
ভেন

1
সত্ত্বেও কি কারণে ?
অ্যাডাম

উত্তর:


4

জাভা 8, জাভা 10 , 3884 799/795 প্রোগ্রাম + 484 আউটপুট = 4368 1283/1279 মোট

এই কোডের দুটি সীমাবদ্ধতা রয়েছে:

  • এটি ধরে নেওয়া হয় যে এ থেকে জেড পর্যন্ত ভেরিয়েবলগুলি বিনামূল্যে। (বড় হাতের)
  • এটি ধরে নেওয়া হয় যে 27 টিরও বেশি বিকল্প নেই।
  • ওহ, এবং যেহেতু স্ক্যানার এটি একেবারে কাটেনি, খালি ইনপুট স্ট্যাকট্রেস ফেলে দেয়।

তবে আরে - একজন প্রো আছে!

  • আউটপুট সেরা কোড। সর্বদা.

কোড চ্যালেঞ্জ লেখকের দ্বারা সরবরাহিত উদাহরণগুলির চেয়ে আরও ভাল পারফরম্যান্স পরিচালনা করে।

এই গল্ফ সংস্করণ কেভিন তৈরি করেছেন ।

জাভা 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;}

এটি অনলাইন চেষ্টা করুন!

জাভা 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.*

আমি ভেবেছিলাম জেডিকে আমদানি গণনা হয় না?
মার্ক জেরোনিমাস

@ এ_ আপনি আমার উত্তরটিকে নিজের ইচ্ছামত পরিবর্তন করতে পারেন (যদি তা বৈধ না হয় এবং চেতনা না রাখে)
ক্রিজিসটফ সিজেউজাইক

1
" আপনি, প্রিয় পাঠক, গল্ফ এই উত্তর চান, তবে এটা দয়া করে। " 799 বাইট জাভা 8 বা 795 বাইট জাভা 10+ মধ্যে । আপনাকে স্বাগতম. :) অবশ্যই আরও কিছু গল্ফ করা যেতে পারে, তবে এটি আপাতত করবে।
কেভিন ক্রুইজসেন

2
@ কেভিন ক্রুজসেন অবদানের জন্য ধন্যবাদ। আমি পোস্টে আপনার সংস্করণ যুক্ত করেছি। আপনি যদি আরও ভাল কিছু পান তবে আমাকে জিজ্ঞাসা না করে এটিকে সম্পাদন করতে দ্বিধা বোধ করবেন।
ক্রিজিসটফ সজেউজাইক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.