দাঁড়াও, এটা কোন ভাষা?


37

সম্প্রতি আমার কাছে হাসকল প্রোগ্রাম লিখে আনন্দিত হয়েছিল যা এই NegativeLiteralsএক্সটেনশনটি নিযুক্ত ছিল কিনা তা সনাক্ত করতে পারে । আমি নিম্নলিখিত নিয়ে এসেছি:

data B=B{u::Integer}
instance Num B where{fromInteger=B;negate _=B 1}
main=print$1==u(-1)

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

এটি Trueসাধারণত এবং Falseঅন্যথায় মুদ্রণ করবে ।

এখন আমি এটি করতে অনেক মজা পেয়েছি আমি আপনার সবার কাছে চ্যালেঞ্জটি প্রসারিত করছি। আর কি কি হাস্কেল ভাষার এক্সটেনশনগুলি ক্র্যাক করতে পারে?

বিধি

একটি নির্দিষ্ট ভাষা বর্ধনের ক্র্যাক করতে আপনার অবশ্যই একটি হাস্কেল প্রোগ্রাম লিখতে হবে যা ভাষা এক্সটেনশন সহ এবং এর বাইরে উভয়ই সংকলন করে (সতর্কতা ভাল) এবং ভাষা এক্সটেনশনের সাথে চলাকালীন দুটি পৃথক অ-ত্রুটিযুক্ত মানকে আউটপুট করে দেয় এবং ( Noউপসর্গটি যোগ করে এটি বন্ধ করে দেওয়া হয়) ভাষা সম্প্রসারণ)। এইভাবে উপরের কোডটি কেবল সংক্ষিপ্ত করা যেতে পারে:

data B=B{u::Integer}
instance Num B where{fromInteger=B;negate _=B 1}
main=print$u(-1)

যা প্রিন্ট 1এবং -1

আপনি কোনও এক্সটেনশন ক্র্যাক করার জন্য যে কোনও পদ্ধতি ব্যবহার করেন তা অবশ্যই সেই এক্সটেনশনের সাথে সুনির্দিষ্ট। যেকোন সংকলক পতাকা বা ল্যাঙ্গুয়েজ এক্সটেনশানগুলি সক্ষম করা হয়েছে তা নির্বিচারে সনাক্ত করার উপায় থাকতে পারে, যদি এ জাতীয় পদ্ধতির অনুমতি না দেওয়া হয়। আপনি -Oআপনার বাইট গণনায় বিনা ব্যয়ে অতিরিক্ত ভাষা এক্সটেনশন সক্ষম করতে বা সংকলক অপ্টিমাইজেশন পরিবর্তন করতে পারেন।

ভাষার বর্ধন

আপনি যে একটি নেই কোনো ভাষা এক্সটেনশন ফাটল না পারেন Noসহযোগীর (যেমন Haskell98, Haskell2010, Unsafe, Trustworthy, Safe) কারণ এই রূপরেখা উপরোক্ত শর্তাবলী আওতায় পড়ে না। অন্য প্রতিটি ভাষার বর্ধন সুষ্ঠু খেলা।

স্কোরিং

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

আপনি প্রথম জমা দেওয়ার জন্য কোনও পয়েন্ট অর্জন করতে সক্ষম হবেন না NegativeLiteralsবা QuasiQuotesকারণ আমি ইতিমধ্যে এগুলিকে ক্র্যাক করে পোস্টের শিরোনামে অন্তর্ভুক্ত করেছি। তবে আপনি এগুলির প্রত্যেকের স্বল্পতম ক্র্যাকের জন্য একটি পয়েন্ট অর্জন করতে সক্ষম হবেন। এখানে আমার ক্র্যাকQuasiQuotes

import Text.Heredoc
main=print[here|here<-""] -- |]

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


3
আমি মনে করি এটি সমস্ত বৈধ বিকল্পের একটি তালিকা
এইচপিউইজ

1
নোট করুন যে আমার উপরের মন্তব্যটি NondecreasingIndentationসুস্পষ্ট কারণে অন্তর্ভুক্ত নয়
এইচ.পি.উইজ

4
আমি মনে করি এই শিরোনামটি বিভ্রান্তিমূলক, আপনি যে ভাষা ব্যবহার করতে পারবেন তা হ্যাস্কেল। কীভাবে Wait, what language extension is this?বা সম্পূর্ণ আলাদা কিছু।
এমডি এক্সএফ 25'18

1
আমি যথেষ্ট কৌতূহলবোধ করা সম্ভব যে এটি ক্র্যাক করা সম্ভব কিনা RelaxedPolyRec, কারণ আসলে এটি বন্ধ করে দেওয়ার পক্ষে যথেষ্ট প্রাচীন একটি সংকলক । (কোনও কিছু করা বন্ধ করার কয়েক বছর ধরে ডকুমেন্টেশন সহ বিকল্পটি ঘুরে দাঁড়িয়েছিল))
ডিফিউয়ার

1
@ ডিফিউয়ার এই টিকিটটি দেখে মনে হচ্ছে এটি জিএইচসি 6.12.1 সমর্থন করে এটি বন্ধ করে দিয়েছে।
janrjan জোহানসেন

উত্তর:


24

ম্যাজিকহ্যাশ, 30 বাইট

x=1
y#a=2
x#a=1
main=print$x#x

-এক্সম্যাগিকহ্যাশ আউটপুটস 1, -এক্সনম্যাগিকহ্যাশ আউটপুট 2

ম্যাজিকহ্যাশ পরিবর্তনশীল নামগুলিকে a এ শেষ করতে দেয় #। সুতরাং বর্ধনের সাথে, এটি দুটি ফাংশন সংজ্ঞায়িত করে y#এবং x#যা প্রত্যেকে একটি মান নেয় এবং একটি ধ্রুবককে ফিরিয়ে দেয় 2, বা 1x#x1 ফিরে আসবে (কারণ এটি x#প্রয়োগ করা হয় 1)

এক্সটেনশন ছাড়াই এটি একটি ফাংশন সংজ্ঞায়িত করে #যা দুটি আর্গুমেন্ট এবং রিটার্ন নেয় 2। এটি x#a=1এমন একটি প্যাটার্ন যা কখনও পৌঁছায় না। তারপর x#xহয় 1#1যা ফেরৎ 2,।


2
আমি এখন ডান্স ম্যাজিক ডান্সের সুরে এক্স ম্যাজিক হ্যাশ গাইছি । আমি আশা করি আপনি গর্বিত!
ট্রিগ

আমি অবাক হয়েছি যে MagicHashচলবে না এমন হ্যাশগুলিকে অনুমতি দেয় না। অদ্ভুত!
ডিফিউয়ার

18

সিপিপি, 33 20 বাইট

main=print$0-- \
 +1

ছাপে 0সঙ্গে -XCPPএবং 1সঙ্গে -XNoCPP

সহ -XCPP, একটি \নতুন লাইনের আগে একটি স্ল্যাশ নতুন লাইনটি সরিয়ে দেয়, সুতরাং কোডটি হয়ে যায় main=print$0-- +1এবং কেবলমাত্র এখনই মন্তব্যের অংশ 0হিসাবে এটি মুদ্রিত হয় +1

পতাকা ছাড়াই মন্তব্যটিকে উপেক্ষা করা হবে এবং দ্বিতীয় লাইনটি পূর্ববর্তী লাইনের অংশ হিসাবে পার্স করা হয়েছে কারণ এটি ইন্টেন্ট করা হয়েছে।


সাথে পূর্ববর্তী পদ্ধতি #define

x=1{-
#define x 0
-}
main=print x

এছাড়াও ছাপে 0সঙ্গে -XCPPএবং 1সঙ্গে -XNoCPP


2
ওহ godশ্বর, এখন অবধি আমি ভেবেছিলাম জিপিএইচসি সিপিপিতে যাওয়ার আগে হাস্কেল মন্তব্যগুলি সরিয়ে ফেলবে।
কিউবিক

@ কিউবিক এটি প্রাক- প্রসেসর নয়?
বার্গি

1
@ বার্গি শিওর, তবে প্রাক- প্রসেসরগুলি অগত্যা বোঝায় না যে "চালিত প্রথম জিনিস", বিশেষত যেহেতু জিএইচসিকে প্রগমা খুঁজে পেতে প্রথমে ফাইলটি পাস করতে হবে। আমার ধারণা, মন্তব্যগুলি তাই ডক মন্তব্যে এবং সিপিপি শেষ হওয়ার পরে অনুরূপ কাজ করা হয়।
কিউবিক


14

বাইনারিলিটারালস, 57 বাইট

b1=1
instance Show(a->b)where;show _=""
main=print$(+)0b1

-এক্সবাইনারিলিটারগুলি একটি একক নিউলাইন প্রিন্ট করে। -এক্সএনওবাইনারিলিটারগুলি প্রিন্ট করে a 1

আমি নিশ্চিত যে এটি করার আরও ভাল উপায় আছে। যদি আপনি একটি সন্ধান করেন তবে দয়া করে এটি পোস্ট করুন।


আপনি কেবল bএকটি ফাংশন হিসাবে সংজ্ঞা দিতে পারবেন না (সুতরাং কোনও বাইনারি হয় না b(0, 1), তবে বাইনারি হয় 0b1)?
NoOneIs এখানে

12

মনোমরফিজম রেস্ট্রিকশন + 7 অন্যান্য, 107 বাইট

এটি TH ব্যবহার করে যা সর্বদা পতাকা প্রয়োজন -XTemplateHaskell

টি.এইচএস, 81 + 4 বাইট ফাইল করুন

module T where
import Language.Haskell.TH
p=(+)
t=reify(mkName"p")>>=stringE.show

প্রধান, 22 বাইট

import T
main=print $t

পতাকার সাথে সংকলন মনোমরফিজমস্ট্রিস্ট্রিকেশনটির ধরণের pচাপ দেয় Integer -> Integer -> Integerএবং এভাবে নিম্নলিখিত আউটপুট উত্পাদন করে:

"VarI T.p (AppT (AppT ArrowT (ConT GHC.Integer.Type.Integer)) (AppT (AppT ArrowT (ConT GHC.Integer.Type.Integer)) (ConT GHC.Integer.Type.Integer))) Nothing"

NoMonomorphismRestriction পতাকার সাথে সংকলনp সর্বাধিক সাধারণ, যেমন টাইপ ছেড়ে যায় । Num a => a->a->a- এর মতো কিছু তৈরি করা ( VarTনামগুলি সংক্ষিপ্ত করে a):

"VarI T.p (ForallT [KindedTV a StarT] [AppT (ConT GHC.Num.Num) (VarT a)] (AppT (AppT ArrowT (VarT a)) (AppT (AppT ArrowT (VarT a)) (VarT a)))) Nothing"

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


বিকল্প

যেহেতু উপরের কোডটি কেবল pপ্রকারগুলি প্রিন্ট করে , তাই এটি সমস্ত পতাকা দিয়ে করা যেতে পারে যা কোনওভাবে হাস্কেল কীভাবে অনুকরণ করে তা প্রভাবিত করে। আমি কেবল পতাকাটি নির্দিষ্ট করব এবং কীটির সাথে ফাংশনটি প্রতিস্থাপন করতে হবে pএবং অতিরিক্ত ফ্ল্যাগের প্রয়োজন হলে (পাশাপাশি -XTemplateHaskell):

ওভারলোডেড তালিকাগুলি, 106 বাইট

অতিরিক্ত প্রয়োজন -XNoMonomorphismRestriction:

p=[]

হয় p :: [a]বা p :: IsList l => l, তাদের অনলাইনে চেষ্টা করুন!

ওভারলোডডস্ট্রিংস, 106 বাইট

অতিরিক্ত প্রয়োজন -XNoMonomorphismRestriction:

p=""

হয় p :: Stringবা p :: IsString s => s, তাদের অনলাইনে চেষ্টা করুন!

পলিকাইন্ডস, 112 বাইট

এটি সম্পূর্ণরূপে @ সেন্সরকিসের কারণে:

data P a=P 

হয় P :: P aবা P :: forall k (a :: k). P a, তাদের অনলাইনে চেষ্টা করুন!

মোনাড কমফেরেন্সেন্স, 114 বাইট

p x=[i|i<-x]

হয় p :: [a] -> [a]বা p :: Monad m => m a -> m a, তাদের অনলাইনে চেষ্টা করুন!

নামযুক্ত ওল্ডকার্ডস, 114 বাইট

এটি লাইকনি দ্বারা পাওয়া গেছে, এটি অতিরিক্তভাবে প্রয়োজন -XPartialTypeSignatures:

p=id::_a->_a

তাদের উভয়েরই সংরক্ষণের ধরণ রয়েছে ( p :: a -> a) তবে জিএইচসি ভেরিয়েবলগুলির জন্য আলাদা আলাদা নাম উত্পন্ন করে, অনলাইনে চেষ্টা করে দেখুন!

অ্যাপ্লিকটিভডো, 120 বাইট

p x=do i<-x;pure i

হয় p :: Monad m => m a -> m aবা p :: Functor f => f a -> f a, তাদের অনলাইনে চেষ্টা করুন!

ওভারলোডেড লেবেলস, 120 বাইট

এটি অতিরিক্ত পতাকা প্রয়োজন -XFlexibleContexts:

p x=(#id)x
(#)=seq

উভয় ক্ষেত্রেই যেমন ধরনের p :: a -> b -> bবা p :: IsLabel "id" (a->b) => a -> b, তাদের অনলাইন চেষ্টা করুন!


একই জাতীয় জিনিস অন্যান্য পতাকা জন্য কাজ করে?
এইচ.পি.উইজ

হ্যাঁ, আপনি এটির সাথে OverloadedStringsবা OverloadedListsনিশ্চিতভাবে এবং সম্ভবত অন্যরাও এটি করতে পেরেছিলেন ..
31

2

1
এছাড়াও এর সাথে কাজ করছে বলে মনে হয় NamedWildCards: এটি অনলাইনে চেষ্টা করুন! (প্রয়োজনীয় -XPartialTypeSignatures)
লাইকনি

10

সিপিপি, 27 25

main=print({-/*-}1{-*/-})

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

()জন্য -XCPPএবং 1জন্য প্রিন্ট-XNoCPP

পূর্ববর্তী সংস্করণ:

main=print[1{-/*-},2{-*/-}]

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

ছাপে [1]সঙ্গে -XCPPএবং [1,2]অন্যথায়।

ক্রেডিট: এটি লাইকোনির উত্তর দ্বারা অনুপ্রাণিত হয়েছে, তবে #defineএটির পরিবর্তে এটি কেবল সি মন্তব্য ব্যবহার করে।


9

স্কোপডটাইপ ভেরিয়েবলস, 162 113 বাইট

instance Show[()]where show _=""
p::forall a.(Show a,Show[a])=>a->IO()
p a=(print::Show a=>[a]->IO())[a]
main=p()

-XScopedTypeVariables প্রিন্ট ""(খালি), -XNoScopedTypeVariables প্রিন্ট "[()]"

সম্পাদনা করুন: মন্তব্যগুলিতে দরকারী পরামর্শের জন্য আপডেট সমাধানটি ধন্যবাদ


1
আহ আমি দেখি. আপনার কোডটি শরীরে অন্তর্ভুক্ত করার জন্য এটি সর্বোত্তম, তবে অলগ্পল সংস্করণগুলিও দুর্দান্ত। আমি এটিও লক্ষ্য করছি যে "T"কেবল এটির সাথে প্রতিস্থাপন করা যেতে পারে ""
গম উইজার্ড

2
আরেকটা জিনিস আপনি কি করতে পারেন আপনার ডাটাটাইপ প্রতিস্থাপন হয় Tসঙ্গে ()। এটি সংজ্ঞায়িত করা এড়াতে। এটি অনলাইন চেষ্টা করুন!
গম উইজার্ড

1
ভাল ধরা, আমি কেবল বুঝতে পেরেছিলাম যে অন্তর্হিত প্রগমা একটি পতাকা হিসাবে অন্তর্ভুক্ত করা যেতে পারে: এটি অনলাইনে চেষ্টা করুন!
সিংসোর কিস

2
অতিরিক্ত মুদ্রণেরshow জন্য পরিবর্তন করা যেতে পারে
এইচপিউইজ

এর জন্য ইউনিকোড সিনট্যাক্স forallআপনাকে কয়েকটি বাইট সংরক্ষণ করবে। আমি সন্দেহ করি যে অতিরিক্ত সমাধানগুলির যে কোনও সমাধানের জয়ের অনেক আশা রয়েছে।
dfeuer

9

MonoLocalBinds, GADTs, বা টাইপফ্যামিলিগুলি, 36 32 বাইট

সম্পাদনা করুন:

  • -4 বাইট: এর একটি সংস্করণ স্টেসয়েড দ্বারা দুর্দান্ত বহুভোজী চেইনে অন্তর্ভুক্ত করা হয়েছিল , যিনি সমস্ত ঘোষণাকে শীর্ষ স্তরে রেখে আমাকে বিস্মিত করেছিলেন। স্পষ্টতই এই বিধিনিষেধটি ট্রিগার করতে প্রকৃত স্থানীয় বাইন্ডিংয়ের প্রয়োজন হয় না ।
a=0
f b=b^a
main=print(f pi,f 0)
  • সঙ্গে কোনো এক্সটেনশান , এই প্রোগ্রামটি ছাপে (1.0,1)
  • XMonoLocalBinds , -XGADTs , বা -XTypeFamille এর পতাকাগুলির সাথে এটি মুদ্রণ করে (1.0,1.0)

  • MonoLocalBindsএক্সটেনশন কিছু unintuitive টাইপ অনুমান GADTs লিখুন পরিবার দ্বারা আলোড়ন সৃষ্টি রোধ করার জন্য বিদ্যমান। এই হিসাবে, এই এক্সটেনশানটি অন্য দুটি দ্বারা স্বয়ংক্রিয়ভাবে চালু হয়।

  • এটা তোলে হয় এটা বন্ধ করতে আবার সঙ্গে স্পষ্টভাবে সম্ভব -XNoMonoLocalBinds, এই কৌতুক আপনি না অনুমান।
  • মনমোর্ফিজম সীমাবদ্ধতার মতো আরও সুপরিচিত চাচাত ভাইয়ের মতো, MonoLocalBindsকিছু মানকে বাধা দেয় ( যেমন স্থানীয় বাঁধায় যেমন letবা সম্ভবত where, নামটি শীর্ষ স্তরেও ঘটতে পারে) বহুরূপী হওয়া থেকে বিরত থাকে। সানারের ধরণের অনুক্রমের জন্য তৈরি করা সত্ত্বেও, এটি কখন কার্যকর হয় তার নিয়মগুলি এমআর এর চেয়েও বেশি লোমশ।

  • যেকোনো এক্সটেনশন ছাড়া, উপরে প্রোগ্রাম infers টাইপ f :: Num a => a -> aযার ফলে f piএকটি থেকে ডিফল্ট Doubleএবং f 0একটি থেকে Integer

  • এক্সটেনশনগুলির সাথে, অনুমান করা টাইপটি হয়ে যায় f :: Double -> Doubleএবং পাশাপাশি f 0ফিরে আসতে হবে Double
  • পৃথক পরিবর্তনশীল a=0প্রযুক্তিগত নিয়ম আরম্ভ করা প্রয়োজন হয়: amonomorphism সীমাবদ্ধতা দ্বারা আঘাত করা হয়, এবং aএকটি হল বিনামূল্যে পরিবর্তনশীল এর f, যার মানে f'র বাঁধাই গ্রুপ নয় সম্পূর্ণরূপে সাধারণ , যার মানে fহয় না বন্ধ এবং এইভাবে বহুরুপী হত্তয়া না।

9

ওভারলোডেড স্ট্রিংস, 65 48 32 বাইট

RebindableSyntax এর সুবিধা গ্রহণ করে যে কোনও স্ট্রিংকে আক্ষরিক রূপান্তর করতে আমাদের স্ট্রিংয়ের নিজস্ব সংস্করণ ব্যবহার করুন "y"

main=print""
fromString _=['y']

সঙ্গে সংকলন করা আবশ্যক -XRebindableSyntax -XImplicitPrelude

-XOverloadedStringsপ্রিন্ট ছাড়া ""; কপি করে প্রিন্ট সঙ্গে "y"

এছাড়াও, এটি কেবলমাত্র আমাকে এখন আঘাত করেছে যে একই কৌশলটি (উদাঃ) ওভারলোডেড তালিকাগুলির সাথে কাজ করে:

ওভারলোডেড তালিকাগুলি, 27 বাইট

main=print[0]
fromListN=(:)

সঙ্গে সংকলন করা আবশ্যক -XRebindableSyntax -XImplicitPrelude

-XOverloadedListsপ্রিন্ট ছাড়া [0]; কপি করে প্রিন্ট সঙ্গে [1,0]


1
আপনি শেষ লাইনটি সংক্ষিপ্ত করতে পারেন fromString a=['y']
janrjan জোহানসেন

স্থানও print "n"বাদ পড়তে পারে।
লাইকনি

@ আরজান জোহানসেন ধন্যবাদ! আমি এটি সঙ্গে ব্যর্থ হয়েছে ="y", কিন্তু =['y']কাজ করে!
ফেলিক্সফেজু

1
দ্বিতীয় অপসারণ করতে পারেন nথেকেprint"n"
গমের উইজার্ড

1
আমদানি লাইন এড়াতে আপনি -XImplicitPreludeপরে ব্যবহার করতে পারেন RebindableSyntax
dfeuer

8

BangPatterns, 32 বাইট

(!)=seq
main|let f!_=0=print$9!1

-এক্সবাংপ্যাটার্নগুলি প্রিন্ট করে 1যখন -XNoBangPatterns প্রিন্ট করবে 0

এটি ব্যাগপ্যাটার্নস পতাকাটি ডাব্লুএইচএনএফকে !মূল্যায়ন করার জন্য জোর দিয়ে নিদর্শনগুলি বর্নিত করতে দেয় , সেই ক্ষেত্রে 9!1শীর্ষ স্তরের সংজ্ঞাটি ব্যবহার করবে তা ব্যবহার করে (!)=seq। পতাকাটি সক্ষম না থাকলে f!_একটি নতুন অপারেটর সংজ্ঞায়িত করে (!)এবং শীর্ষ-স্তরের সংজ্ঞাটি ছায়া দেয়।


7

অ্যাপ্লিকটিভডো, 104 বাইট

import Control.Applicative
z=ZipList
instance Monad ZipList where _>>=_=z[]
main=print$do a<-z[1];pure a

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

সাথে ApplicativeDo, এই মুদ্রণ

ZipList {getZipList = [1]}

এটি ছাড়া এটি প্রিন্ট করে

ZipList {getZipList = []}

ZipListবেস লাইব্রেরিতে কয়েকটি ধরণের মধ্যে একটি উদাহরণ রয়েছে Applicativeতবে এর জন্য নয় Monad। কোথাও লুকিয়ে থাকা সংক্ষিপ্ত বিকল্প থাকতে পারে।


7

কঠোর, 87 84 82 বাইট

-5 বাইট ধন্যবাদ ডিফিউয়ারকে !

BlockArgumentsআশেপাশে পেরেনগুলি সংরক্ষণের সাথে কম হতে পারে \_->print 1:

import Control.Exception
0!_=0
main=catch @ErrorCall(print$0!error"")(\_->print 1)

সঙ্গে এই চলমান -XStrict একটি ছাপে 1যেহেতু সঙ্গে এটি চলমান -XNoStrict একটি প্রিন্ট হবে 0। এটি হ্যাসেলকে ডিফল্টরূপে অলস এবং মূল্যায়ন করার প্রয়োজন হয় না error""কারণ এটি ইতিমধ্যে জানে যে ফলাফলটি 0যখন প্রথম যুক্তির সাথে মিলে যায় তখন (!)এই আচরণটি সেই পতাকাটির সাথে পরিবর্তিত হতে পারে - রানটাইমটিকে উভয় যুক্তির মূল্যায়ন করতে বাধ্য করে।

যদি কোনও ক্ষেত্রে কিছুই মুদ্রণের অনুমতি দেওয়া হয় তবে আমরা এটিকে মূল প্রতিস্থাপন 75 টি বাইটে নামিয়ে আনতে পারি (এছাড়াও ডিফিউয়ার দ্বারা কিছু বাইট বন্ধ ):

main=catch @ErrorCall(print$0!error"")mempty

স্ট্রাইকডাটা, 106 99 93 বাইট

-15 বাইট dfeuer ধন্যবাদ !

এটি মূলত একই কাজ করে তবে পরিবর্তে ডেটা ক্ষেত্রগুলির সাথে কাজ করে:

import Control.Exception
data D=D()
main=catch @ErrorCall(p$seq(D$error"")0)(\_->p 1);p=print

ছাপে 1সঙ্গে -XStrictData পতাকা এবং 0সঙ্গে -XNoStrictData

যদি কোনও ক্ষেত্রে কিছুই মুদ্রণের অনুমতি দেওয়া হয় তবে আমরা এটিকে মূল প্রতিস্থাপন করে 86 বাইটে নামিয়ে আনতে পারি ( ডিফিউয়ার দ্বারা 19 বাইট অফ ):

main=catch @ErrorCall(print$seq(D$error"")0)mempty

দ্রষ্টব্য: সমস্ত সমাধানের TypeApplicationsসেট প্রয়োজন ।


আপনি এটিকে 98 বাইটে খুব সহজেই কেটে ফেলতে পারেন যা আমার (খুব আলাদা) সমাধানের সাথে হুবহু মিলে যায়। Tio
ডিফিউয়ার

আসলে, আপনি আরও ভাল করতে পারেন: ব্যতিক্রম হ্যান্ডলারের মুদ্রণের পরিবর্তে, কেবল ব্যবহার করুন pure()
dfeuer

1
@ ডিফিউয়ার: দুর্দান্ত, D{}কৌশলটি দুর্দান্ত! :) এর PartialTypeSignaturesপরিবর্তে আরেকটি বন্ধ করে দিয়েছেন ScopedTypeVariables:)
ბიმო

1
@ ডিফিউয়ার: আমার একটি চেহারা ছিল এবং কয়েকটি জিনিস চেষ্টা করে দেখলাম, তবে আমি জেনারিক্স কখনও ব্যবহার করি নি, তাই আমি সম্ভবত সঠিক ব্যক্তি নই।
ბიმო

1
আপনি রক্তপাতের প্রান্ত জিএইচসি এবং এর থেকে আরও ভাল করতে পারেন -XBlockArguments:main=catch @ErrorCall(p$seq(D$error"")1)\_->p 3
ডিফিউয়ার

6

অ্যাপ্লিকটিভডো, 146 বাইট

newtype C a=C{u::Int}
instance Functor C where fmap _ _=C 1
instance Applicative C
instance Monad C where _>>=_=C 0
main=print$u$do{_<-C 0;pure 1}

প্রিন্ট করুন 1 যখন অ্যাপিটিটিভডড সক্ষম হয়, অন্যথায় 0

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


1
ধন্যবাদ! আহ, আমি মনে করি আমি জিএইচসি ("কোনও প্রয়োগকারী নয়" আমার সিস্টেমে একটি সতর্কতা ছিল) এর পুরানো সংস্করণে আছি
oisdk

3
ব্যবহার -XDeriveAnyClass আপনি লাভ করতে পারি Applicativeএবং Showরেকর্ড সিনট্যাক্স ব্যবহার সংরক্ষণ করতে, দেখুন এই
11

6

বাইনারিলিটারালস, 31 24 বাইট

সম্পাদনা:

  • -7 বাইট: এইচ.পি.উইজ একটি একক ব্যবহার করে এটিকে আরও সামঞ্জস্য করার পরামর্শ দিয়েছিল b12 ভেরিয়েবল ।

এইচ.পি.উইজের পদ্ধতিতে একটি সমন্বয় , ফাংশন উদাহরণটি এড়ানো।

b12=1
main=print$(+)0b12
  • সঙ্গে -XNoBinaryLiterals , 0b12যেমন lexes 0 b12, প্রিন্টিং 0 টি + 1 = 1
  • সঙ্গে -XBinaryLiterals , 0b12যেমন lexes 0b1 2, প্রিন্টিং 1 এবং 2 = 3

6

বর্ধিত ডিফল্টরুলস , 54 53 বাইট

instance Num()
main=print(toEnum 0::Num a=>Enum a=>a)

ছাপে ()সঙ্গে -XExtendedDefaultRulesএবং 0সঙ্গে -XNoExtendedDefaultRules

এই পতাকাটি জিএইচসিতে ডিফল্টরূপে সক্ষম হয়েছে, তবে জিএইচসিতে নয়, যা সম্প্রতি আমার জন্য কিছু বিভ্রান্তির কারণ হয়েছিল , যদিও বিএমও দ্রুত সাহায্য করতে সক্ষম হয়েছিল।

উপরের কোডটি জিএইচসি ব্যবহারকারী গাইডের উদাহরণের একটি গল্ফযুক্ত সংস্করণ যেখানে GHCi তে টাইপ ডিফল্ট ব্যাখ্যা করা হয়েছে explained

-1 বাইট ধন্যবাদ অর্জান জোহানসেনকে !


বহুগ্লোটে ধার করা এই কোডটি দেখার সময় (যেখানে প্রথম বন্ধনী কিছু সমস্যা দেয়), মনে পড়ে গেল যে জিএইচসি একটি বাইট সংক্ষিপ্ত বাক্য গঠন সমর্থন করে toEnum 0::Num a=>Enum a=>a
janrjan জোহানসেন

আপনার সাথে 48 বাইট নিচে এটা পেতে পারি PartialTypeSignatures: main=print(toEnum 0::_=>Num a=>a)। এছাড়াও, আপনার টিআইও লিঙ্কটি পুরানো।
dfeuer

6

রিবাইন্ডেবল সাইনট্যাক্স , 25 বাইট

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

main|negate<-id=print$ -1

এছাড়াও কোডে -XImplicitPreludeবা বিকল্পভাবে প্রয়োজন import Preludeহয়।

  • -XRebindableSyntax এটি পুনরায় সংজ্ঞায়িত করা সম্ভব করার জন্য হাস্কেলের কয়েকটি সিনট্যাকটিক চিনির আচরণ পরিবর্তন করে।
  • -1সিনট্যাকটিক চিনির জন্য negate 1
  • সাধারণত এটি negateহয় Prelude.negateতবে এক্সটেনশনের সাথে এটি " negateব্যবহারের পর্যায়ে যার মধ্যে সুযোগ রয়েছে", যা হিসাবে সংজ্ঞায়িত হয় id
  • যেহেতু এক্সটেনশানটি Preludeমডিউলটির প্রতিস্থাপন তৈরি করতে ব্যবহৃত হয়েছিল , এটি স্বয়ংক্রিয়ভাবে এর এর অন্তর্নিহিত আমদানিটি অক্ষম করে তবে অন্যান্য Preludeফাংশন (যেমন print) এখানে দরকার হয়, তাই এটি পুনরায় সক্ষম করা হয়েছে -XImplicitPrelude

6

কঠোর, 52 বাইট

import GHC.IO
f _=print()
main=f$unsafePerformIO$f()

-XStrict

-XNoStrict

সহ -XStrict, ()একটি অতিরিক্ত সময় প্রিন্ট করে ।

দুটি বাইটের জন্য @ শ্রীউইচিলিজম ওজাইককে ধন্যবাদ।


6

স্ট্রাইকডাটা, 58 বাইট

import GHC.Exts
data D=D Int
main=print$unsafeCoerce#D 3+0

(লিঙ্কগুলি কিছুটা পুরানো হয়েছে; ঠিক হয়ে যাবে))

-XNoStrictData

-XStrictData

প্রয়োজন MagicHash(আমাদের GHC.Extsপরিবর্তে আমদানি করতে দেওয়া Unsafe.Coerce) এবং-O (একেবারে প্রয়োজনীয়, ছোট কড়া ক্ষেত্রগুলি আনপ্যাকিং সক্ষম করতে)।

সহ -XStrictData, প্রিন্ট ৩. অন্যথায়, এর পূর্ব বরাদ্দকৃত অনুলিপিটির (সম্ভবত ট্যাগ করা) পয়েন্টারের পূর্ণসংখ্যা মান মুদ্রণ করে3::Integer , যা সম্ভবত 3 হতে পারে না।

ব্যাখ্যা

টাইপ ডিফল্টের উপর ভিত্তি করে সামান্য সম্প্রসারণের মাধ্যমে বোঝা আরও সহজ হবে। স্বাক্ষর সহ, আমরা সংযোজনটি বাদ দিতে পারি।

main=print
  (unsafeCoerce# D (3::Integer)
    :: Integer)

সমতুল্যভাবে,

main=print
  (unsafeCoerce# $
    D (unsafeCoerce# (3::Integer))
    :: Integer)

এটি কেন কখনও মুদ্রণ করে? অবাক লাগে! ভাল, ছোট Integerমান খুব পছন্দ মত প্রতিনিধিত্ব করা হয়Int s এর , যা (কড়া তথ্য সহ) ঠিক Dএস এর মতো উপস্থাপন করা হয় । আমরা পূর্ণসংখ্যাটি ছোট বা বড় ধনাত্মক / negativeণাত্মক কিনা তা নির্দেশ করে ট্যাগটিকে উপেক্ষা করে শেষ করি।

এটি এক্সটেনশন ছাড়া কেন 3 টি মুদ্রণ করতে পারে না? কোনও স্মৃতি বিন্যাসের কারণগুলি বাদ দিয়ে, 3 টির মধ্যে কম বিটগুলির সাথে একটি ডেটা পয়েন্টার (32-বিটের জন্য 2 সর্বনিম্ন, 3 lowest৪-বিটের জন্য 3 সর্বনিম্ন) অবশ্যই তৃতীয় কনস্ট্রাক্টর থেকে নির্মিত একটি মান উপস্থাপন করতে হবে। এই ক্ষেত্রে, এর জন্য একটি নেতিবাচক পূর্ণসংখ্যার প্রয়োজন হবে ।


5

আনবক্সডআপস, 52 বাইট tes

import Language.Haskell.TH
main=runQ[|(##)|]>>=print

প্রয়োজন -XTemplateHaskell। ছাপে ConE GHC.Prim.(##)সঙ্গে -XUnboxedTuples এবং UnboundVarE ##সঙ্গে -XNoUnboxedTuples


প্রয়োজনীয় বিকল্পের জন্য স্কোরটিতে অন্য +16 থাকা উচিত নয় -XTemplateHaskell?
celtschk

2
@celtschk আমি এটি গণনা করি নি কারণ কমান্ড লাইনের পতাকাগুলিতে বর্তমান মেটা sensকমত্য জানায় যে তারা গণনা করা হয়নি তবে পরিবর্তে একটি নতুন ভাষা গঠন করে। যদিও এটি সম্পর্কে চিন্তা করার পরে আমি দেখতে পাচ্ছি যে এই চ্যালেঞ্জের প্রসঙ্গে যা কেবলমাত্র হাস্কেলের জবাব দেয় তবে অন্যান্য পতাকা ব্যবহারের ক্ষেত্রে এটি কী হবে তা পুরোপুরি পরিষ্কার নয়। আমি ওপিকে এটি সম্পর্কে জিজ্ঞাসা করব।
লাইকনি

আমি জানতাম না যে এই বিষয়ে sensকমত্য পরিবর্তিত হয়েছে। পয়েন্টারের জন্য আপনাকে ধন্যবাদ। ওপিকে জিজ্ঞাসা করা অবশ্যই একটি ভাল ধারণা।
celtschk

5

ওভারলোডডলিস্ট, 76 বাইট

import GHC.Exts
instance IsList[()]where fromList=(():)
main=print([]::[()])

সঙ্গে -XOverloadedLists এটা ছাপে [()]। সঙ্গে -XNoOverloadedLists এটা ছাপে[]

এই অতিরিক্ত পতাকা প্রয়োজন: -XFlexibleInstances,-XIncoherentInstances


ওভারল্যাপিংয়ের উদাহরণ দিয়ে আপনি পালাতে পারেন।
dfeuer

5

HexFloatLiterals , 49 25 বাইট

-24 বাইট ধন্যবাদ আর্জন জোহানসেনকে।

main|(.)<-seq=print$0x0.0

ছাপে 0.0সঙ্গে -XHexFloatLiteralsএবং 0সঙ্গে -XNoHexFloatLiterals

টিআইওর কোনও লিঙ্ক নেই কারণ হেক্সফ্লাটলিটালগুলি জিএইচসি 8.4.1 এ যুক্ত করা হয়েছিল, তবে টিআইওতে গিগ 8.2.2 রয়েছে।


main|(.)<-seq=print$0x0.0আমদানি আড়াল করা এড়ানো।
janর্জন জোহানসেন

main|let _._=0=print$0x0.0বহুভক্তের পক্ষে যদিও আরও সহজ হতে পারে।
janrjan জোহানসেন

5

স্কোপডটাইপ ভেরিয়েবলস, 37 বাইট

main=print(1::_=>a):: a.a~Float=>_

এই প্রয়োজন UnicodeSyntax, PartialTypeSignatures, GADTs, এবং ExplicitForAll

এটি অনলাইনে চেষ্টা করুন (এক্সটেনশন ছাড়াই)

এটি অনলাইনে চেষ্টা করুন (এক্সটেনশন সহ)

ব্যাখ্যা

আংশিক ধরণের স্বাক্ষরগুলি কেবল বাইট সংরক্ষণ করতে হয়। আমরা তাদের মতো পূরণ করতে পারি:

main=print(1::(Num a, Show a)=>a):: a.a~Float=>IO ()

Scoped টাইপ ভেরিয়েবল সঙ্গে, aএ ধরণের 1সীমাবদ্ধ হতে aএ ধরণের main, যা নিজেই হতে সীমাবদ্ধ Float। স্কোপড টাইপ ভেরিয়েবল ছাড়া টাইপ 1করতে ডিফল্ট Integer। যেহেতু FloatএবংInteger মানগুলি আলাদাভাবে দেখানো হয়, তাই আমরা তাদের পার্থক্য করতে পারি।

পুরোপুরি 19 বাইটের জন্য @ janrjanJohansen কে ধন্যবাদ! তিনি বুঝতে পেরেছিলেন যে Showপৃথক সংখ্যার ধরণের উদাহরণগুলির মধ্যে পার্থক্যগুলির তুলনায় তাদের পাটিগণিতের পার্থক্যের চেয়ে সুবিধা নেওয়া আরও ভাল । তিনি আরও বুঝতে পেরেছিলেন যে main"সিনট্যাকটিক্যালি দ্বিধাদ্বন্দ্বী " ধরণটি ছেড়ে দেওয়া ঠিক ছিল কারণ প্রতিবন্ধকতা আসলে এটিকে অপসারণ করে। স্থানীয় ক্রিয়াকলাপ থেকে মুক্তি পেয়ে mainআরও পাঁচটি বাইট সংরক্ষণের জন্য টাইপ স্বাক্ষরটি (আরএইচএসে স্থানান্তরিত করে) সরিয়ে দেওয়ার জন্যও আমাকে মুক্ত করে ।



@ ØrjanJohansen, চমৎকার
ডিফিউয়ার

@ আরজান জোহেনসেন, আমি কি সম্পাদনা করা উচিত, না আপনি নিজের পছন্দ যুক্ত করতে চান?
dfeuer

সম্পাদনা করুন, এটি আপনার ক্রম থেকে বিবর্তন ছিল।
janrjan জোহানসেন

@ আরজান জোহানসেন, ধন্যবাদ, এটি সুন্দর ছিল।
dfeuer

5

ডেরিভ অ্যানি ক্লাস, 121 113 বাইট

বেশ কিছু বাইট জন্য dfeuer ধন্যবাদ !

import Control.Exception
newtype M=M Int deriving(Show,Num)
main=handle h$print(0::M);h(_::SomeException)=print 1

-XDeriveAnyClass প্রিন্ট করে 1যেখানে -XNoDeriveAnyClass প্রিন্ট করেM 0

এটি সত্যের অপব্যবহার করছে যে ডেরিভআইনি ক্লাস এবং জেনারেলাইজড নিউপ্রাইপডাইরিভিং উভয়ই সক্ষম হয়ে থাকলে, যেমন আপনি সতর্কতা থেকে দেখতে পাচ্ছেন ডেরিভএইনক্লাসই ডিফল্ট কৌশল। এই পতাকাটি সুখে সব পদ্ধতি ফাঁকা বাস্তবায়নের উত্পন্ন করবে কিন্তু GeneralizedNewtypeDeriving আসলে অন্তর্নিহিত টাইপ বাস্তবায়ন ব্যবহার করতে স্মার্ট যথেষ্ট এবং যেহেতু Intএকটি Numএটা এই ক্ষেত্রে খেলাফ করেন না।


mainনীচের দ্বারা পতাকাটি প্রতিস্থাপনের ক্ষেত্রে কিছু সক্ষম না করা থাকলে 109 বাইট হবে :

main=print(0::M)`catch`(mempty::SomeException->_)

কমপক্ষে runhaskell, অলসতার কারণে এটি প্রকৃতপক্ষে মুদ্রণ M 1করে -XDeriveAnyClass...
ঘড়ির

@ এসিডেটোটারনকাউটার ক্লকওয়াস: জিএইচসিতেও হ্যাঁ, তবে টিআইও (এবং আমার মেশিন) সংকলন করার পরে এবং এটি চালানোর ফলে ফলাফল হয় 1:)
ბიმო



1
আমি একে একে একে একে একে একে একে আলাদা করে নেওয়ার জন্য 104 এ নেমেছি, তাই আমি আমার নিজের উত্তর যুক্ত করেছি।
ডিফিউয়ার

4

পোস্টফিক্স অপেরেটর, 63 বাইট

import Text.Show.Functions
instance Num(a->b)
main=print(0`id`)

এটি অনলাইনে চেষ্টা করুন (এক্সটেনশন ছাড়াই)

এটি অনলাইনে চেষ্টা করুন (এক্সটেনশন সহ)

এটি আমি লিখেছি এমন একটি হাগস / জিএইচসি বহুবিবাহের একটি কাট ডাউন সংস্করণ । ব্যাখ্যার জন্য পোস্টটি দেখুন। আমি idচারটি বাইট সংরক্ষণ করে কাস্টম অপারেটরের পরিবর্তে ব্যবহার করতে পারি বুঝতে পেরে @ ØrjanJohansen কে ধন্যবাদ ।


idপরিবর্তে ব্যবহার করা যেতে পারে !
janrjan জোহানসেন

@ আরজান জোহেনসেন, হ্যাঁ! এটি একটি দুর্দান্ত চার বাইট সংরক্ষণ করে।
dfeuer




3

টেম্পলেটহ্যাসেল, 140 91 বাইট

ছোট পরিবর্তনগুলির সাথে সবেমাত্র মউকে থেকে অনুলিপি করা হয়েছে । আমি জানি না কি হচ্ছে।

-49 বাইটস ধন্যবাদ অর্জান জোহানসেনকে।

import Language.Haskell.TH
instance Show(Q a)where show _=""
main=print$(pure$TupE[]::ExpQ)

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


$(...)(কোনও স্থান নেই) হ'ল টিএইচ সক্ষম করা হলে টেমপ্লেট মূল্যায়ন সিনট্যাক্স এবং TupE[]("ফাঁকা টিপল") দেয় ()। বহুবিশেষের পক্ষে ব্যবহার করাShow ভালভাবে কাজ করতে পারে, যদিও এই বিশেষ চ্যালেঞ্জের জন্য আমি খালি স্ট্রিং হিসাবে মুদ্রণের জন্য কোনও মান নির্ধারণ করতে কিছুটা খারাপ অনুভব করি ...
janর্জন জোহানসেন

2

MonomorphismRestriction, 31 29 বাইট

সম্পাদনা:

  • এইচপিউইজের উন্নতি সহ -২ বাইট
f=(2^)
main=print$f$f(6::Int)

-XMonomorphismRestriction মুদ্রণ 0-XNoMonomorphismRestriction মুদ্রণ 18446744073709551616

  • সীমাবদ্ধতার সাথে, দুটি ব্যবহার fএকই ধরণের হতে বাধ্য হয়, সুতরাং প্রোগ্রামটি 2^2^6 = 2^6464-বিট Int(-৪-বিট প্ল্যাটফর্মগুলিতে) হিসাবে প্রিন্ট করে, যা এতে প্রবাহিত হয় 0
  • সীমাবদ্ধতা ছাড়াই, প্রোগ্রামটি 2^64একটি বিগনাম হিসাবে মুদ্রণ করে Integer

1
আমি মনে করি f=(2^);main=print$f$f(64::Int)একটি বাইট সংরক্ষণ করতে হবে। তবে এটি বাস্তবিকভাবে শেষ হবে না
এইচপিউইজ

@ এইচ.পি.উইজ ভাগ্যক্রমে 64=2^6, যা আরও একটি বাইট সংরক্ষণ করে।
janrjan Johansen

1

স্কোপডটাইপ ভেরিয়েবলস, 119 97 বাইট

ছোট পরিবর্তনগুলির সাথে সবেমাত্র মউকে থেকে অনুলিপি করা হয়েছে ।

স্কোপডটাইপভেরিয়েবলের জন্য বর্তমানে আরও দুটি উত্তর রয়েছে: সেন্সোর কিস দ্বারা 113 বাইট এবং ডিফিউয়ার দ্বারা 37 বাইট । এই জমাটি আলাদা যে এর জন্য অন্যান্য হাস্কেল এক্সটেনশনের প্রয়োজন হয় না।

-22 বাইটস ধন্যবাদ অর্জান জোহানসেনকে।

class(Show a,Num a)=>S a where s::a->IO();s _=print$(id::a->a)0
instance S Float
main=s(0::Float)

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


97 বাইট (যদিও IO()/printকৌশলটি বহুগ্লায় কাজ করবে না)।
janর্জন জোহানসেন

@ আরজানজোহানসেন আমি স্কোপডটাইপ ভেরিয়েবলগুলি যুক্ত করেছি, তবে এক্সটেন্ডেডডাফল্টরুলসগুলি ভেঙে ফেলেছি । কীভাবে এটি স্থির করা যায়? আমার আগেও এরকম ত্রুটি ছিল, তবে আমি এখানে আপনার ব্যাখ্যাটি প্রয়োগ করতে পারছি না। আমি যুক্ত হওয়া ScopedTypeVariables কোডটি এটি
স্ট্যাসয়েড

আমি দেখতে পাচ্ছি, কোডগুলি একই ধরণের ডিফল্ট কৌশলগুলি ব্যবহার করে এবং তারা একে অপরের সাথে হস্তক্ষেপ করে। একটি সমাধান হ'ল নতুনটিকে তার চেয়ে আরও বেশি সীমাবদ্ধ শ্রেণি ব্যবহার করতে দেওয়া Num। আমি মনে করি class(Show a,Floating a)=>K a where{k::a->String;k=pure$ show(f pi)where f=id::a->a};এটি সুবিধামত ব্যবহার করে কাজ করা উচিত Floatএবং বিভিন্ন নির্ভুলতার সাথে Doubleপ্রদর্শন করা উচিত pi
আর্জন জোহানসেন

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