সেক্স বব-ওম্বসের জন্য হিসাবরক্ষণ (চলমান যোগফল কখনও খুব কম হয় কিনা তা পরীক্ষা করুন)


15

বিশ্বাস করুন বা না করুন, সেক্স বব-ওম্বস একটি বিশ্বখ্যাত ব্যান্ডে পরিণত হয়েছে এবং বর্তমানে বিশ্ব ভ্রমণে রয়েছে! তাদের বুককিপার হিসাবে আপনাকে অবশ্যই তাদের প্রতিদিনের অর্থের তদারকি করতে হবে এবং নিয়মিত প্রতিবেদন সরবরাহ করতে হবে।

প্রতি কয়েক সপ্তাহে আপনি তাদের ব্যয়ের ক্রম অনুসারে তাদের ব্যয়ের একটি তালিকা (পুরো মার্কিন ডলারে ) সংকলন করুন ।

উদাহরণস্বরূপ, তালিকা

378
-95
2234

এর অর্থ হল যে তাদের অ্যাকাউন্টে 8 378 জমা ছিল এবং তার পরে 95 ডলার উত্তোলন করা হয়েছিল এবং তার পরে 2234 ডলার জমা হয়েছিল।

আপনি নিশ্চিত করতে চান যে এই মানগুলির চলমান যোগফল কখনও কখনও কিছু প্রান্তিক মান টি এর নীচে যায় না । আপনার জন্য এটি করার জন্য আপনি কোনও প্রোগ্রাম লেখার সিদ্ধান্ত নিয়েছেন।

চ্যালেঞ্জ

একটি প্রোগ্রাম বা ফাংশন লিখুন যা একক পূর্ণসংখ্যার টি এবং পূর্ণসংখ্যার একটি তালিকা নেয় । যদি পূর্ণসংখ্যার তালিকার চলমান যোগফল টি এর চেয়ে কম হয় , তবে মিথ্যা মানটি মুদ্রণ করুন বা প্রত্যাবর্তন করুন, অন্যথায় সত্যতা মান মুদ্রণ করুন বা প্রত্যাবর্তন করুন।

আপনি যে কোনও সাধারণ ইনপুট পদ্ধতি ব্যবহার করতে পারেন (স্টিডিন, ফাইল, কমান্ড লাইন, আর্গুমেন্ট থেকে ফাংশন)।

  • তালিকার শুরুতে চলমান যোগফল 0 হয় a সুতরাং একটি ধনাত্মক টি মানে ফলাফল সর্বদা মিথ্যা।
  • + ইতিবাচক পূর্ণসংখ্যার সামনে কখনও হবে না।
  • তালিকায় 0 থাকতে পারে।
  • তালিকাটি খালি থাকতে পারে।

পরীক্ষার কেস

এই সকলের মধ্যে টি -৫ হয়।

Falsy:

-6
1
2
3
-20
200
-300
1000

Truthy:

[empty list]
-5
4
-3
-6

স্কোরিং

সবচেয়ে কম বাইটস সহ জমাটি জয়লাভ করে। টাইব্রেকার প্রথম পোস্ট জমা দেওয়া যায়।

আফসোসযোগ্য মন্তব্য যা আমাকে এটি করতে বাধ্য করেছিল।


1
পরীক্ষার ক্ষেত্রে টি = 5, এল = [10] প্রয়োজন। সম্ভবত আমি বিন্দুটি পুরোপুরি মিস করেছি
edc65

1
@ edc65 "তালিকার শুরুর চলমান সমষ্টি 0. (ফলে একটি ইতিবাচক টি মানে ফলাফলের সবসময় falsy হয়।)"
মার্টিন Ender

@ অপ্টিমাইজার দুঃখ করবেন না, আমি আপনার রেফারেন্স পেয়েছি <3
আন্ডারগ্রাউন্ডোমোরিয়েল

নিবন্ধন করুন এবং সেখানে একটি লিঙ্ক আছে।
অপ্টিমাইজার

উত্তর:


2

জিএস 2 - 6 বাইট

ধরুন তালিকাটি স্ট্যাকের শীর্ষে রয়েছে এবং প্রান্তিকেরটি রেজিস্ট্রার এ-তে রয়েছে স্মৃতিবিদ্যায়:

inits
sum get-a lt filter3
not

বাইটকোডে:

78 64 D0 70 F2 22

এটি কি আসলে জিএস 2 এর সমতুল্য? মূলত, আপনি কি আপনার অনুমানকে আরও কিছুটা ন্যায়সঙ্গত করতে পারেন? (আপনি যদি তা করেন তবে আমি সম্ভবত তা গ্রহণ করব))
ক্যালভিনের

জিএস 2 এর আসলে ফাংশন নেই, তবে আপনি একটি ব্লকে কিছু কোড রাখতে পারেন, স্ট্যাকের উপরে এটিকে চাপ দিতে পারেন এবং গল্ফস্ক্রিপ্টের মতো এটিতে ইভিয়াল কল করতে পারেন। যদি আপনি এই ছয়টি বাইটকে একটি ব্লকে রেখে দেন এবং আমি বর্ণিত পরিস্থিতিতে এগুলি ব্যাখ্যা করি তবে স্ট্যাকের উপরে থাকা তালিকাটি উত্তর দিয়ে প্রতিস্থাপিত হবে (0 মিথ্যা জন্য, সত্যের জন্য 1)। একইভাবে আপনি যদি এই কোডটি এমন কিছু কোডের সাথে উপসর্গ করেন যা একটি তালিকার দিকে ঠেলে দেয় এবং এটিকে রেজিস্ট্রেশন করার জন্য একটি থ্রোসোল্ড বরাদ্দ করে, আপনি সঠিক ফলাফল পাবেন।
লিন 17

এটি অন্যান্য সমাধানগুলির মতো সুন্দরভাবে কাজ করে। initsমধ্যে Haskell মত হল: "abcd" inits["" "a" "ab" "abc" "abcd"]আমাদের সব উপসর্গ পায়। তারপরে আমরা তিনটি কমান্ডের একটি "ল্যাম্বদা" দিয়ে ফিল্টার করি যা __ __ __ F2বাইটোকোডে রয়েছে: আমরা সমস্ত উপসর্গ সন্ধান করি যার সমষ্টি যা আছে তার চেয়ে কম A। তারপরে notতালিকাটি খালি কিনা তা নির্ধারণ করে।
লিন

11

হাস্কেল, 22 বাইট

f t=all(>=t).scanl(+)0

ব্যবহার: f (-5) [4,-3,-6]যা আউটপুট True

উপ-মোটের একটি তালিকা তৈরি করুন এবং সমস্ত উপাদান> = টি কিনা তা পরীক্ষা করুন।

সম্পাদনা করুন: খালি তালিকা এবং ধনাত্মক tএর জন্য বাগফিক্স


@ মার্টিনবাটনার: প্রাথমিক 0তালিকায় নেই, scanl1খালি তালিকার সাথে যদি খাওয়ানো হয় তবে খালি তালিকাটি ফেরত দেয়, তবে allসেই ক্ষেত্রে ধরা পড়ে । f (-5) []আয় True
নিমি

@ মার্টিনবাটনার: ওফস, আপনি ঠিক বলেছেন। এই মামলাটি মিস করেছেন এবং এটি ঠিক করেছেন। ধন্যবাদ!
নিমি

7

পাইথন 2, 41

f=lambda a,t:t<=0<(a and f(a[1:],t-a[0]))

প্রথম যুক্তি অ্যারে হয়; দ্বিতীয়টি সর্বনিম্ন চলমান মোট।


6

জে, 11 বাইট

   */@:<:0,+/\

টেস্ট

   _5 (*/@:<:0,+/\)  1 2 3 _20
0
   _5 (*/@:<:0,+/\)  >a: NB. empty list
1

FUZxxl ধন্যবাদ 1 বাইট উন্নতি ।

মূল সংস্করণটির জন্য ব্যাখ্যা (*/@(<:0,+/\))

  • +/\একটি চলমান যোগফল তৈরি করে ( +/উপসর্গের যোগফল \)
  • 0,+/\ চলমান যোগফলকে 0 যুক্ত করে
  • (<:0,+/\)বাম দিকে ইনপুট ছোট বা সমান <:(এর উপাদান) তুলনায় ফল 0,+/\ডান দিকে ইনপুটের
  • @ পূর্ববর্তী ফলাফল সহ
  • */ সমস্ত উপাদানগুলির পণ্য (1 উপাদানগুলির 1 টি যদি 0 হয় তবে একটি উপাদান 0 হয়)

*/@:<:0,+/\ আমার মনে হয় এমন একটি চরিত্রের জন্য আপনি এটি করতে পারেন ।
FUZxxl

6

APL, 8 10

∧.≤∘(0,+\)

এটি এমন একটি ফাংশন যা Tতার বাম আর্গুমেন্ট এবং তালিকাটিকে তার ডান আর্গুমেন্ট হিসাবে গ্রহণ করে।

  • 0,+\: 0 টিতে যুক্ত ডান যুক্তির চলমান যোগফল
  • ∧.≤: ডান আর্গুমেন্টে সমস্ত (∧) আইটেমের চেয়ে বাম আর্গুমেন্ট ছোট বা সমান (≤)

আমি এটিও চেষ্টা করেছিলাম তবে, "সুতরাং ইতিবাচক টি মানে ফলাফল সর্বদা মিথ্যা।"
জিমি 23013

@ ব্যবহারকারী23013: এটি অভিশাপ। ঠিক আছে, এটি এখন ঠিক আছে তবে এটি জিতবে না।
মেরিনাস

4

গণিত, 34 বাইট

FreeQ[Accumulate@{0,##2},n_/;n<#]&

এটি একটি নামবিহীন ভেরিয়াদি ফাংশন সংজ্ঞায়িত করে যা Tপ্রথম প্যারামিটার হিসাবে এবং লেনদেনকে বাকী প্যারামিটার হিসাবে গ্রহণ করে এবং একটি বুলিয়ান দেয়:

FreeQ[Accumulate@{0,##2},n_/;n<#]&[-5, 1, 2, 3, -20]
(* False *)

আমি এটি পছন্দ করি কারণ আমি বরং বিরল ##2যা তালিকার দ্বিতীয় থেকে সমস্ত যুক্তি "স্প্লেট" ব্যবহার করতে পারি । আরও তথ্যের জন্য এই গল্ফিং টিপটির শেষ বিভাগটি দেখুন ।


4

কে, 8 চর

প্রথম আর্গুমেন্ট হিসাবে এবং দ্বিতীয় হিসাবে তালিকা হিসাবে প্রান্তিক ক্রিয়া একটি ডায়াডিক ক্রিয়া। লক্ষণীয়ভাবে, এটি ও-সোর্স কোনা সহ কে-এর প্রতিটি সংস্করণে কাজ করে।

&/~0<-\,

কে-তে, ফাংশনগুলির রচনা কেবল একটি লিখে অন্যটির দ্বারা সম্পন্ন করা হয়, সুতরাং আমরা এটি ফাংশন দ্বারা বিচ্ছেদ করতে পারি। ডান থেকে বাম:

  • -\,ধারাবাহিকভাবে চলমান পরিমান গ্রহণ করে এবং সেগুলি প্রান্তিকর থেকে বিয়োগ করে। (যদি fডায়াডিক হয় তবে f\ (a; b; c; ...) প্রসারিত হয় (a; a f b; (a f b) f c; ...), শুধুমাত্র একসঙ্গে তালিকা যোগদান করে।) ব্রেকিং এমনকি ঘটে যখন কিছু 0 সমান, এবং overdrawing কঠোরভাবে ইতিবাচক মান দেয়।
  • ~0<0 কম-চেয়ে কম হয়। কে-তে আসলে-ও-বা-সমান-সমান <=অপারেটর নেই, সুতরাং আমাদেরকে বুলিয়ান নট-এর চেয়ে কম নিক্ষেপ করতে হবে, তবে ফলাফলটি অ-সংবেদনশীল কিনা তা এই পরীক্ষাগুলি। এটি স্বয়ংক্রিয়ভাবে তালিকার প্রতিটি পরমাণুতে প্রযোজ্য।
  • &/যৌক্তিক এবং একটি তালিকার উপরে ভাঁজ হয়। ( fডায়াডিকের জন্য) সুতরাং তালিকার প্রতিটি বুলিয়ান সত্য কিনা তা পরীক্ষা করে।

উদাহরণ:

  (&/~0<-\,)[-5; 1 2 3 -20]
0
  f:&/~0<-\,  /assign to a name
  f[-5; 4 -3 -6]
1

আমি সম্ভবত প্যারান্থেসিসের জন্য 2 টি অক্ষর যুক্ত করব। এবং আপনি যদি করেন তবে 1 টি ~|/>+\,
চাঁচা

@ স্মার্টিন মোনাডিক >"সাজানো ক্রমানুক্রম " হ'ল তাই ~|/>+\,কেবল সত্য হয় যখন ইনপুট তালিকাটি খালি থাকে ...
অ্যালগরিদমশর্ক

আহ তুমি ঠিক আছ, আমার ভুল
tmartin


3

পাইথ, 16 15

!sm>vzs+0<QdhlQ

ইনপুট দিয়ে এটি অনলাইনে চেষ্টা করুন

-5
[4, -3, 6]

ব্যাখ্যা:

                   Implicit: z and Q read 2 line from input
                   z = "-5" (this is not evaluated, it's a string)
                   Q = [4, -3, 6] (this is a list though)
 m         hlQ     map each number d in [0, 1, 2, ..., len(Q)] to:
  >vz                 the boolean value of: evaluated z > 
     s+0<Qd                                 the sum of the first d elements in Q 
!s                  print the boolen value of: 1 > sum(...)

এবং আবার বোকা sফাংশন দুটি বাইট নষ্ট করে। আমি মনে করি আমি এটি পাইথ রেপোতে বাগ হিসাবে রিপোর্ট করব।

সম্পাদনা করুন: 13 (বৈধ নয়)

এক বাইট সাশ্রয় ( >1টু !) করার জন্য এবং পাইথ রেপোতে বাস্তবায়ন পরিবর্তন করার জন্য আইসএএকেগকে ধন্যবাদ s। এখন নিম্নলিখিত কোডটি সম্ভব (তবে অবশ্যই এই চ্যালেঞ্জের জন্য বৈধ নয়)।

!sm>vzs<QdhlQ

আমি এগুলি প্রায়শই ব্যবহার করি। এখানে দেখুন: কোডগলফ.স্ট্যাকেক্সচেঞ্জ / প্রশ্ন / 45264 / fill-in-the-blanks/… । এটি এক্ষেত্রে 2 টি অক্ষর বাঁচাতে পারে তবে তালিকার কেসের তালিকায় 5 টি অক্ষর হারাবে। আমি দেখতে পাচ্ছি যদি একটি অব্যবহৃত চিঠি আছে তবে এগুলি দুটি আলাদা ফাংশনে আলাদা করতে হবে। এছাড়াও, আপনি !পরিবর্তে ব্যবহার করে একটি অক্ষর সংরক্ষণ করতে পারে >1
isaacg

@ আইস্যাকগ 0 (প্রায়) হিসাবে খালি তালিকার যোগফলকে সংজ্ঞায়িত করে কোনও বিদ্যমান পাইথ কোড ভাঙবে না। এটি কেবলমাত্র কোডটি ভঙ্গ করবে #sY। এবং 1 বাইট সংরক্ষণের জন্য ধন্যবাদ।
জাকুবে

আমি মনে করি এটি ন্যায়সঙ্গত - ব্যতিক্রম ছোঁড়া কাউকে সাহায্য করে না। সংশোধন করা হয়েছে।
isaacg


3

জুলিয়া, 33 বাইট

(T,l)->all(i->i>=T,cumsum([0,l]))

এটি একটি নামহীন ফাংশন তৈরি করে যা দুটি পরামিতি গ্রহণ করে Tএবং l, এবং একটি বুলিয়ান দেয়।

all()ফাংশন ভারী উত্তোলন সব এখানে আছে। এটি দুটি আর্গুমেন্ট লাগে: একটি প্রাকটিক এবং একটি পুনরাবৃত্তিযোগ্য। ভবিষ্যদ্বাণীকের জন্য, আমরা এটি বলি যা iদ্বারা চিহ্নিত নির্দিষ্ট নামবিহীন ফাংশন ব্যবহার করে পুনরাবৃত্তের বর্তমান মানকে উপস্থাপন করে i->। তারপর প্রতিটি পুনরাবৃত্তির আমরা তুলনা iকরতে Tব্যবহার i>=T

জুলিয়া কোনও cumsum()খালি তালিকায় ব্যবহার না করে তা নিশ্চিত করার জন্য , আমরা সেখানে ব্যবহার করে একটি শূন্যটি পরীক্ষা করতে পারি [0, l]


3

উপস্থাপন করুন , 144 136 বাইট

এটি ছিল ... শক্ত ...

?
?(1- )v1+(1-
 ^    #       1) v #  -)1+(#
  v#         vv (##^v^+
   ^?+     v-(0## ^ #   01 #)(#)#
1         v#                  # )!

আমি মনে করি 6 টি ভয়েস আমার জন্য একটি নতুন রেকর্ড, যদিও আমি নিশ্চিত যে এটি কমাতে এবং প্রচুর বিরক্তিকর সাদা স্থান থেকে মুক্তি পাওয়ার উপায় আছে। কোনও মানের সাইন পরীক্ষা করা (এবং সেইজন্য, একটির মান অন্যের চেয়ে বড় কিনা তা পরীক্ষা করা) প্রিলিওডে বেশ জটিল।

বাইট মান হিসাবে ইনপুট এবং আউটপুট দেওয়া হয়। আপনি যখন পাইথন দোভাষী ব্যবহার করেন , আপনি সেট করতে পারেন NUMERIC_OUTPUT = True, যাতে আপনি আসলে একটি ASCII পান 0বা 1। সংখ্যার ইনপুটটির জন্য, আপনাকে অন্য NUMERIC_INPUTপতাকা যুক্ত করতে হবে (আমার সম্ভবত আমার টুইটযুক্ত দোভাষীটি কিছু সময় প্রকাশ করা উচিত)।

আরও মনে রাখবেন যে প্রিলিওডটি তালিকার 0মধ্যে থাকা একটি তালিকা থেকে আসলেই শেষের পার্থক্যটি পার্থক্য করতে পারে না । সুতরাং শূন্য লেনদেনের অনুমতি দেওয়ার জন্য, আমি পড়ছি T, তারপরে তালিকার দৈর্ঘ্য Lএবং তারপরে Lলেনদেন।


2

সিজেম, 18 বাইট

অন্যটির মতো একই বাইটে অন্য একটি পন্থা।

q~_,),\f<1fb:)f<:&

আকারে STDIN এর মাধ্যমে ইনপুট নেয় <threshold> <array of transactions>

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


1
আমি মনে করি আপনি f>:|!পরিবর্তে ব্যবহার করতে পারবেন:)f<:&
অ্যাডিটসু প্রস্থান করুন কারণ এসই ইভিএল

2

জাভাস্ক্রিপ্ট (ES6) 38 33

স্থির প্রাথমিক ব্যালেন্স বাগ সম্পাদনা করুন । Thx @ মার্টিন & @rainbolt

F=(t,l)=>![r=0,...l].some(v=>(r+=v)<t)

টেস্ট সালে ফায়ারফক্স / ফায়ারবাগ কনসোলটি

console.log(F(-5,[-6]),F(-5,[1,2,3,-20]),F(-5,[200,-300,1000]))
console.log(F(-5,[]),F(-5,[-5]),F(-5,[4,-3,-6]))
console.log(F(5,[10]),F(5,[]))

মিথ্যা মিথ্যা মিথ্যা
সত্য সত্য সত্য
মিথ্যা মিথ্যা


2
প্রাথমিক ব্যালেন্স শূন্য। প্রথম আমানতটি 10, তবে প্রথম আমানত ব্যাংকে জমা দেওয়ার আগে আমরা ইতিমধ্যে আমাদের প্রান্তিকের নীচে।
রেইনবোল্ট

2

পাইথন 2.7 - 55 বাইট

f=lambda T,l:all(T<=sum(l[:i])for i in range(len(l)+1))

কল করুন print f(-5,[1,2,3,-20])। এটি এখানে পরীক্ষা করুন

সহায়তার জন্য জাকুবকে ধন্যবাদ।


2

> <>, 29 + 3 = 32 বাইট

r0}&v >1n;n0<
&:&:<+^?=1l ^?(

মত দৌড়ান

py -3 fish.py bookkeep.fish -v -5 4 3 -6

যেখানে প্রান্তিকের প্রথম সংখ্যা।



1

পার্ল 6 (21 বাইট)

{$^a>none [\+] 0,@^b}

এটি প্রাথমিক যুক্তি এবং উপাদানগুলির তালিকা গ্রহণ করে এমন একটি ফাংশন। এটি উপাদানগুলির কোনও ( জংশন ব্যবহার করে ) প্রান্তিকের নীচে না রয়েছে কিনা তা পরীক্ষা করে কাজ করে । [\+], দৌড়ানো সমষ্টি জেনারেট করার জন্য ব্যবহৃত উদাহরণস্বরূপ হয় [\+] 1, 2, 3দেয় 1, 3, 60,সংযোজন0তালিকার শুরুতে করা প্রয়োজন কারণ ইতিবাচক প্রান্তিকর সর্বদা ব্যর্থ হওয়া উচিত।

হাস্যেল সমাধান হিসাবে খুব একই জিনিস, ঠিক পার্ল 6 সিনট্যাক্সে (পার্ল 6 হাস্কেল থেকে অনেক ঝরঝরে প্রোগ্রামিং বৈশিষ্ট্য নিয়েছে) took


0

পার্ল - 20

সংখ্যা তালিকা নিন STDINনতুন লাইন দিয়ে seperated এবং নিতে Tসঙ্গে -iপতাকা।

die if$^I>($i+=$_)

+2 এর জন্য -iএবং -nপতাকাগুলি। প্রস্থান মূল্য হয়255 ব্যর্থতার জন্য এবং0 সাফল্যের জন্য।

সাথে চালান:

echo -e "4\n3\n-6" | perl -i0 -ne'die if$^I>($i+=$_)'

0

ক্লোজার, 45

(fn[T t](every? #(<= T %)(reductions + 0 t)))

যেমন

((fn[T t](every? #(<= T %)(reductions + 0 t))) -5 [1 2 3 -20])
;; =>false

বা একটি লিল 'ভাল;

(defn f[T t](every? #(<= T %)(reductions + 0 t)))

(testing
  (testing "tests from question"
    (is (false? (f -5 [-6])))
    (is (false? (f -5 [1 2 3 -20])))
    (is (false? (f -5 [200 -300 1000])))
    (is (true? (f -5 [-5])))
    (is (true? (f -5 [4 -3 -6])))
    (is (true? (f -5 []))))
  (testing "the start of the list the running sum is 0. So a positive T means the result is always falsy"
    (is (false? (f 5 [5])))
    (is (false? (f 5 [10])))
    (is (false? (f 5 [])))))

0

জাভা 8 - 153 অক্ষর

গল্ফড ফাংশন:

import java.util.stream.*;
boolean f(int t, IntStream s){int r=1;try{s.reduce(0,(a,b)->(a+b>=t)?(a+b):(a/(a-a)));}catch(Exception e){r=0;}return r==1;} 

Ungolfed:

import java.util.stream.*;

boolean f(int t, IntStream s) {
    int r=1;
    try {
        s.reduce(0,(a,b) -> (a+b>=t) ? (a+b) : (a/(a-a)));
    } catch(Exception e) {
        r=0;
    }

    return r==1;
} 

ড্রাইভার প্রোগ্রাম:

import java.util.stream.*;
import java.util.*;

public class A {
    // function f as above

    public static void main(String... args) {
        int t = -5;
        IntStream s = null;

        s = Arrays.asList(-6).stream().mapToInt(i->i);
        System.out.println(new A().f(t,s));

        s = Arrays.asList(1,2,3,-20).stream().mapToInt(i->i);
        System.out.println(new A().f(t,s));

        s = Arrays.asList(200,-300,1000).stream().mapToInt(i->i);
        System.out.println(new A().f(t,s));

        System.out.println("above false, below true");

        s = IntStream.empty();
        System.out.println(new A().f(t,s));

        s = Arrays.asList(4,-3,-6).stream().mapToInt(i->i);
        System.out.println(new A().f(t,s));

        s = Arrays.asList(-5).stream().mapToInt(i->i);
        System.out.println(new A().f(t,s));
}

}

আউটপুট:

bash-3.2$ javac A.java ; java A

false
false
false
above false, below true
true
true
true
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.