8 इन्फिनिटी बनना चाहिए [बंद]


19

आइए एक विशिष्ट लूप पर नज़र डालें, जो आमतौर पर 8 पुनरावृत्तियों को पूरा करता है:

for (int x=0; x<8; ++x);

आपको इसे अनंत बनाना होगा!


यह सभी भाषाओं के लिए एक जो forलूप के ऐसे रूप का समर्थन करती है । तो उच्चतम स्कोर के साथ समाधान (घटा घटा नीचे) जीतता है।

यदि आपकी भाषा में forलूप का दूसरा रूप है , लेकिन आप सुनिश्चित हैं, तो आप इसके साथ कुछ ठंडा कर सकते हैं, बेझिझक उत्तर पोस्ट कर सकते हैं और इसे नॉनकंपेटिंग के रूप में चिह्नित कर सकते हैं। मैं उपलब्ध कंस्ट्रक्शन और भाषाओं के दायरे को बढ़ाने का अधिकार सुरक्षित रखता हूं, लेकिन यह कभी भी सिकुड़ नहीं जाएगा, इसलिए सही समाधानों को छोड़ने से डरो मत।


समाधान क्या है?

समाधान में दो कार्यक्रम होते हैं

पहला कार्यक्रम स्वच्छ कार्यक्रम है। यह आपकी भाषा में विशिष्ट कार्यक्रम है forजिसमें 8 पुनरावृत्तियाँ हैं। यह सामान्य कार्यक्रम होना चाहिए, कोई भी डेवलपर लिख सकता है। तैयारी के उद्देश्यों के लिए कोई विशेष हैक नहीं। उदाहरण के लिए:

int main() 
{
  for (int x=0; x<8; ++x);
  return 0;
}

दूसरा कार्यक्रम संवर्धित है। इस कार्यक्रम में स्वच्छ कार्यक्रम और कुछ अतिरिक्त कोड से सभी कोड होने चाहिए। सीमित संख्या में विस्तार बिंदु हैं, विवरण के लिए पूर्ण नियम अनुभाग देखें। ऊपर दिए गए स्वच्छ के लिए एक संवर्धित कार्यक्रम हो सकता है

inline bool operator < (const int &a, const int &b)
{
  return true;
}

int main() 
{
  for (int x=0; x<8; ++x);
  return 0;
}

एक विचार दिखाने के लिए यह सिर्फ एक उदाहरण है (C ++ में noncompilable)। वास्तविक सही संवर्धित कार्यक्रम को संकलित करने, काम करने और अनंत लूप होने की आवश्यकता है।

पूरा नियम

दोनों कार्यक्रम:

  • इस तरह के forछोरों के समर्थन के साथ कोई भी भाषा ठीक है।
  • लूप बॉडी को खाली होना पड़ता है। अधिक सटीक रूप से, आप कुछ आउटपुट या अन्य कोड को लूप में रख सकते हैं, लेकिन लूप का व्यवहार खाली लूप के मामले में समान होना चाहिए।

स्वच्छ कार्यक्रम:

  • लूप पूर्णांक या संख्यात्मक काउंटर का उपयोग करता है और 8 पुनरावृत्तियां करता है:

    for (int          x=0; x<8; ++x);   // C, C++, C#
    for (var          x=0; x<8; ++x);   // C#, Javascript
    for (auto         x=0; x<8; ++x);   // C, C++
    for (auto signed  x=0; x<8; ++x);   // C, C++
    for (register int x=0; x<8; ++x);   // C, C++
    
  • उपयोगकर्ता-परिभाषित प्रकार अस्वीकृत हैं।

  • लूप वेरिएबल के बजाय प्रॉपर्टी (ग्लोबल वैरिएबल को छोड़कर) का इस्तेमाल करना बंद कर दिया गया है।
  • चर की घोषणा लूप के अंदर या बाहर हो सकती है। निम्नलिखित कोड ठीक है:

    int x;
    for(x=0; x<8; ++x);
    
  • या तो उपसर्ग या उपसर्ग वृद्धि का उपयोग किया जा सकता है।

  • लूप की सीमा 8को स्थिर या परिवर्तनीय नाम दिए बिना बचत के रूप में लिखा जाना चाहिए। इसे 8 के बराबर चर या स्थिर घोषित करने के आधार पर समाधान को रोकने के लिए बनाया गया है, और फिर इसे पुन: असाइन करना, ओवरराइड करना या इसे अन्य मूल्य से छाया देना है:

    const double n = 8;
    
    int main()
    {
      const double n = 9007199254740992;
      for (double x=0; x<n; ++x);
      return 0;
    }
    

संवर्धित कार्यक्रम:

  • साफ एक से सभी कोड होना चाहिए।
  • सीमित संख्या में विस्तार बिंदुओं में स्वच्छ कार्यक्रम का विस्तार करना चाहिए।
  • एक ही for लूप को अनंत लूप के रूप में निष्पादित करना चाहिए ।
    लूप को दूसरे अनंत निर्माण में रखना ठीक नहीं है।
  • कोड के रनटाइम या कंपाइल-टाइम पैचिंग की अनुमति दी जाती है, जब तक कि इसका शाब्दिक प्रतिनिधित्व अपरिवर्तित न हो।
  • निर्माण को एक स्ट्रिंग में रखना और पास करना बंद evalकर दिया गया है।

विस्तार बिंदु:

  • अन्य फ़ाइलों या अन्य विधानसभाओं सहित स्वच्छ कोड के साथ टुकड़े के बाहर कहीं भी।
  • forबयान (एकल टुकड़े के रूप में - forनिर्माण और उसके शरीर) को अपरिवर्तित रखा जाना चाहिए।
  • परिवर्तनीय घोषणा को समान रखा जाना चाहिए।
  • सरल कथनों के बीच के किसी भी स्थान को विस्तार बिंदु के रूप में इस्तेमाल किया जा सकता है।
  • यदि और केवल तभी चर को लूप के बाहर घोषित किया गया था और मूल्य के तत्काल असाइनमेंट के बिना, ऐसे असाइनमेंट को जोड़ा जा सकता है।
/* extension point here */
int main()
/* extension point here */
{
  /* extension point here */
  int x /* extension point for assignment here */;
  /* extension point here */
  for (x=0; x<8; ++x);
  /* extension point here */
  return 0;
  /* extension point here */
}
/* extension point here */
int main() 
{
  /* BEGIN: No changes allowed */ int x = 0; /* END */
  /* extension point here */
  /* BEGIN: No changes allowed */ for (x=0; x<8; ++x); /* END */
  return 0;
}

पुनश्च: यदि संभव हो तो, ऑनलाइन आईडीई के लिए एक लिंक प्रदान करें।


2
@ ऑलिवर, जैसा कि मैं जानता हूं, "उच्चतम स्कोर (अपवोट्स माइनस डाउनवोट्स)" लोकप्रियता-प्रतियोगिता के लिए बिल्कुल ही चूक है , कम से कम यह टैग विवरण में लिखा गया है: "एक लोकप्रियता प्रतियोगिता एक प्रतियोगिता है जहां उच्चतम वोट टैली के साथ उत्तर होता है। (अपवोट्स माइनस डाउनवोट्स) जीतता है। " लेकिन मैं इसे स्पष्ट रूप से प्रश्न में जोड़ सकता हूं।
क्वर्टी

1
@ माल्टीसेन, इन निर्माणों के साथ भाषाओं में बहुत सारे दिलचस्प समाधान हैं। सी और सी ++ (बिल्कुल अलग समाधान के साथ), सी #, जावा, जावास्क्रिप्ट, पीएचपी, पर्ल, ग्रूवी हैं। मुझे यकीन है कि बहुत अधिक हैं। वैसे भी, मैं प्रश्न विस्तार के लिए खुला हूं और यह नियमों में निर्दिष्ट है। यदि आप अन्य भाषा में कुछ पुनरावृत्ति कर सकते हैं - इसे पोस्ट करें। यदि इसमें सकारात्मक परिवर्तन होगा, तो नियमों में वृद्धि की जा सकती है।
क्वर्टी

4
इसे लोकप्रियता-प्रतियोगिता के रूप में करना थोड़ा अजीब है क्योंकि मतदान करते समय मतदाताओं को किन मानदंडों का चयन करना चाहिए (जीत की स्थिति को व्यक्तिपरक बनाते हुए) इसका कोई विवरण नहीं है। मैं इस आधार पर एक कोड-गोल्फ समाधान पर काम कर रहा था कि यहां कई लोग गोल्फ समाधानों को दिलचस्प पाते हैं और इस तरह यह लोकप्रिय हो सकता है; ऐसा लगता है कि यह चुनौती के लिए एक व्यावहारिक जीत की स्थिति हो सकती है।

2
1. " पूर्णांक या संख्यात्मक काउंटर " थोड़ा अस्पष्ट है। जैसे इसमें शामिल है java.lang.Integer? 2. यह एक उचित जीत की कसौटी के साथ बेहतर होगा।
पीटर टेलर

1
1. हाँ, यह करता है। 2. वास्तव में क्रेतेरिया जीतना क्या है? पुनश्च: हम मेटा पर जारी रख सकते हैं ।
14::४० पर क्वर्टी

जवाबों:


33

python3

स्वच्छ कार्यक्रम:

लूप करते समय यह केवल एक मानक उलटी गिनती है।

n = 8
while n != 0:
  n -= 1
print("done")

संवर्धित कार्यक्रम:

import ctypes

ctypes.cast(id(8), ctypes.POINTER(ctypes.c_int))[6] = 9

n = 8
while n != 0:
  n -= 1
print("done")

यह फिर से परिभाषित करने पूर्णांक कैश का उपयोग करता 8के रूप में 9प्रभावी ढंग से करता है जो n -= 1एक नहीं-op, के बाद से 9-1 = 8जो सिर्फ सेट nवापस करने के लिए 9फिर से, अनंत लूप के कारण।

आप कार्रवाई में पूर्णांक कैश ऑनलाइन देख सकते हैं यहाँ (cuz अपनी ऑनलाइन अनंत लूप हालांकि स्पष्ट रूप से बिना)।


क्या आप कृपया IDEinde IDE का लिंक प्रदान कर सकते हैं? ideone.com/aI3ZrI - लगता है कि वहाँ काम नहीं कर रहा है।
क्वाटर्ली

@Qwertiy, मैंने इसे repl.it में चलाने की कोशिश की, लेकिन यह सिर्फ जमा देता है, जिसकी उम्मीद है क्योंकि यह एक अनंत लूप होगा। मुझे पता है कि इंट कैश सामान वहां काम करता है, क्योंकि यही वह जगह है जहां मैंने कैसे सेट 8किया9
माल्टीसेन

सच में वहाँ काम करता है। अजीब बात है कि विचारधारा (5 सेकंड) की तरह समय सीमा नहीं है। वे दिखाते हैंPython 3.5.2 (default, Dec 2015, 13:05:11) [GCC 4.8.2] on linux
क्वर्टी

लूप के बिना @Qwertiy लिंक: repl.it/E4fx/0
माल्टीसेन

यह दिलचस्प है ...
क्वर्टी

22

अजगर ३

स्वच्छ कार्यक्रम:

अजगर में 8 बार कुछ करने का मानक तरीका है:

for i in range(8): 
    # Do something
    pass

संवर्धित कार्यक्रम:

हालाँकि, अगर हम असीम रूप से 1 उपज के लिए रेंज जनरेटर फ़ंक्शन को ओवरराइड करते हैं, तो यह एक अनंत लूप बन जाता है ...

def range(x):
    while 1: yield 1

for i in range(8):
    # Infinite loop
    pass

हम इसे और आगे ले जा सकते हैं और एक जनरेटर फंक्शन बना सकते हैं, जो कि अनंत रूप से 1 उपज के बजाय, हमेशा के लिए मायने रखता है:

def range(x):
    i = 0
    while 1: yield i; i+=1

for i in range(8):
    # Counting from 0 to infinity
    pass

Repl.it पर परीक्षण करें


2
एक विशाल मॉड्यूल के बीच में छिपाएं ...
बेंजामिन

21

पर्ल

स्वच्छ

for($i=0; $i<8; $i++) { }

संवर्धित

*i=*|;
for($i=0; $i<8; $i++) { }

Ideone


16
ओह, यह वास्तव में चालाक है। किसी के लिए भी जो पर्ल को नहीं जानते हैं: यह $iएक विशेष चर के लिए एक उपनाम बनने के लिए एलियासिंग है जो केवल बूलियन धारण करने में सक्षम है, इसलिए एक बार यह 1 तक पहुंचने के बाद इसे बढ़ाना प्रतिरक्षा बन जाता है।

10

ES5 + (जावास्क्रिप्ट)

संपादित करें : स्पष्ट रूप से परिवर्तनशील घोषणा को हटा दिया गया था, क्योंकि अन्यथा इसे फहराया गया था और एक गैर-विन्यास योग्य window.x संपत्ति बनाई गई थी (जब तक कि आरईपीएल कंसोल में लाइन द्वारा रन लाइन नहीं)।

स्पष्टीकरण:

इस तथ्य का लाभ उठाता है कि कोई भी वैश्विक रूप से स्कोप किया गया चर भी विंडो ऑब्जेक्ट का गुण है , और 1 का निरंतर मान रखने के लिए "window.x" संपत्ति को फिर से परिभाषित करता है।

स्वच्छ

for(x=0; x<8; x+=1) console.log(x);

संवर्धित

Object.defineProperty(window,'x',{value:1});
for(x=0; x<8; x+=1) console.log(x);

नोट : इस कार्य को Node.js में करने के लिए, बस "विंडो" को "ग्लोबल" (Node.js 6.8.2 में परीक्षण किया गया) से बदलें


1
वैसे, यह ES5 है, है ना?
Qwertiy

इसके अलावा यह क्रोम में काम नहीं करता varहै। लेकिन आप varदोनों कार्यक्रमों से हटा सकते हैं - यह ठीक रहेगा।
Qwertiy

@ क्वर्टी यह मेरे लिए क्रोम में "var" के साथ काम करता है (लिनक्स / संस्करण 52.0.2743.82 (64-बिट))
zeppelin

> वैसे, यह ES5 है, है ना? सच है, अब शीर्षक को सही करेगा
zeppelin

1
समस्या लहराती है var, इसलिए definePropertyइसका उपयोग करने के समय पहले से ही बाहर निकलें। लेकिन अगर आप इन 2 लाइनों को अलग-अलग स्क्रिप्ट्स में रखते हैं (वैसे, इसकी अनुमति है), तो यह काम करेगा, क्योंकि संपत्ति पहले बनाई जाएगी और varफिर नजरअंदाज कर दिया जाएगा। प्रमाण: i.stack.imgur.com/lSwbE.png
Qwertiy

10

सी

स्वच्छ कार्यक्रम

int main() 
{
  for (int x=0; x<8; ++x);
  return 0;
}

संवर्धित कार्यक्रम

#define for(ever) while(1)

int main() 
{
  for (int x=0; x<8; ++x);
  return 0;
}

Must execute same for loop as an infinite loop itself. Placing of the loop into another infinite construction is not ok.
कार्ल नेफ

3
@KarlNapf "for" लूप एक अन्य अनंत निर्माण के अंदर नहीं है।
coredump

3
@ कर्नलनफ मुझे लगा कि इस उत्तर को नियम द्वारा स्पष्ट रूप से अनुमति दी गई थी: • कोड के रनटाइम या कंपाइल-टाइम पैचिंग की अनुमति तब तक दी जाती है जब तक कि इसका पाठीय प्रतिनिधित्व अपरिवर्तित न हो।
उमर

यह शब्द "लूप के लिए समान रूप से निष्पादित होना चाहिए" है, लेकिन हां यह पाठीय प्रतिनिधित्व के साथ संघर्ष करता है।
कार्ल नेप

7

जावा

स्वच्छ कार्यक्रम:

public class Main {
    public static void main(String[] args) throws Exception {
        for (Integer i = 0; i < 8; i++);
    }
}

संवर्धित कार्यक्रम:

import java.lang.reflect.Field;

public class Main {
    public static void main(String[] args) throws Exception {
        Class cache = Integer.class.getDeclaredClasses()[0];
        Field c = cache.getDeclaredField("cache");
        c.setAccessible(true);
        Integer[] intcache = (Integer[]) c.get(cache);
        intcache[129] = intcache[128];

        for (Integer i = 0; i < 8; i++);
    }
}

इंटेगर कैश में इंटेगर को सेट करता है जिसमें 1 से 0 होना चाहिए, प्रभावी रूप से i++कुछ भी नहीं कर रहा है (यह iकैश्ड इंटीगर में सेट होता है जिसमें 1 होना चाहिए, लेकिन चूंकि इंटेगर में वास्तव में 0 होता है, कुछ भी नहीं बदलता है)।


मुझे मारो, यह समाधान मेरे स्वयं के समान है।
हाइपिनो

6
यह वास्तव में लूप के लिए एक मुहावरेदार जावा नहीं है, जो शायद अनबॉक्स का उपयोग करेगा int अपेक्षाकृत हेवीवेट के बजायInteger


6

पायथन 3 (3.5.0)

स्वच्छ कार्यक्रम:

for i in range(8):
    print(i)

संवर्धित

import sys

from ctypes import *

code = sys._getframe().f_code.co_code

cast(sys._getframe().f_code.co_code, POINTER(c_char*len(code))).contents[len(code)-4] = 113
cast(sys._getframe().f_code.co_code, POINTER(c_char*len(code))).contents[len(code)-3] = 160

for i in range(8):
    print(i)

यह समाधान पाइथन में लिखे गए अन्य के विपरीत है क्योंकि यह वास्तव में मक्खी पर स्रोत कोड को बदलता है। लूप के लिए सभी सामान जो भी कोड चाहते हैं, उसे बदला जा सकता है।

कोड दूसरे 113या अंतिम ओपोड को बहुत अधिक आसानी से बदल देता है -JUMP_ABSOLUTE । यह ऑपरेंड को बदल 160देता है - निर्देश जहां कार्यक्रम के अंत में एक गोटो बयान बनाने के लिए, लूप के लिए शुरू होता है।

संवर्धित कार्यक्रम 0..7स्टैक-ओवरफ्लोिंग या समान के बिना कई बार संख्याओं को प्रिंट करता है ।


6

पीएचपी

मुझे लगता है कि यह विस्तार बिंदु नियमों का पालन कर रहा है; मैं बिंदु 4 पर पूरी तरह से स्पष्ट नहीं हूं। यह प्राइमो के पर्ल जवाब के समान है, इसलिए मुझे लगता है कि यह मायने रखता है।

स्वच्छ

for(;$i<8;$i++);

संवर्धित

$i='a';
for(;$i<8;$i++);

PHP आपको कुछ स्ट्रिंग्स को बढ़ाने देता है, जैसे:

'a' -> 'b'
'b' -> 'c'
'z' -> 'aa'
'aa' -> 'ab'
'aab' -> 'aac'
etc

ये सभी तार 0 का मूल्यांकन करते हैं, इसलिए यह व्यावहारिक रूप से हमेशा के लिए लूप करेगा (किसी भी तरह स्मृति से बाहर चल रहा है)।


यह प्रतियोगिता की भावना और बहुत दिलचस्प है। वास्तव में प्रारंभिक असाइनमेंट ommiting के बारे में कुछ भी नहीं कहा गया था, इसलिए यह कुछ किनारे का मामला है। वास्तव में यह उम्मीद की गई थी कि 0 और पुनरावृत्तियों को निर्दिष्ट करने के बीच कोई विस्तार बिंदु नहीं है। लेकिन मैं इसे अब अस्वीकार नहीं करने जा रहा हूं क्योंकि मैं इसके आधार पर कुछ इंटरसेपिंग एज केस तरीके देखता हूं और इसका अति प्रयोग करना आसान नहीं है।
क्वर्टी

2
@ क्वर्टी "तो यह कुछ बढ़त का मामला है।" संक्षेप में PHP :)
ToXik-yogHurt 16

6

पर्ल

साफ कोड

for ($x = 0; $x < 8; $x++) {}

संवर्धित कोड

sub TIESCALAR {bless []}
sub FETCH {}
sub STORE {}
tie $x, "";

for ($x = 0; $x < 8; $x++) {}

ज्यादातर पर्ल वेरिएबल सिर्फ वेरिएबल हैं। हालाँकि, भाषा में एक tieविशेषता भी है , जो आपको प्रभावी रूप से चर पाने वालों और बसने की अनुमति देती है। इस कार्यक्रम में, मैं मुख्य पैकेज (जिसका नाम नल स्ट्रिंग है) को एक ऑब्जेक्ट-ओरिएंटेड भाषा से एक वर्ग के बराबर में बनाता है, जबकि यह एक प्रोग्राम भी है। यह मुझे forप्रोग्राम के लिए लूप काउंटर को टाई करने की अनुमति देता है। कार्यान्वित करने की TIESCALARअनुमति का कोई प्रभाव नहीं है, और इसे हमेशा पढ़ने की कोशिश करता है , जो संख्यात्मक रूप से 8 से कम है।tie से सफल होने की है; रिटर्न वैल्यू का TIESCALARमतलब किसी भी आंतरिक स्थिति के लिए एक संदर्भ होना चाहिए जो हमें चर के साथ जुड़े रहने की आवश्यकता है, लेकिन क्योंकि हमें किसी की आवश्यकता नहीं है, हम एक प्लेसहोल्डर के रूप में एक खाली सरणी संदर्भ लौटाते हैं। हम फिर गेट्टर और सेटर का सबसे सरल संभव कार्यान्वयन देते हैं; उनमें से कोई भी कुछ भी नहीं करता है, इसलिए असाइन करने का प्रयास करता है$xundef


5

WinDbg

स्वच्छ

.for (r$t0 = 0; @$t0 < 8; r$t0 = @$t0 + 1) { }

संवर्धित

aS < |;                                            * Create alias of < as |
.block {                                           * Explicit block so aliases are expanded
    .for (r$t0 = 0; @$t0 < 8; r$t0 = @$t0 + 1) { } * Condition is now @$t0 | 8, always true
}

यह दृष्टिकोण के लिए एक उपनाम बनाता है <के रूप में |है, इसलिए जब <कोड में सामना करना पड़ा है उर्फ करने के लिए विस्तारित किया गया है |और बिटवाइज़-या उससे कम-से के बजाय किया जाता है। WinDbg में सभी गैर-शून्य मान anything | 8सत्य हैं इसलिए हमेशा सत्य होता है।

नोट: .blockवास्तव में जरूरत नहीं है अगर aSऔर .forवास्तव में दो अलग-अलग लाइनों के रूप में दर्ज किए गए हैं जैसा कि यहां दिखाया गया है, यह केवल तब आवश्यक है जब एक ही लाइन पर हों aSऔर हों .for


5

मेथेमेटिका

स्वच्छ

For[x = 0, x < 8, ++x,]

संवर्धित

x /: (x = 0) := x = -Infinity;
For[x = 0, x < 8, ++x,]

5

आम लिस्प

साफ कोड

(dotimes(i 8))

संवर्धित

(shadowing-import(defmacro :dotimes(&rest args)'(loop)))
(dotimes(i 8))

मैक्रो keyword:dotimes, उर्फ़ :dotimes( 11.1.2.3 द KEYWORD पैकेज देखें ) को परिभाषित किया गया है, जो एक अनंत लूप के रूप में फैलता है। defmacroमैक्रो रिटर्न मैक्रो का नाम परिभाषित किया जा रहा है, जो करने के लिए खिलाया जा सकता है shadowing-import। इस प्रकार, यह नया dotimesप्रतीक मानक एक को छाया देता है (जिसे पोर्टेबल कार्यक्रमों में किसी अन्य मैक्रो के लिए फिर से परिभाषित या शाब्दिक रूप से बाध्य नहीं किया जाना चाहिए)।

संवर्धित (2)

(set-macro-character #\8 (lambda (&rest args) '(loop)))
(dotimes(i 8))

जब हम चरित्र 8 को पढ़ते हैं, तो हम इसे बदल देते हैं (loop)। इसका मतलब यह है कि उपरोक्त पढ़ता है (dotimes (i (loop)))और इसलिए कोड कभी भी ऊपरी-सीमा की गणना नहीं करता है। यह लूप में केवल एक ही नहीं, 8 की सभी घटनाओं को प्रभावित करता है। दूसरे शब्दों में, 8 वास्तव में अनंत के लिए खड़ा है। यदि आप उत्सुक हैं, जब पठनीय को ऊपर की तरह संशोधित किया जाता है, तो चरित्र 8 "समाप्त" हो जाता है, और वर्तमान में पढ़ी जा रही अन्य संख्याओं / प्रतीकों से खुद को अलग करता है:

(list 6789)

... इस प्रकार है:

(list 67 (loop) 9)

आप Ideone: https://ideone.com/sR3AiU पर परीक्षण चला सकते हैं ।


4

माणिक

स्वच्छ

इस तरह के लूप का उपयोग रूबी में ज्यादा नहीं किया जाता है, लेकिन एक विशिष्ट ट्यूटोरियल आपको बताएगा कि यह इसके बारे में जाने का तरीका है:

for x in 1..8
  # Some code here
end

संवर्धित

लूप के लिए (1..8).eachकोड दिए गए ब्लॉक के साथ कॉल करता है , इसलिए हम उस विधि को बदलते हैं:

class Range
  def each
    i = first
    loop { yield i; i+= 1 }
  end
end

for x in 1..8
  # Some code here
end

4

हास्केल

साफ संस्करण:

import Control.Monad (forM_)

main = forM_ [0..8] $ \i -> print i

संवर्धित संस्करण:

import Control.Monad (forM_)

data T = C

instance Num T where
    fromInteger _ = C

instance Enum T where
    enumFromTo _ _ = repeat C

instance Show T where
    show _ = "0"

default (T)

main = forM_ [0..8] $ \i -> print i

यह काफी बुनियादी है, वास्तव में: हम केवल अपने स्वयं के प्रकार को परिभाषित करते हैं Tजैसे कि इसका enumFromToउदाहरण एक अनंत अनुक्रम है, फिर प्रकार डिफ़ॉल्ट का उपयोग करें ताकि अन-प्रकार-एनोटेट किए गए मान 0और 8प्रकार के रूप में ले जाएं T


1
हास्केल के अतिभारित संख्यात्मक शाब्दिकों के लिए डिफ़ॉल्ट प्रकार को बदलने का अच्छा विचार है।
nimi

3

///

for/// में कोई स्पष्ट लूप नहीं हैं , लेकिन अनुकरण किया जा सकता है (यह सब के बाद पूरा हो रहा है)।

स्वच्छ:

/1/0/
/2/1/
/3/2/
/4/3/
/5/4/
/6/5/
/7/6/
/8/7/
8

संवर्धित:

/0/0/
/1/0/
/2/1/
/3/2/
/4/3/
/5/4/
/6/5/
/7/6/
/8/7/
8

क्या चल रहा है?

जबकि पूर्व कार्यक्रम 8 0 से नीचे गिना जाता है, बाद किसी के /0/0/नियम का स्थान ले लेगा 0द्वारा 0अनंत काल तक।


और मुझे लगा कि आप वास्तव में /0/1//1/2/.../7/8//8/8/8इसके बजाय गिनने के लिए कुछ करेंगे ।
आउटगॉल्फ़र

3

जावास्क्रिप्ट ईएस 6

ठीक है, यहाँ एक संस्करण है जो पाश निर्माण के लिए ES6 ... का उपयोग करके काम करता है। मैं तुम्हें एक साफ सरणी भी दूंगा ताकि हमें यकीन हो जाए कि कोई मज़ेदार व्यवसाय नहीं है:

स्वच्छ

for(a of [0,1,2,3,4,5,6,7]);

बेशक, यह किसी को ऐरे प्रोटोटाइप के साथ खिलवाड़ करने से नहीं रोकता है ...

संवर्धित

Array.prototype[Symbol.iterator]=function(){return {next: function(){return {done: false}}}}
for(a of [0,1,2,3,4,5,6,7]);

यह डिफ़ॉल्ट पुनरावृत्ति को ओवर-राइट करके काम करता है ताकि यह कभी समाप्त न हो, इसलिए सब कुछ एक अनंत लूप में बंद कर दें। कोड में लूप के अंदर सामान चलाने का मौका भी नहीं होता है।


"लूप व्यवहार खाली लूप के मामले में समान होना चाहिए"
क्वर्टी

डार, याद किया कि - मुझे कुछ पता लगाना होगा।
मार्कस डायर

जहाँ तक मैं बता सकता हूँ, यह संभव नहीं है कि जावास्क्रिप्ट में लूप के लिए सी-स्टाइल के साथ क्या चुनौती है जब तक आप एक नियम नहीं तोड़ते हैं - या तो इसके अंदर कुछ (मेरे समाधान की तरह) होने से या लूप की पूर्व-मालिश करके अपने स्वच्छ कोड में घोषणा (जैसा कि सेड्रिक रीचेनबैक का)।
मार्कस डायर

वास्तव में कुछ तरीके हैं। वैश्विक चर के साथ रास्ता पहले से ही पोस्ट किया गया है, varलेकिन लूप में अनुमति देने के लिए कुछ और हैं ।
क्वर्टी

जैसा मैंने कहा, जहां तक ​​मैं बता सकता हूं। मैंने उस टिप्पणी को करने के बाद वैश्विक परिवर्तनशील तरीके को देखा और खुद को लात मारी।
मार्कस डायर

2

सी ++

2 विस्तार बिंदुओं का उपयोग करता है:

struct True {
  True(int x){}
  bool operator<(const int&){
    return true;
  }
  void operator++(){}
};


int main() 
{
#define int True
  for (int x=0; x<8; ++x);
  return 0;
}

विवरण में स्वच्छ कार्यक्रम समान है।


अच्छा है, लेकिन "अनुकूलित" किया जा सकता है :) एक और जवाब देने के लिए C ++ में कुछ दिलचस्प बिलियन हैं।
Qwertiy

2

Brainfuck

मैं प्रत्येक पुनरावृत्ति को '0' प्रिंट करता हूं, बस पुनरावृत्तियों को गिनना आसान बनाता हूं। लेकिन लूप के काम करने के तरीके को बदले बिना कोई भी कोड वहां डाला जा सकता है।

स्वच्छ

>> ++++++ [-<++++++++>] <<                   b = '0' (value to be printed each iteration)

>> ++++++++ [-<< ++++++++ ++++++++ >>] <<    for (a = a plus 128;
[                                              a;
++++++++ ++++++++                              a = a plus 16 (mod 256)) {
>.<                                              loop body (print b)
]                                            }

इसे ऑनलाइन आज़माएं

संवर्धित संस्करण 8 बिट कोशिकाओं के साथ सामान्य ब्रेनफक कार्यान्वयन पर निर्भर करता है। इन कार्यान्वयनों पर, "वेतन वृद्धि" वास्तव में "वेतन वृद्धि (मॉड 256)" है। इस प्रकार एक लूप को खोजने के लिए जो स्वच्छ संस्करण में 8 बार ठीक होगा और संवर्धित संस्करण में अंतहीन होगा, हम केवल असमानताओं की निम्न प्रणाली का समाधान पा सकते हैं।

  • a + b * 8 (mod 256) == 0 (स्वच्छ संस्करण के लिए)
  • c + a + b * n (mod 256)> 0 सभी n के लिए (संवर्धित संस्करण के लिए)
  • ए> 0

इस मामले में, हम एक = 128, बी = 16, और सी = 1. जाहिर है 128 + 16 * 8 = 256 (और 256 (मॉड 256) = 0) और 128> 0, और बी के बाद से भी है, सी + a + b * n किसी भी विषम a + c के लिए विषम है, और इस प्रकार ऐसे मामलों में 256 का एक भी कभी नहीं होगा। हम सरलता के लिए c = 1 का चयन करते हैं। इस प्रकार +कार्यक्रम की शुरुआत में हमें जो एकमात्र परिवर्तन चाहिए वह एकल है ।

संवर्धित

+                                            increment a (only change)
>> ++++++ [-<++++++++>] <<                   b = '0' (value to be printed each iteration)

>> ++++++++ [-<< ++++++++ ++++++++ >>] <<    for (a = a plus 128;
[                                              a;
++++++++ ++++++++                              a = a plus 16 (mod 256)) {
>.<                                              loop body (print b)
]                                            }

इसे ऑनलाइन आज़माएं

मैं यह निर्धारित करने के लिए ओपी पर छोड़ता हूं कि यह प्रविष्टि प्रतिस्पर्धा कर रही है या नहीं। ब्रेनफक में लूप के लिए स्पष्ट नहीं है, लेकिन मैंने जिस लूप फॉर्म का उपयोग किया है वह उतना ही करीब है जितना आपको मिलने की संभावना है। ++++++++एक शाब्दिक के करीब भी है जितना 8आप प्राप्त कर सकते हैं; मैंने उनमें से कुछ को शामिल किया है।

स्वच्छ संस्करण लगभग निश्चित रूप से इस भाषा में लिखे गए एक विशिष्ट कार्यक्रम का गठन करता है, यहां तक ​​कि सबसे कम ज्ञात ब्रेनफैक हैलो वर्ल्ड भी काम करने के लिए एक मॉड्यूलर पुनरावृत्ति संबंध पर निर्भर करता है।


2

हास्केल

स्वच्छ

import Control.Monad (forM_)

main = forM_ [0..8] $ \i -> print i

संवर्धित

import Control.Monad (forM_)

import Prelude hiding (($))
import Control.Monad (when)

f $ x = f (\i -> x i >> when (i == 8) (f $ x))

main = forM_ [0..8] $ \i -> print i

सामान्य फ़ंक्शन अनुप्रयोग ऑपरेटर को प्रतिस्थापित करता है $ को एक से बदल देता है जो लूप को हर बार पूरा करने के बाद फिर से दोहराता है। स्वच्छ संस्करण को 0 से 8 तक प्रिंट करता है और फिर बंद हो जाता है; संवर्धित संस्करण 0 से 8 प्रिंट करता है और फिर 0 से 8 फिर से, और इसी तरह।

मैं थोड़ा धोखा देता हूं, forM_ [0..8] $ \i -> print iजरूरी नहीं कि हास्केल में उस लूप को लिखने का "सबसे साफ" तरीका हो; कई हास्केलर लूप बॉडी पाने के लिए एटा-कम कर देंगे forM_ [0..8] printऔर फिर $ओवरराइड करने के लिए नहीं है। अपने बचाव में मैंने कैक्टस के उत्तर से स्वच्छ कोड की नकल की , जिन्हें उस संपत्ति की आवश्यकता नहीं थी, इसलिए कम से कम एक हास्केल प्रोग्रामर ने वास्तव में उस कोड को लिखा, जिसमें अनावश्यक रूप से कोई प्रेरणा न हो $!


1

सी ++

int main() 
{
  int y;
#define int
#define x (y=7)
  for (int x=0; x<8; ++x);
  return 0;
}

चलें x7 के रूप में मूल्यांकित सी में काम नहीं करता है, क्योंकि यह assignement और वेतन वृद्धि में एक lvalue की आवश्यकता है।


1

निम

मुहावरेदार संस्करण, का उपयोग कर countup :

स्वच्छ

for i in countup(1, 8):
  # counting from 1 to 8, inclusive
  discard

संवर्धित

iterator countup(a: int, b: int): int =
  while true:
    yield 8

for i in countup(1, 8):
  # counting 8s forever
  discard

सरल, और बहुत पायथन जवाब केrange समान है जो फिर से परिभाषित करता है । हम फिर से परिभाषित करते हैंcountup , एक इंट (समावेशी) से दूसरे में पुनरावृत्ति करने का मुहावरेदार निम तरीका, 8s को असीम रूप से देने के लिए।

रेंज ऑपरेटर का उपयोग करके अधिक दिलचस्प संस्करण .. :

स्वच्छ

for i in 1..8:
  # counting from 1 to 8, inclusive
  discard

संवर्धित

iterator `..`(a: int, b: int): int =
  while true:
    yield 8

for i in 1..8:
  # counting 8s forever
  discard

पिछले समाधान के समान ही, सिवाय इसके कि हम रेंज ऑपरेटर को पुनर्परिभाषित करते हैं .., जो आम तौर [1, 2, 3, 4, 5, 6, 7, 8]पर पहले से पुनरावृत्त को एक सरणी देता है ।


1

GolfScript

स्वच्छ

0{.8<}{)}while;

संवर्धित

{.)}:8;
0{.8<}{)}while;

यह वैरिएबल 8 में n + 1 लौटाने वाला फ़ंक्शन प्रदान करता है


1

tcl

सामान्य:

for {set i 0} {$i<8} {incr i} {}

संवर्धित:

proc incr x {}
for {set i 0} {$i<8} {incr i} {}

विचार उस incrआदेश को फिर से परिभाषित करने के लिए है जिसका उपयोग चर को बढ़ाने के लिए किया जाता हैi , वास्तव में वेतन वृद्धि के लिए नहीं!

पर परीक्षण किया जा सकता है: http://rextester.com/live/QSKZPQ49822


1

x86_64 विधानसभा

स्वच्छ कार्यक्रम:

mov rcx, 8
loop_start:
sub rcx, 1
cmp rcx,0
jne loop_start
mov rax, 0x01
mov rdi, 0
syscall

किसी भी असेंबली प्रोग्रामर द्वारा लूप का उपयोग किया जाएगा, उसके बाद एक एग्जिट सिस्कॉल होगा, ताकि jmp loop_startबाद में एक निर्देश जोड़ने में सक्षम न हो ।

संवर्धित कार्यक्रम:

global start
section .text
start:
mov rcx, -1
jmp loop_start
mov rcx, 8
loop_start:
sub rcx, 1
cmp rcx,0
jne loop_start
mov rax, 0x01
mov rdi, 0
syscall

इसके अलावा, खेद है कि अगर यह खराब है कि स्वच्छ कार्यक्रम में एंट्रीपॉइंट या ए नहीं है section .text


पूर्णांक अतिप्रवाह के बाद क्या यह बंद नहीं होगा?
Qwertiy

1
ओह, उह ... शायद। लेकिन इसमें लंबा समय लगेगा? मैं भूल गया कि ऐसा हो सकता है, ज्यादातर उच्च-स्तरीय भाषा प्रोग्रामर होने के
नाते

0

जावास्क्रिप्ट

स्वच्छ:

for (var i = 0; !(i > Math.PI * 2.5); i++);

संवर्धित:

window.Math = {PI: NaN};
for (var i = 0; !(i > Math.PI * 2.5); i++);

एक विशिष्ट लूप प्रतीत नहीं होता है ...
क्वर्टी

हाँ, मैं थोड़े खिंचा हुआ शब्द ठेठ ...: /
सेड्रिक रीचेंबेक

0

सी ++

स्वच्छ कार्यक्रम

एक अच्छा, सामान्य लूप, संख्या 0 से 7 तक पुनरावृत्त।

#include <iostream>

int main() {

  for (short i = 0; i < 8; i++) {
    // Print `i` with a newline.
    std::cout << i << std::endl;
  }    

}

संवर्धित कार्यक्रम

C ++ का प्रीप्रोसेसर काफी खतरनाक फीचर है ...

#include <iostream>
#define short bool

int main() {

  for (short i = 0; i < 8; i++) {
    // Print `i` with a newline.
    std::cout << i << std::endl;
  }    

}

हमें जोड़ने के लिए एकमात्र लाइन थी #define short bool। यह iएक छोटे पूर्णांक के बजाय एक बूलियन बनाता है, और इसलिए वेतन वृद्धि ऑपरेटर ( i++) कुछ भी नहीं करता हैi तक पहुंचने के है। आउटपुट तब इस तरह दिखता है:

0
1
1
1
1
1
...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.