बाइनरी वर्णों की एक स्ट्रिंग को ASCII समकक्षों में बदलें


27

एक अंतरिक्ष द्वारा अलग किए गए द्विआधारी वर्णों की एक स्ट्रिंग लें, और इसे ASCII स्ट्रिंग में परिवर्तित करें।

उदाहरण के लिए...

1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100

बदलना होगा ...

Hello World

बाइनरी स्ट्रिंग नामक एक चर में संग्रहीत किया जाएगा s

यह एक कोड-गोल्फ चुनौती है, जिससे सबसे छोटा समाधान जीत जाता है।


15
, कहानी और अन्य fripperies बिना एक चुनौती बना सीधे बात करने के लिए लिए +1
bebe

9
@ कबी काल्पनिक काल्पनिक फ्रैपरियां आधी मस्ती बनाती हैं।
क्यूर

नमस्ते। आइए कल्पना करें कि आपकी तकनीक इतनी उन्नत है कि यह ASCII का समर्थन नहीं करती है। क्या इसे देशी चरित्र एन्कोडिंग में बदलने की अनुमति दी जाएगी, या इसे ASCII को मूल वर्ण एन्कोडिंग में बदलना होगा? मैं ZX81यहां सोच रहा हूं ।
शॉन बीबर्स

जवाबों:


10

रूबी, ३६ ३२

s.split.map{|x|x.to_i(2).chr}*""

या ३१

s.gsub(/\w+ ?/){$&.to_i(2).chr}

अनुकूलन के लिए धन्यवाद


1
आप कुछ पात्रों को बचाने के .join""लिए स्थानापन्न कर सकते हैं *""। आप इसे विभाजन के बजाय gsub के साथ + मैप + जॉइन, कुछ इस तरह से भी कर सकते हैं: s.gsub(/\w+ ?/){$&.to_i(2).chr}(31 वर्ण)।
पॉल प्रेस्टिज

2
s.gsub(/\d+./){$&.to_i(2).chr}काम करता है और यह 30 वर्णों का है, मुझे नहीं पता कि यह क्यों काम करता है। .पिछली बार से मेल नहीं करना चाहिए, लेकिन यह करता है।
Addison

10

जावास्क्रिप्ट (ईएस 6) 49 55 56 64

s.replace(/\d+./g,x=>String.fromCharCode('0b'+x))

@Bebe सुझाव को स्वीकार करते हुए संपादित करें - धन्यवाद
Edit2 बाइनरी न्यूमेरिक शाब्दिक के बारे में पता नहीं था - धन्यवाद @kapep
Edit3 वाह 6 नहीं 4 बाइट बचाया thx @ETHproductions

टिप्पणियों में अनुरोध के रूप में स्पष्टीकरण

String.replace 2 तर्क ले सकते हैं:

  • नियमित अभिव्यक्ति /\d+./g: एक या एक से अधिक अंकों के बाद एक अलग वर्ण - जी ध्वज एक से अधिक बार पैटर्न को खोजने के लिए निर्दिष्ट करता है
  • एक फ़ंक्शन, यहां तीर प्रारूप में निर्दिष्ट किया गया है, जहां तर्क (x) wil पाया जा सकता है स्ट्रिंग (अंकों का क्रम अंततः एक स्थान के बाद) और फ़ंक्शन का मान है जो प्रतिस्थापित किया गया है (इस मामले में, एकल वर्ण से कोड)।

यह ध्यान देने योग्य है कि स्ट्रिंग के अंत में regexp एक अनुगामी स्थान के बिना अंकों के अनुक्रम से मेल खाता है, इस मामले में डॉट अंतिम अंक से मेल खाता है। सत्यापित करने के लिए '123'.match (/ (\ d +) /) आज़माएं।

(अभी भी) जावास्क्रिप्ट के अधिक क्रियात्मक टुकड़ों में से एक कभी ...
(स्ट्रिंग एस तक गिना नहीं)

var s='1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100'
var x=
s.replace(/\d+./g,x=>String.fromCharCode('0b'+x))

console.log(x)


2
s.replace(/\d+./g,x=>String.fromCharCode(parseInt(x,2)))56
बेबे

2
s.replace(/\d+./g,x=>String.fromCharCode(eval("0b"+x)))55
केपेक्स

क्या आप कृपया बता सकते हैं कि क्या /\d+./g,x=>करता है?
izlin

1
@ मिज़लिन मैंने उत्तर में कुछ स्पष्टीकरण जोड़ा
edc65

मैं जानता हूँ कि यह एक पुरानी जवाब है, लेकिन आप बदल सकते हैं eval('0b'+x)करने के लिए '0b'+x-04 बाइट को बचाने के लिए।
ETHproductions

8

बैश + आम linux बर्तन, 25 बाइट्स

dc<<<2i$s[Pz0\<m]dsmx|rev

डीसी स्पष्टीकरण

  • स्टैक के लिए 2 धक्का; पॉप और इनपुट रेडिक्स के रूप में उपयोग करें
  • पुश इनपुट स्ट्रिंग को स्टैक करने के लिए (सभी मान एक बार में)
  • पुनरावर्ती मैक्रो mको परिभाषित करें :
    • पॉप, फिर ASCII के रूप में प्रिंट मूल्य
    • ढेर करने के लिए ढेर गहराई धक्का
    • ढेर करने के लिए 0 धक्का
    • पॉप शीर्ष 2 स्टैक मान; mमैक्रो की तुलना करें और कॉल करें यदि स्टैक नॉन-खाली हो
  • स्टैक के डुप्लिकेट शीर्ष (मैक्रो परिभाषा)
  • पॉप और mरजिस्टर करने के लिए मैक्रो सहेजें
  • पॉप और मैक्रो निष्पादित करें

क्योंकि हम पूरे बाइनरी स्ट्रिंग को पहले स्टैक पर धकेलते हैं, जब हम प्रत्येक मान को पॉप करते हैं, तो हम स्ट्रिंग को उलट देते हैं। इसलिए हम revउपयोगिता को सही करने के लिए उपयोग करते हैं ।

उदाहरण का उपयोग:

$ s="1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100"
$ dc<<<2i$s[Pz0\<m]dsmx|rev
Hello World
$ 

7

पॉवरशेल, 49

-join(-split$s|%{[char][convert]::toint32($_,2)})

संपादित करें: अन्य PowerShell जवाब नहीं देखा। लेकिन इसे हल करने का अनिवार्य रूप से केवल एक ही तरीका है।


7

सी - 57 43 38/31

38 बाइट संस्करण:

for(int*x=s;putchar(strtol(x,&x,2)););

या केवल 31 बाइट्स अगर एक पॉइंटर है:

while(putchar(strtol(s,&s,2)));

मुझे नहीं लगता कि यह वास्तव में कैसे और जबकि लूप का उपयोग किया जाना है ... लेकिन यह काम करता है।


6

अजगर , १२

smCv+"0b"dPZ

ध्यान दें कि Pyth में s एक कानूनी चर नहीं है, इसलिए मैंने इसके बजाय Z का उपयोग किया।

स्पष्टीकरण:

        print(
s             sum(
m                 map(lambda d:
C                     chr(
v                         eval(
+"0b"d                         "0b"+d)),
P                     split(
Z                           Z))))

उदाहरण:

=Z"<the binary string from above>"smCv+"0b"dPZ
Hello World

तथ्य यह है कि यह प्रारूपण में
व्हॉट्सएप का

@Pharap हाँ, Pyth को देखने का एक तरीका यह है कि यह सभी तत्वों के साथ Python है, जो इसे हटाए गए अधिक वर्णों को ले जाता है, जैसे कि
व्हाट्सएप

मैं Pyth पता नहीं है, लेकिन यह 4 अक्षर बचाने उपयोग करने के लिए नहीं होगा id2के स्थान पर v+"0b"d? किसी भी मामले में, यह अपठनीय और शांत दोनों है।
DLosc

@DLosc मैंने इस सवाल के कारण बड़े पैमाने पर, इस सवाल के पूछे जाने के बाद उस कार्य को Pyth में जोड़ा। यह वर्तमान समय के पाइथ से छोटा होगा, लेकिन इस चुनौती के लिए वर्तमान दिन की अनुमति नहीं है।
इसाक

समझा। मुझे आश्चर्य हुआ कि क्या ऐसा कुछ हो सकता है।
DLosc

6

डॉस पर x86 मशीन कोड - 22 बाइट्स

00000000  30 d2 b4 08 cd 21 2c 30  72 06 d0 e2 08 c2 eb f2  |0....!,0r.......|
00000010  b4 02 cd 21 eb ea                                 |...!..|

चूंकि मशीन कोड में कोई वास्तविक स्ट्रिंग चर नहीं हैं (और विशेष रूप से, " s" नाम का कोई चर नहीं ) मैं इनपुट के रूप में स्टड के लिए बस गया।

NASM इनपुट:

    org 100h

section .text

start:
    xor dl,dl
loop:
    mov ah,8
    int 21h
    sub al,'0'
    jb print
    shl dl,1
    or dl,al
    jmp loop
print:
    mov ah,2
    int 21h
    jmp start

6

पॉवर्सशेल ( 52 49)

-join(-split$s|%{[char][convert]::ToInt16($_,2)})

$ S में बाइनरी स्ट्रिंग पर सरल लूप। [कन्वर्ट] को शामिल करने के बाद मेरे स्कोर को मारता है।

संपादित करें: वास्तव में पॉवर्सशेल, वूवी में इसे बंद करने का केवल एक तरीका है। जॉय और मैं दोनों एक ही जवाब में बहुत अधिक स्वतंत्र रूप से काम कर रहे हैं!

इनपुट:

1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100

आउटपुट:

Hello World

1
आप तीन वर्णों को सहेजते हुए (जिस पर हमारे उत्तर समान हैं ... बड़े आश्चर्य की बात है ;-)) आप अनियंत्रित विभाजन ऑपरेटर का उपयोग कर सकते हैं।
जॉय

@ जोये ओह, अच्छी बात है! विश्वास नहीं कर सकता कि मैं चूक गया। तुम मुझे पकड़ने के लिए उस से +1 मिलता है, धन्यवाद!
fuandon

5

गणितज्ञ, 52 बाइट्स

आह, मैथेमेटिका के प्यारे फंक्शन के नाम

f=FromCharacterCode[#~FromDigits~2&/@StringSplit@#]&

5

पर्ल 33 32

संपादित करें: अद्यतन समाधान, 32।

say$s=~s/\d+ ?/chr oct"0b$&"/rge

पिछला समाधान (33):

$_=$s;say map{chr oct"0b$_"}split

या

say map{chr oct"0b$_"}split/ /,$s

परीक्षा:

perl -E '$s="1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100";$_=$s;say map{chr oct"0b$_"}split'

5

जे (23)

u:;(#.@:("."0))&.>cut s

परीक्षा:

   s=:'1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100'
   u:;(#.@:("."0))&.>cut s
Hello World

स्पष्टीकरण:

                  cut s    NB. split S on spaces
   (          )&.>         NB. for each element
        ("."0)             NB. evaluate each character
      @:                   NB. and
    #.                     NB. convert bitstring to number
  ;                        NB. unbox each number
u:                         NB. convert to ASCII



4

एपीएल (15)

⎕UCS{2⊥⍎¨⍕⍵}¨⍎s

परीक्षा:

      s←'1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100'
      ⎕UCS{2⊥⍎¨⍕⍵}¨⍎s
Hello World

स्पष्टीकरण:

  • ⍎s: मूल्यांकन s, पूर्णांक की एक सरणी में बदल रहा है। Arrays को रिक्त स्थान से अलग संख्या के रूप में लिखा जाता है, इसलिए यह विभाजन करता है s
  • {... : प्रत्येक तत्व के लिए:
    • ⍕⍵: संख्या को वापस स्ट्रिंग में बदल दें
    • ⍎¨: प्रत्येक व्यक्तिगत अंक का मूल्यांकन, एक बिटस्ट्रिंग देना
    • 2⊥: बेस -2 डीकोड, नंबर देना
  • ⎕UCS: प्रत्येक संख्या के लिए वर्ण प्राप्त करें

जब तक अन्यथा निर्दिष्ट न हो आपको वर्णों के बजाय बाइट्स गिनना चाहिए: codegolf.stackexchange.com/tags/code-golf/info :)
Averroes

1
@ एवरो: एपीएल चारसेट कमरे के साथ बाइट में फिट बैठता है: frankenstein.dns.org.uk/~marinus/aplcharset.png
marinus

आह, मैं यह नहीं जानता था। मेरी गलती। माफ़ कीजिये!
12:31

4

PHP (61)

<?=join(array_map('chr',array_map('bindec',explode(' ',$s))))

foreach(str_split($s,8)as$v)echo chr(bindec($v));
जोर्ग हल्सरमैन

@ JörgHülsermann एन्कोडिंग अग्रणी शून्य को छोड़ सकती है इसलिए str_split($s,8)काम नहीं करेगी। foreach(explode(' ',$s)as$v)echo chr(bindec($v));मान्य होगा, लेकिन मैं अपने पहले PPGC जवाबों में से एक को संपादित करने की योजना नहीं बनाता, जो स्पष्ट रूप से वैसे भी वास्तव में नहीं है। वैसे भी धन्यवाद!
क्रिस्टोफ

4

बाकुस , 25 बाइट्स

S,' 'j:A=(Ö,2,10b:c),A¨

स्पष्टीकरण:

S,' 'j स्ट्रिंग S को खाली स्थान से विभाजित करें और इसे एक ब्लॉक (किसी प्रकार की सरणी) में परिवर्तित करें।

:A= पिछले ब्लॉक को प्राप्त करें और इसे ए वेरिएबल को असेम्बल करें।

(),A¨ ए में प्रत्येक तत्व के लिए

Ö,2,10bÖबेस 2 में वर्तमान तत्व (द्वारा प्रतिनिधित्व करें ) पढ़ें और इसे बेस 10 में बदल दें।

:c पिछला मान प्राप्त करें और चार के रूप में प्रिंट करें



3

सी - 63

चूंकि मानक पुस्तकालय में C का कोई आधार 2 कनवर्टर नहीं है: यहाँ परीक्षण
संपादित करें: वहाँ है, मैं इसके बारे में जानने के लिए बहुत बेवकूफ हूं

r;f(char*s){for(;*s;(*s|32)-32||(putchar(r),r=0))r=2*r|*s++&1;}

3

रन लंबाई एनकोडेड ब्रेनफक, 49 बाइट्स

चूंकि ब्रेनफक में कोई चर नहीं हैं, मैंने सिर्फ मानक इनपुट और आउटपुट का उपयोग किया।

32+दुभाषिया +द्वारा कोड को 32 एस के रूप में व्याख्या की जानी चाहिए । यदि आपका दुभाषिया RLE का समर्थन नहीं करता है तो बस उन्हें मैन्युअल रूप से प्रतिस्थापित करें।

>,[32->+<[16-<[>++<-]>[<+>-]>-<]>[<<.[-]>>-]<,]<.

विस्तारित (गैर-RLE) संस्करण: (91 बाइट्स)

>,[-------------------------------->+<[----------------<[>++<-]>[<+>-]>-<]>[<<.[-]>>-]<,]<.

कोड मानता है कि EOF 0 के रूप में एन्कोडेड है।

व्याख्या

निम्नलिखित लेआउट का उपयोग किया जाता है:

+---+---+------+
| x | a | flag |
+---+---+------+

xASCII बाइट को कहां मुद्रित किया जाता है, aमानक इनपुट से एक वर्ण है और एक स्थान है flagतो 1 aहै।

>,            Read a character a into the second cell
[             While not EOF: 
  32-           Decrease a by 32 (a -= ' ')
  >+<           Set the flag to 1 
  [             If a was not a space:
    16-           Decrease by 16 more ('0' == 32+16)
    <[>++<-]      a += 2*x
    >[<+>-]       Move it back (x = a)
    >-<           Reset the flag, it was not a space.
  ]>
  [             If a was a space (flag == 1):
    <<.[-]        Print and reset x
    >>-           Reset the flag
  ]
  <,            Read the next caracter a
]
<.            Print the last character x

1
+1 क्योंकि सब कुछ एक दिमाग़ी क्रियान्वयन होना चाहिए।
फराप जूल

क्या "रन लंबाई एन्कोडेड ब्रेनफक" एक वास्तविक अलग भाषा है? मुझे एक दुभाषिया नहीं मिल रहा है।
mbomb007

3

जावा 8: 60 बाइट्स

जावा 8 (75 बाइट्स) में लैम्ब्डा का उपयोग करना:

Arrays.stream(s.split(" ")).reduce("",(a,b)->a+(char)Byte.parseByte(b,2));

और यदि आप स्थैतिक आयात की अनुमति देते हैं (जो कुछ यहाँ इस्तेमाल किया गया है) तो यह (61 बाइट्स) है:

stream(s.split(" ")).reduce("",(a,b)->a+(char)parseInt(b,2))

लूप के लिए एक छोटा सा छोटा संस्करण (60 बाइट्स):

for(String n:s.split(" ")){out.print((char)parseInt(n,2));}

2
क्या, वे वास्तव में गुमनाम वर्ग के रूप में जाना जाने वाले राक्षसी के लिए एक प्रतिस्थापन बना? बहुत बढ़िया।
जेक

@ एसआईजी हाँ जावा के पास अब लैम्बदास / क्लोजर भी है, लेकिन यह गुमनाम कक्षाओं के शीर्ष पर ज्यादातर सिंथेटिक चीनी है ... (जाहिर है)
रॉय वैन रिजन

3

क्लोजर 63 (या 57)

ऑल-क्लोजर इम्प्लांट:

(apply str(map #(char(read-string(str"2r"%)))(re-seq #"\d+"s)))

जावा इंटरॉप के साथ:

(apply str(map #(char(Long/parseLong % 2))(.split s" ")))

REPL सत्र:

golf> (def s "1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100")
#'golf/s
golf> (apply str(map #(char(read-string(str"2r"%)))(re-seq #"\d+"s)))
"Hello World"
golf> (apply str(map #(char(Long/parseLong % 2))(.split s" ")))
"Hello World"

3

QBasic, 103

s$=s$+" ":FOR i=1 TO LEN(s$):c$=MID$(s$,i,1):IF c$=" "THEN n=0:r$=r$+CHR$(n)ELSE n=n*2+VAL(c$)
NEXT:?r$

क्या? हमारे यहां कोई फैंसी बाइनरी-टू-दशमलव फ़ंक्शन नहीं है। यह स्वयं करो!

इस मेटा पोस्ट केEND IF अनुसार, मैं एक नई बाइट के रूप में नईलाइन (जो मुझे लगता है कि अगर-तब-तब-बिना प्राप्त करना आवश्यक है) गिन रहा हूं । मुझे नहीं पता कि विंडोज पर QB64 उस तरह से कोड फ़ाइल को स्वीकार करेगा या नहीं। शायद ज्यादा बात नहीं है।


2

NodeJS - 62

Buffer(s.split(' ').map(function(a){return parseInt(a,2)}))+''

PHP - 75

array_reduce(explode(' ', $b),function($a,$b){return $a.chr(bindec($b));});

आप es6 संगतता के साथ नोडज कैसे चलाते हैं? नवीनतम एक अभी भी मेरे लिए लैम्ब्डा कार्यों का समर्थन नहीं करता
Bebe

@bebe एरो फ़ंक्शंस v8 में लागू किए गए हैं, लेकिन वे अभी तक नोड के साथ एकीकृत नहीं हैं। मैं अपनी पोस्ट संपादित करूंगा।
cPu1

@ cPu1 वे मेरे लिए काम करते हैं
username.ak

2

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

यह पार्सइंट या ईवैल के बिना संख्या रूपांतरण करता है। स्ट्रिंग को पीछे की ओर पढ़ना और बिट्स को सेट करना अगर यह एक है तो बिट x को सेट करें। जब एक स्थान पाया जाता है एक संख्या एक चार में बदल जाती है और बिट्स सेट करने के लिए एक नया 0 नंबर शुरू होता है।

x=n=0,w='',s=' '+s
for(i=s.length;i--;){m=s[i]
if(m==1)n|=1<<x
x++
if(m==' ')w=String.fromCharCode(n)+w,n=x=0
}

1
इसे पुराने ढंग से करने के लिए +1 ने मुझे QBasic संस्करण लिखने के लिए प्रेरित किया।
DLosc

अमान्य, फ़ंक्शन या पूर्ण प्रोग्राम (इनपुट लेने वाला एक) होना आवश्यक है
ASCII-only


2

सीजेएम, 11 बाइट्स

NS/{:~2bc}/

S CJam में कानूनी चर नाम नहीं है, इसलिए मैंने इसके बजाय N को चुना ।

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

उदाहरण चलाते हैं

$ cjam <(echo '
> "1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100"
> :N;
> NS/{:~2bc}/
> '); echo
Hello World

यह काम किस प्रकार करता है

NS/            " Split N at spaces.                            ";
   {     }/    " For each chunk:                               ";
    :~         "   Evaluate each character ('0' ↦ 0, '1' ↦ 1). ";
      2b       "   Convert from base 2 array to integer.       ";
        c      "   Cast to character.                          ";

2

हास्केल - 48 (+13 आयात (?))

यहां हास्केल में मेरा पहला गोल्फ प्रयास है।

map(chr.foldl1((+).(*2)).map digitToInt)$words s

आपको Data.Char आयात करने की आवश्यकता है

उपयोग (ghci में):

Prelude> :m +Data.Char
Prelude Data.Char> let s = "1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100"
Prelude Data.Char> map(chr.foldl1((+).(*2)).map digitToInt)$words s
"Hello World"

स्पष्टीकरण:

map(chr.foldl1((+).(*2)).map digitToInt)$words s
                                        $words s -- split s on spaces into a list
                         map digitToInt          -- convert each digit in input string to int
              ((+).(*2))                         -- a function that multiplies its first 
-- argument by 2, then adds the second argument
        foldl1((+).(*2)).map digitToInt          -- fold the above over the list of ints: 
-- in other words this is a function that reads strings as binary and gives the value as int
   (chr.foldl1((+).(*2)).map digitToInt)         -- cast to character
map(chr.foldl1((+).(*2)).map digitToInt)$words s -- map our function over the list of words

उम्मीद है कि मैंने आयात के संबंध में सही तरीके से सम्मेलनों का पालन किया है। अगर मैंने नहीं किया है तो एक सुधार में संपादित करने के लिए स्वतंत्र महसूस करें। मैंने ": m + Data.Char" को घी में 13. के रूप में आयात करने की आवश्यकता का इलाज किया
बॉलस्टा

1

जीएनयू सैड, 19 बाइट्स

एक उत्कृष्ट @Digital ट्रॉमा उत्तर से प्रेरित ।

golfed

s/\w*/dc -e2i&P;/eg

परीक्षा

echo 1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100|\
sed 's/\w*/dc -e2i&P;/eg'

Hello World

1

पायथ, 7 बाइट्स (गैर-प्रतिस्पर्धात्मक)

smCid2c

इनपुट को स्ट्रिंग के रूप में लेता है।

कोशिश करो!


गैर-प्रतिस्पर्धी चिह्नित क्योंकि भाषा चुनौती से नई है।
mbomb007

1

05AB1E , 4 बाइट्स (गैर-प्रतिस्पर्धात्मक)

सहेजे गए 3 बाइट्स @Emigna की बदौलत

#CçJ

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


1
#CçJभी काम करता है। हालांकि इस और आपके संस्करण दोनों में आपको ð¡इसके बजाय आवश्यकता होती है #यदि इनपुट केवल 1 चार्ट हो सकता है।
एमिग्ना
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.